虚拟机Linux挂载hgfs共享文件夹,核心就一条命令:vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid=1000,但前提是VMware Tools装好了、共享目录配好了,否则报错no such device会让你怀疑人生。
不管你是Ubuntu还是CentOS,这篇文章把从配置到排错的完整路径捋一遍,照着做就能通。
挂载hgfs前,先确认这两个前提
vmware tools是否安装完整
hgfs是VMware虚拟机和宿主机之间的文件共享协议,靠的是vmware-tools或者开源版的open-vm-tools提供驱动,没装工具,系统里连/dev/hgfs都不存在,挂载命令自然直接失败。
检查方法很简单,在终端输入:
vmhgfs-fuse --version
如果能输出版本号,说明fuse驱动在位,如果提示command not found,分两种情况处理:
- Ubuntu/Debian系:执行
sudo apt install open-vm-tools open-vm-tools-desktop,装完重启虚拟机。 - CentOS/RHEL系:执行
sudo yum install open-vm-tools,同样重启。
这里给一个容易踩的坑:很多教程让你去VMware菜单里点“重新安装VMware Tools”,然后用tar解压、跑perl脚本,这是老黄历了,近年来的发行版仓库里都有open-vm-tools,直接apt或yum装,兼容性反而更好,不用折腾内核模块编译。
共享文件夹是否已在VMware里配置
装了工具还得让VMware知道你要共享哪个目录,操作路径在虚拟机的虚拟机设置里:
- 关机状态下,右键虚拟机标签,选“设置”。
- 切到“选项”选项卡,找到“共享文件夹”。
- 选择“总是启用”,点“添加”按钮。
- 向导里指定宿主机路径和虚拟机内的挂载名,名称建议用英文小写,别带空格。
- 确定后开机。
这个配置很容易被忽略的细节是:添加完共享目录后,建议把虚拟机完全关机再开机,而不是重启,有些版本的VMware在热重启后不会刷新hgfs配置,导致内部看不到共享目录。
手动挂载hgfs共享文件夹:命令与参数详解
查看共享目录是否被识别
先用这条命令确认VMware已经把共享目录交给了虚拟机:
vmware-hgfsclient
如果输出你刚才设置的共享名(比如
share),说明链路通了,如果这条命令报错或没输出,说明上面两个前提没做好,回头查。
标准的挂载命令
hgfs的挂载点习惯上放在/mnt/hgfs,你可以自定义,但建议保持传统。
第一步,创建挂载目录:
sudo mkdir -p /mnt/hgfs
第二步,执行挂载:
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid=$(id -u) -o gid=$(id -g)
拆解一下这条命令的参数:
.host:/:表示宿主机上所有共享的根路径,如果你想只挂载某一个共享目录(比如名字叫share),写成.host:/share。-o allow_other:允许非root用户访问挂载点,不加这个,普通用户打开/mnt/hgfs会报权限拒绝,这是初学者最常遇到的坑。-o uid=$(id -u)和-o gid=$(id -g):把挂载点的属主设为当前用户,不加的话目录属于root,普通用户没写权限。
这一步做完,ls /mnt/hgfs应该能看到你配置的共享文件夹。挂载成功后,共享目录里的文件就和本地文件一样读写了。
Ubuntu挂载共享文件夹的权限细节
Ubuntu桌面版用户挂载后经常遇到“能看到文件夹但打不开”的情况,现象是点击目录提示“不允许的操作”。
问题出在fuse模块的访问控制上,解决方式是在上面的挂载命令里追加-o nonempty和-o umask=0,完整命令如下:
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid=$(id -u) -o gid=$(id -g) -o umask=0
umask=0表示所有用户对该挂载点下的文件拥有全部权限,如果还是不行,检查一下宿主机共享文件夹的安全权限Windows宿主机上右键共享文件夹,确认“共享”选项卡里给到了“Everyone”读取/写入权限,这个很多人会漏掉。
CentOS挂载hgfs的注意事项
CentOS服务器版跟Ubuntu有个显著区别:默认不带fuse工具包,如果执行vmhgfs-fuse提示缺少libfuse,需要先装fuse支持:
sudo yum install fuse fuse-libs
装好后再跑挂载命令就能成功,CentOS上用systemd管理服务是惯例,如果希望开机自动挂载,不建议直接改
/etc/fstab,因为fstab在引导早期执行时网络和vmhgfs驱动未必就绪。
更稳妥的方法是用systemd服务脚本,创建/etc/systemd/system/mnt-hgfs.mount如下:
[Unit] Description=Mount VMware Shared Folders After=network.target [Mount] What=.host:/ Where=/mnt/hgfs Type=fuse.vmhgfs-fuse Options=allow_other,uid=1000,gid=1000,umask=0 [Install] WantedBy=multi-user.target
然后依次执行:
sudo systemctl enable mnt-hgfs.mount sudo systemctl start mnt-hgfs.mount
就能实现开机自动挂载,注意uid=1000和gid=1000要替换成实际用户的ID,查询方法用id <用户名>。
挂载失败排错:no such device和重启失效
no such device报错的原因和应对
这条报错的出现频率最高。当执行挂载命令提示fuse: device not found, try 'modprobe fuse' first或者no such device时,问题几乎都出在虚拟机工具未正确加载。
首选执行:
sudo modprobe fuse
这条命令手动加载fuse内核模块,如果提示modprobe: FATAL: Module fuse not found,说明内核头文件不匹配,常见于手动编译安装VMware Tools的发行版,此时卸载VMware Tools,改用open-vm-tools,重装后问题基本消失。
另一个原因是VMware Tools服务没启动,执行:
systemctl status vmtoolsd
状态不为active的话,用systemctl start vmtoolsd拉起来,再挂载就正常了。
Windows宿主机防火墙挡路
如果你的共享目录在挂载后能读但写入时卡死或者提示I/O错误,且宿主机是Windows,多半是Windows防火墙拦了VMware的hgfs端口。
在Windows防火墙高级设置里,放行VMware Authorization Service和VMware Tools相关进程,或者干脆把VMware的网络类型改为“专用”网络,Intel网卡驱动和VMware共享文件夹也有兼容性问题,已知的表现为大文件传输中断,这种情况更新VMware版本到15.5以上能缓解。
重启后挂载丢失
手动挂载只是临时生效,重启后就没了,这不奇怪,毕竟hgfs挂载默认不写持久化配置。
如果你的系统没有systemd(比如老版CentOS 6),退而求其次,把挂载命令写进
/etc/rc.local,并确保这个文件有可执行权限:
sudo chmod +x /etc/rc.local
然后编辑它,在exit 0前加入挂载命令。
性能优化与使用建议
hgfs的性能不如virtiofs和NFS,这是架构决定的,大文件拷贝时,hgfs的吞吐量受限于fuse的用户态转发机制。
行业共识认为,hgfs适合小文件、日常代码同步和配置文件共享,如果你的需求是编译大型项目或者跑数据库,考虑以下替代方案:
- NFS共享:在宿主机搭建NFS服务,虚拟机内通过NFS客户端挂载,性能比hgfs高约30%-50%,但搭建步骤更繁琐。
- virtiofs:VMware Workstation 15.5及以上版本支持virtiofs,性能接近原生磁盘,但需要虚拟机内额外配置。
不过普通用户场景下,hgfs的便利性无可替代代码写一半,宿主机改了文件,虚拟机里立即能看到,双向实时同步,比手动scp或者U盘拷贝体验好得多。
建议创建共享目录时,把大文件单独建一个共享,用冷备方式处理,别混在代码目录里,hgfs对目录内文件数量有轻微的性能衰减,上万个小文件的目录首次遍历会卡顿。
最后收束核心观点:hgfs挂载并不难,90%的问题出在VMware Tools没装好和挂载参数不对这两个环节,先把vmhgfs-fuse --version的结果确认了,再执行挂载命令,顺序不要颠倒。
常见问题Q&A
挂载hgfs后看不到共享文件夹里新加的文件?
hgfs默认是实时刷新的,但部分场景下fuse缓存导致新文件不可见,卸载后重新挂载可以解决,更优雅的方式是执行ls -f强制刷新目录缓存。
VMware共享文件夹和剪贴板共享有什么区别?
剪贴板共享走的是VMware Tools的拖拽协议,传输量小且不适合大文件;hgfs是文件系统级别的映射,直接支持读写和目录操作,两者互不替代,日常传文件优先用hgfs。
为什么Windows宿主机访问共享文件夹比Linux虚拟机访问更快?
因为hgfs的fuse驱动跑在虚拟机内,所有读写都要经过用户态和内核态的两次拷贝,宿主机访问不存在这层转换,所以速度差异明显,这不是配置问题,是架构设计使然。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/628287.html





