问题描述
在参考 《奔跑吧linux内核实验指导手册》学习使用 qemu 跑 arm linux 内核时,需要用到 9p 共享文件系统的功能。
首先在网上进行了搜索,发现要使用这个功能需要在内核配置中进行配置,不过这里我使用的 vexpress_defconfig
已经启用了这个功能。
在 config 文件中相关的配置内容如下:
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
# CONFIG_NET_9P_DEBUG is not set
CONFIG_9P_FS=y
# CONFIG_9P_FS_POSIX_ACL is not set
# CONFIG_9P_FS_SECURITY is not set
编译内核,完成后执行如下命令配置 9p 共享文件系统。
qemu-system-arm -M vexpress-a9 -smp 4 -m 200M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 log level=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -fsdev local,security_model=passthrough,id=fsdev0,path=/tmp/share -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare
上面的命令是按照网上的教程添加的,具体信息可以访问 9p virtio 。
执行之后报了如下错误:
qemu-system-arm: -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare: No ‘PCI’ bus found for device ‘virtio-9p-pci’
使用报错信息在网上进行搜索,没有发现解决方案。
我的尝试
根据报错信息,这个问题与 qemu-system-arm 中指定的 device 参数有关。我对这个参数的作用不太清楚,就执行了如下命令以了解这个参数的作用。
qemu-system-arm -M vexpress-a9 -device help
帮助中按照不同的设备类别打印出了设备名字、总线的类别、简要的描述信息,与 virtio-9p-pci 相关的内容如下:
Storage devices:
name “virtio-9p-device”, bus virtio-bus
name “virtio-9p-pci”, bus PCI, alias “virtio-9p”
报错信息中打印的 virtio-9p-pci 是挂在 PCI 总线上的一个存储设备的名称,报错信息表明找不到这个总线意味着我们不能指定这个设备。
我首先使用 virtio-9p 替换命令行中的 virtio-9p-pci,重试发现会报同样的错误。然后我使用 virtio-9p-device 这个设备,这次命令成功执行。
虚拟机启动完成后,我按照网上的说明在虚拟机的终端中执行了如下命令:
mkdir /tmp/host_files
mount -t 9p -o trans=virtio,version=9p2000.L hostshare /tmp/host_files
在主机的 /tmp/share 目录中创建文件,然后在虚拟机中查看,能够看到文件,文件的内容也与创建的文件相同,我确定这项功能能够正常使用了。
最后贴上修改后完整的命令行:
qemu-system-arm -M vexpress-a9 -smp 4 -m 200M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 log level=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -fsdev local,security_model=passthrough,id=fsdev0,path=/tmp/share -device virtio-9p-device,id=fs0,fsdev=fsdev0,mount_tag=hostshare