QEMU ARM 环境下 9P 文件夹共享配置指南

QEMU ARM 环境下 9P 文件夹共享配置指南

本文档适用于使用 qemu-system-arm 模拟 vexpress-a9 开发板,且宿主机需要向虚拟机传输驱动 .ko 或测试程序的情景。

1. 宿主机 QEMU 启动参数

由于 vexpress-a9 不支持 PCI 总线,必须使用基于 MMIO 的 virtio-9p-device

完整启动命令

qemu-system-arm \
    -M vexpress-a9 \
    -m 128M \
    -kernel linux-5.10/arch/arm/boot/zImage \
    -dtb linux-5.10/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
    -drive file=rootfs.ext2,if=sd,format=raw \
    -append "root=/dev/mmcblk0 rw console=ttyAMA0" \
    -net nic -net user \
    -nographic \
    -fsdev local,path=./share,security_model=passthrough,id=fsdev0 \
    -device virtio-9p-device,fsdev=fsdev0,mount_tag=hostshare
  • path=./share: 宿主机上的文件夹路径。
  • id=fsdev0: 后端存储的唯一标识符。
  • mount_tag=hostshare: 虚拟机内部挂载时使用的“设备名”。

2. 内核编译选项 (zImage 配置)

如果执行 mount 时提示 Unknown filesystem type '9p',请在内核源码目录执行 make menuconfig 开启以下支持:

配置路径 选项名称 宏定义
Networking support Plan 9 resource sharing support CONFIG_NET_9P=y
Networking support 9P Virtio transport CONFIG_NET_9P_VIRTIO=y
Device Drivers Platform bus driver for virtio devices CONFIG_VIRTIO_MMIO=y
File systems Plan 9 Resource Sharing Support CONFIG_9P_FS=y

3. 虚拟机内部挂载步骤

进入系统后,执行以下命令完成挂载:

# 1. 创建挂载点
mkdir -p /mnt/share

# 2. 挂载共享目录 (hostshare 必须对应启动参数里的 mount_tag)
mount -t 9p -o trans=virtio hostshare /mnt/share

# 3. 验证
ls -l /mnt/share

4. 交叉编译建议

在宿主机的 ./share 目录下编译驱动和程序,以便在虚拟机中直接运行。

编译驱动 (.ko)

Makefile 中指定交叉编译器和内核路径:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERNEL_DIR) M=$(PWD) modules

编译测试程序 (C语言)

建议使用 静态链接,防止虚拟机系统缺少动态库:

arm-linux-gnueabihf-gcc test.c -o mem_test --static

5. 常见问题排查

  1. Invalid parameter 'mount_tag': 说明你把 mount_tag 写在了 -fsdev 里,它应该写在 -device 里。
  2. No 'PCI' bus found: 说明使用了 virtio-9p-pci,在 ARM 开发板上请改用 virtio-9p-device
  3. 权限不足: 若无法写入,请检查宿主机目录权限,或在 QEMU 参数中尝试 security_model=mapped
posted @ 2026-03-20 15:37  Greg_LYU  阅读(0)  评论(0)    收藏  举报