Ubuntu 18.04下Vagrant与Docker无法挂载文件问题求助
从你描述的情况来看,不管是Vagrant还是Docker的挂载问题,核心都和权限匹配、内核模块/依赖缺失有关。先重点解决Vagrant的问题:
一、Vagrant挂载失败(vboxsf No such device)的根因
你的错误日志明确指出/sbin/mount.vboxsf: mounting failed with the error: No such device,这说明虚拟机内的vboxsf内核模块没有正常加载。结合你第二次运行脚本的警告信息,问题出在:
系统缺少匹配当前内核版本的头文件,导致Guest Additions无法编译对应的内核模块
分步解决办法:
在虚拟机内安装内核头文件和编译工具
进入虚拟机(如果能通过vagrant ssh连接的话),执行以下命令:sudo apt update # 自动安装匹配当前内核的头文件、编译依赖 sudo apt install -y linux-headers-$(uname -r) build-essential dkms如果无法直接连接虚拟机,可以在Vagrantfile里添加
provision脚本,让虚拟机启动时自动安装:host.vm.provision "shell", inline: <<-SHELL apt update apt install -y linux-headers-$(uname -r) build-essential dkms SHELL用Vagrant插件自动管理Guest Additions版本
手动安装Guest Additions很容易出现Host和Guest版本不匹配的问题,推荐安装vagrant-vbguest插件来自动同步:# 在你的Ubuntu宿主机上执行 vagrant plugin install vagrant-vbguest安装后,下次执行
vagrant up时,插件会自动检测并安装与Host端VirtualBox版本匹配的Guest Additions,同时自动编译vboxsf模块。验证模块加载情况
虚拟机启动后,执行以下命令检查vboxsf是否加载:lsmod | grep vboxsf如果有输出说明模块正常;如果没有,手动加载:
sudo modprobe vboxsf优化Vagrant同步配置
你的同步配置可以加上权限参数,确保挂载后的文件权限和你的用户一致:host.vm.synced_folder "salt/", "/srv/salt", owner: "vagrant", group: "vagrant", mount_options: ["uid=1000", "gid=1000"] host.vm.synced_folder "pillar/", "/srv/pillar", owner: "vagrant", group: "vagrant", mount_options: ["uid=1000", "gid=1000"]
二、关于Docker挂载权限问题
虽然你提到这是另一个独立问题,但可以给你几个排查方向:
- 检查宿主机挂载目录的权限:确保目录的UID/GID和容器内运行用户的UID/GID一致(比如容器用root的话,宿主机目录至少要有读权限)
- 检查Ubuntu默认的AppArmor限制:可以临时关闭AppArmor测试是否是它导致的:
sudo systemctl stop apparmor - 挂载时显式指定权限参数:比如
docker run -v /host/path:/container/path:rw,确保读写权限正确
内容的提问来源于stack exchange,提问作者Petrus K.

