PVE使用9p挂载,让虚拟机共享宿主机目录

9p可以共享宿主机目录,并且是可以不依赖网络的,即使没有网卡都可以。

https://www.right.com.cn/forum/thread-8302447-1-1.html

环境PVE 8.1.3(x86_64),8.1.7(arm64)均测试成功,无需编译更换内核了!
虚拟机可以用,LXC不行,LXC可以用 lxc.mount.entry的方法,参考我的这篇文章,PVE使用lxc.mount.entry,让LXC容器共享宿主机目录

第1步,虚拟机关机,修改虚拟机配置文件

将虚拟机关机

在PVE宿主机上,编辑虚拟机配置文件,配置文件位置是 /etc/pve/nodes/armbian/qemu-server/12011.conf,其中12011是我的虚拟机ID,改成你的

使用nano vi等文本编辑工具编辑该文件,在文件开始位置加入以下代码,保存并退出。

args: -virtfs local,path=/srv/mergerfs/mergerfs1,mount_tag=mergerfs1,security_model=passthrough,id=fs0
  • /srv/mergerfs/mergerfs1 是PVE宿主机上要共享的目录
  • mergerfs1 是在虚拟机中挂载的标识符,直译是挂载标签
  • 以上改成你自己的

image-20240511193515401

第2步,虚拟机开机,创建挂载点目录,编辑/etc/fstab自动挂载

将虚拟机开机

在虚拟机内,创建挂载目录,访问这个路径就能访问到PVE共享的目录,改成你的

mkdir /mnt/mergerfs1

使用nano vi等文本编辑工具编辑 /etc/fstab文件,添加以下代码,保存并退出。

mergerfs1 /mnt/mergerfs1 9p nofail,trans=virtio,version=9p2000.L,rw,share,nobootwait,posixacl,msize=104857600 0 0
  • mergerfs1,对应PVE虚拟机配置文件中的mount_tag标识符
  • /mnt/mergerfs1,是刚才创建的挂载点目录
  • nofail,添加该参数可以防止挂载失败系统卡引导,无法进入系统的情况发生

更改了 /etc/fstab需要刷新一下服务才行,然后尝试挂载

systemctl daemon-reload #刷新系统服务
mount -a #尝试挂载

df -h #查看挂载信息
ls -lah /mnt/mergerfs1 #查看共享过来的文件目录

#如需取消挂载,必须保证没有占用着该目录,比如当前就在该目录是无法取消挂载的
#umount /mnt/mergerfs1

第3步,尝试重启虚拟机,看开机自动挂载是否成功

自行重启查看

一些其他的唠叨:

  • NFS/SMB依赖IP,如果外部IP变更(如更换路由器等),会导致挂载失效。解决办法是,创建个vmbr99纯内部的网桥,多添加一个来自vmbr99的虚拟网卡给虚拟机,挂载均使用vmbr99的纯内部网桥来挂载,以此避免外部IP变化导致IP变化从而挂载失效。
  • NFS似乎有BUG,NFS服务端离线后,NFS客户端会卡住,不会自动尝试重连,即使NFS服务端恢复上线,NFS客户端依然无法访问之前挂载的目录,必须 mount -a等方法重新挂载才能访问