是否可以使用从主机共享给来宾的文件夹通过 virtfs/9p作为来宾内的根文件系统?
与我之前的问题松散相关:virtfs/9p 可以用于与多个来宾共享同一主机文件夹吗?
答案1
是的,请参阅如何使用主机的 FS 启动虚拟机:
将 9p 模块添加到主机initramfs
(这是最简单的方法,尽管不是最干净的,因为它具有包含所需模块的 initrd):
printf '%s\n' 9p 9pnet 9pnet_virtio | sudo tee -a /etc/initramfs-tools/modules
sudo update-initramfs -u
qemu -kernel "/boot/vmlinuz-$(uname -r)" \
-initrd "/boot/initrd.img-$(uname -r)" \
-fsdev local,id=r,path=/,security_model=none \
-device virtio-9p-pci,fsdev=r,mount_tag=r \
-nographic \
-append 'root=r ro rootfstype=9p rootflags=trans=virtio console=ttyS0 init=/bin/sh'
如果您以普通用户身份运行它,有些文件将无法访问,但您应该能够获得 shell 提示符,并且不会造成任何损害:
[ 0.000000] Linux version 3.10-3-amd64 ([email protected]) (gcc version 4.7.3 (Debian 4.7.3-7) ) #1 SMP Debian 3.10.11-1 (2013-09-10)
[ 0.000000] Command line: root=r rootfstype=9p rootflags=trans=virtio console=ttyS0 init=/bin/sh
[...]
Loading, please wait...
[ 0.564122] systemd-udevd[52]: starting version 204
[...]
Begin: Loading essential drivers ... [ 1.007951] FS-Cache: Loaded
[ 1.009958] 9p: Installing v9fs 9p2000 file system support
[ 1.012880] FS-Cache: Netfs '9p' registered for caching
done.
Begin: Running /scripts/init-premount ... done.
[...]
sh-4.2# ls /
bin home lib32 media opt safe tmp vmlinuz.old
boot initrd.img lib64 mnt proc sbin usr
dev initrd.img.old libx32 old root srv var
etc lib lost+found old-tmp run sys vmlinuz
sh-4.2# poweroff -f
[ 56.958724] ACPI: Preparing to enter system sleep state S5
[ 56.960332] Power down.
答案2
尽管这个想法乍一看似乎很明智,但不要这样做。当前状态下的 9P 无法处理一些相当基本的操作,包括:
9P目前还没有处于适合生产使用的状态。
虽然您可以使用 9P 作为根文件系统创建一个可启动系统,但操作该虚拟机将导致严重的后果 - 如果使用 Debian,上面列出的缺陷将阻止 apt-get 升级工作。解决这个问题的补丁多年来一直没有任何进展。
如果你坚持这样做,rootflags 应该是“rootflags=trans=virtio,cache=mmap”,否则读/写内存映射将不起作用(例如,MariaDB 使用)。
答案3
是的,当然。添加到内核命令行:
root=host rootfstype=9p rootflags=trans=virtio
并且您可以在没有 initrd 的情况下启动(如果 9P 被编译到内核中,而不是作为模块)。