解决 vagrant + virturalbox + docker-ce 共享文件夹挂载不稳定问题
使用 vagrant + virturalbox + docker-ce
这套组合搭建的开发环境,但开发过程中会发现,过一段时间站点就无法访问。
怀疑过一切,包括是不是 IDE 读写代码到内存,导致共享文件夹不稳定。测试关闭 IDE,然后什么都不做,几分钟,十几分种这个问题就复现了。
前面都在确定问题,到了差不多一个月,终于确定了特征情况。站点无法访问只是表象,实际是虚拟机和容器对于站点目录 /var/lib/xxx
都无法访问,本地倒是正常。情况这么一串联,明眼人都能意识到是共享文件夹出问题了。
描述给 deepseek,好家伙,给了我好几个答案,惊喜~
使用 mount 和 umount 定时切换挂载状态 (推荐)
创建自动化脚本 /usr/local/bin/fix_nfs.sh
:
#!/bin/bash
UMOUNT_CMD="sudo umount -fl /var/lib/xx"
MOUNT_CMD="sudo mount -t nfs -o vers=3,rsize=65536,wsize=65536,hard,intr,timeo=300 192.168.33.1:/Users/jasonli/Code/xx /var/lib/xx"
$UMOUNT_CMD 2>/dev/null
sleep 1
$MOUNT_CMD
然后添加定时监控(每5分钟检查):
(crontab -l 2>/dev/null; echo "*/5 * * * * /usr/local/bin/fix_nfs.sh") | crontab -
测试有两个问题,一个是权限,当前的用户为 xx ,需要 sudo 提权;另一个是 5 分钟可能也太久了,换成 1 分钟可能差不多。
更换性能更好的驱动 Virtio-FS
config.vm.synced_folder "./xx", "/var/lib/xx",
type: "virtiofs",
owner: "www-data", # 指定虚拟机内所有者
group: "www-data" # 指定组
重载 Vagrantfile 结果报错,提示没有找到个驱动类型,需要安装
vagrant plugin install vagrant-virtiofs
测试安装最后,失败了,提示要重新安装 vagrant 等内容。并且 vagrant up 启动还报错,删都删不掉。但通过 virturalbox 无界面启动,绕过了这个问题。
优化 nfs 参数
config.vm.synced_folder "./xx", "/var/lib/xx",
type: "nfs",
nfs_udp: false, # 强制TCP协议
nfs_version: 3, # 明确版本
mount_options: [ # 关键参数优化
"rw",
"noatime",
"nodiratime",
"actimeo=2", # 属性缓存2秒
"rsize=32768", # 降低读写块大小
"wsize=32768",
"hard",
"intr",
"timeo=50" # 5秒超时(单位0.1秒)
]
总结
主要测试了一、二两种方法,如果是一开始的时候,我会毫不犹豫地选择干掉当前的环境,重新安装。但现在已经装好的了的开发环境舍弃掉,有点不舍得。
第一种方式开着有点投机取巧,也不高端,也没有从根本上解决问题。但,它管用~