Add support for sharing host directories into the VM via QEMU 9p (virtio-9p). The --mount flag can be repeated; each host directory appears at the same absolute path inside the VM. Design: - QEMU: each --mount gets a short 9p tag (slim0, slim1, …) via -virtfs local,path=…,mount_tag=slimN,security_model=mapped-xattr. Tags are kept short because 9p mount_tag has a ~31-byte limit. - Kernel cmdline: the full destination path is passed as slim.mount=<tag>:<base64(path)> so the init script knows where to mount each tag. Base64 avoids issues with spaces/special chars. - slim-init.sh: after networking, parse slim.mount= entries, mkdir -p the destination, and mount -t 9p <tag> <dest> -o trans=virtio,version=9p2000.L Tests verify: 9p share detection via sysfs mount_tag, 9p entry in mount output, file content accessible at the expected path, and clean VM exit.
This commit is contained in:
@@ -103,6 +103,55 @@ EOF
|
||||
rm -rf "$work"
|
||||
}
|
||||
|
||||
test_mount() {
|
||||
echo "=== Testing --mount (9p shares) ==="
|
||||
|
||||
work="$(mktemp -d)"
|
||||
img="slim-test-mount"
|
||||
share_dir="$work/share"
|
||||
|
||||
mkdir -p "$share_dir"
|
||||
echo "hello from host" > "$share_dir/testfile.txt"
|
||||
|
||||
cat > "$work/Containerfile" <<'EOF'
|
||||
FROM alpine:latest
|
||||
CMD ["/bin/sh", "-c", "poweroff -f"]
|
||||
EOF
|
||||
|
||||
echo "-- Building container image..."
|
||||
if ! podman build --network=none -t "$img" -f "$work/Containerfile" >/dev/null 2>&1; then
|
||||
report fail "--mount (podman build failed)"
|
||||
rm -rf "$work"
|
||||
return
|
||||
fi
|
||||
|
||||
echo "-- Building slim VM..."
|
||||
if ! "$SLIM_BIN" build qcow2 "$img" >/dev/null 2>&1; then
|
||||
report fail "--mount (slim build failed)"
|
||||
cleanup "$img" "$img"
|
||||
rm -rf "$work"
|
||||
return
|
||||
fi
|
||||
|
||||
# The 9p share appears at the same path inside the VM as on the host.
|
||||
# Use --cmd to run the verification snippet with the canonical path.
|
||||
share_canon=$(readlink -f "$share_dir")
|
||||
|
||||
echo "-- Booting VM with --mount $share_dir ..."
|
||||
output=$(timeout "$TIMEOUT" "$SLIM_BIN" run "$img" \
|
||||
--mount "$share_dir" \
|
||||
--cmd "echo Available 9p shares:; for f in /sys/bus/virtio/drivers/9pnet_virtio/virtio*/mount_tag; do [ -f \"\$f\" ] && echo \"\$f: \$(tr -d '\\0' < \"\$f\")\"; done; echo Mounts:; mount -v; cat \"${share_canon}/testfile.txt\" 2>/dev/null || echo NO_FILE; echo MOUNT_VERIFY_DONE; poweroff -f" \
|
||||
2>&1 || true)
|
||||
|
||||
check_output "$output" "mount_tag: slim0" "--mount 9p share detected"
|
||||
check_output "$output" "type 9p" "--mount 9p filesystem in mount list"
|
||||
check_output "$output" "hello from host" "--mount file accessible in VM"
|
||||
check_output "$output" "MOUNT_VERIFY_DONE" "--mount VM ran to completion"
|
||||
|
||||
cleanup "$img" "$img"
|
||||
rm -rf "$work"
|
||||
}
|
||||
|
||||
test_service() {
|
||||
echo "=== Testing nextcloud service ==="
|
||||
|
||||
@@ -171,6 +220,8 @@ cargo build 2>&1
|
||||
test_distro "alpine" "alpine:latest" ""
|
||||
test_distro "archlinux" "archlinux:latest" "RUN pacman -Sy --noconfirm iproute2 wget; pacman -Sc --noconfirm"
|
||||
|
||||
test_mount
|
||||
|
||||
test_service
|
||||
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user