VMware共享文件夹配置与排查指南:解决/mnt/hgfs失效与权限问题
最近在好几个技术群里都看到有人在问 VMware 里共享文件夹的问题大部分问题其实非常集中装了 VMware Tools 还是看不到/mnt/hgfs、Windows 访问 Ubuntu 共享目录提示拒绝访问、重启虚拟机之后共享配置失效。这些坑我基本都踩过一遍网上答案又散这篇就把 vm 共享文件夹从原理、配置到排查一次讲透你照着做基本能一次跑通。先交代一下适用场景宿主机是 Windows虚拟机里跑的是 Windows 或 Ubuntu目标是让虚拟机和宿主机的文件直接互通不用 U 盘来回拷。本文默认你用的是 VMware Workstation Pro版本 16/17 均可VMware Player 的操作路径也基本一致。如果你是 VirtualBox 用户部分菜单名称不同但思路可以平移后面我会专门提一下两家的差异。1. 共享文件夹的底层逻辑与三种方案怎么选1.1 共享文件夹到底是个什么机制VMware 的共享文件夹功能本质上是通过 VMware Tools 里的一个文件系统驱动在虚拟机内部虚拟出一个特殊文件系统在 Linux 里叫hgfs在 Windows 里叫VMware Shared Folders。这个文件系统不经过网络协议栈而是直接通过虚拟设备和宿主机内核里的模块通信所以它的读写性能和稳定性都远好于走网络共享。明白了这层原理你就能理解为什么很多时候查了三天网络配置没问题共享文件夹还是不能用——因为 VMware 共享文件夹根本不走网络它走的是虚拟设备通道。你把虚拟机的网络适配器禁用掉共享文件夹照样能用。这一点和 Samba、NFS 有本质区别。也正因为如此共享文件夹的典型场景是宿主机和虚拟机之间交换代码、配置文件、安装包这类中小型文件。它不太适合做数据库数据文件的存放位置也不太适合做大量小文件比如 node_modules的实时同步——后者挂载后访问速度会明显下降后面我会专门说这个问题。1.2 三种文件互通方案的对比我这些年帮人排查共享文件夹问题时发现很多人其实不知道自己还有别的选择。这里把三种常见方案列出来方便你根据实际情况做取舍。方案原理优点缺点适用场景VMware 共享文件夹虚拟设备文件系统直通配置简单、不占 IP、快照一致性好宿主机重启后需重新挂载Linux 下大文件性能一般日常代码/文档交换拖拽复制VMware Tools 的剪贴板扩展零配置、最直观大文件容易失败不能做持续同步偶尔拷个文件Samba/NFS 网络共享走虚拟机网络协议栈多设备都能访问、性能可控需要配 IP、服务、防火墙虚拟机当服务器给局域网提供共享我的一个经验是日常开发调试共享文件夹是最省事的如果想从虚拟机里访问宿主机上的大目录比如几百 GB 的素材库更建议在 VM 里配 Samba 指向宿主机共享。因为共享文件夹的每次 IO 都要经过宿主机内核态的vmhgfs-fuse转发跑大量随机读写时会比 Samba 直连慢至少一个量级。1.3 三个模式选项只读、读写、启用此共享在 VMware 的设置界面里添加共享文件夹时你会看到三个核心选项很多人不重视这三个选项的差异结果出了问题找半天。只读虚拟机里只能读宿主机文件不能写。适合给虚拟机分发工具链、素材包防止误删。读写双向都可写日常开发几乎必选。启用此共享这个选项控制的是该共享在当前虚拟机电源状态下是否生效。如果你暂时不想用某个共享取消勾选即可不用删掉配置。再往下的在下次挂载前自动挂载Linux 客户机里对应选项建议勾选。不勾的话Linux 虚拟机每次开机都要手动执行挂载命令非常烦人。提示那个vmhgfs-fuse的挂载过程有个隐藏坑——如果宿主机上共享文件夹的路径包含中文字符或空格部分旧版本 VMware Tools 挂载时会直接失败或者生成乱码路径。尽量把共享目录的路径改成纯英文、无空格例如D:\share\vm_data。2. 从零开始配置Windows 虚拟机与 Ubuntu 虚拟机的完整步骤2.1 Windows 客户机里配置共享文件夹先说 Windows 客户机比如 VMware 里装 Win10/Win11。步骤比 Linux 简单因为 VMware Tools 装好后共享文件夹会以一个特殊网络路径的形式出现在资源管理器里不需要自己挂载。先在宿主机上新建一个目录作为共享根目录比如D:\vm_share里面放你打算和虚拟机交换的文件。确保虚拟机已安装 VMware Tools。没装的话在 VMware 菜单栏点虚拟机 - 安装 VMware Tools然后在虚拟机里运行安装程序装完重启。打开虚拟机设置 - 选项 - 共享文件夹选择总是启用。点击添加按向导填写共享名称建议用英文比如code和宿主机路径刚才创建的D:\vm_share。确认勾选启用此共享权限选择读写。到 Windows 虚拟机里按WinR输入\\vmware-host\Shared Folders回车就能看到你添加的共享或者直接在此电脑里右键映射网络驱动器把\\vmware-host\Shared Folders\code映射成一个盘符比如 Z 盘。这里有个细节值得注意Windows 客户机访问共享文件夹走的是一个虚拟网络重定向器vmci虚拟设备所以你在虚拟机里看到的路径是\\vmware-host\Shared Folders\...并不是常规的\\192.168.x.x\...形式。如果你发现访问的是局域网里别的 Windows 机器共享那说明你其实是在走 SMB 网络共享不是 VMware 的共享文件夹。实测下来Windows 客户机基本不会出现挂载失败的问题唯一的坑是安装 VMware Tools 时选了精简安装而漏掉了共享文件夹驱动。如果你试了映射网络驱动器一直报找不到网络路径把 VMware Tools 卸载重装一遍选择完全安装即可。2.2 Ubuntu 客户机里配置共享文件夹Ubuntu 客户机的流程要稍微多一点因为新版 Ubuntu 默认不开hgfs的内核模块挂载用的是用户态的open-vm-tools。第一步先在 Ubuntu 虚拟机里安装 open-vm-tools 和桌面扩展sudo apt update sudo apt install open-vm-tools open-vm-tools-desktop -yopen-vm-tools-desktop这个包负责剪贴板共享和拖拽功能如果只装open-vm-tools你会发现拖拽文件失效。别问怎么知道的问就是当年为了省这一个小包折腾了大半天。第二步回到 VMware 菜单添加共享文件夹步骤和 Windows 客户机一样路径同样建议英文、无空格。第三步在 Ubuntu 里手动挂载验证。新版 open-vm-tools 一般会自动挂载到/mnt/hgfs但有时候因为桌面环境启动时序问题你登录后发现/mnt/hgfs是空的或者根本不存在。这时候手动挂载sudo mkdir -p /mnt/hgfs sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid1000解释一下参数.host:/表示挂载宿主机上所有共享根目录下的项目allow_other允许非 root 用户访问uid1000把挂载点的 owner 指定为你的普通用户默认 Ubuntu 第一个用户是 1000。如果vmhgfs-fuse不存在说明 open-vm-tools 没装完整重装一遍。第四步验证。ls /mnt/hgfs应该能看到你在 VMware 里添加的共享名称再往里就是宿主机对应目录里的文件。到这里手动挂载流程就完成了。2.3 开机自动挂载的最佳实践手动挂载解决了当前会话的问题但重启虚拟机后/mnt/hgfs又会消失。网上很多人让你往/etc/fstab里加一行我实测下来这个方案在 Ubuntu 22.04/24.04 上经常翻车原因在于 fstab 挂载时机比 systemd 服务启动早vmhgfs-fuse依赖的虚拟机设备可能还没就绪于是开机直接进 emergency mode。更稳的做法是用 systemd 创建一个 unit确保网络和虚拟设备都起来后再挂载sudo tee /etc/systemd/system/vmhgfs-mount.service /dev/null EOF [Unit] DescriptionMount VMware shared folders Afternetwork.target [Service] Typeoneshot RemainAfterExityes ExecStart/usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid1000 ExecStop/usr/bin/fusermount -u /mnt/hgfs [Install] WantedBymulti-user.target EOF sudo systemctl daemon-reload sudo systemctl enable --now vmhgfs-mount.service之后每次启动虚拟机/mnt/hgfs都会自动挂载。手动挂载出错时先fusermount -u /mnt/hgfs卸载再重新执行挂载命令多试几次。3. 访问失败与权限异常的排查路线图3.1 Linux 客户机里看不到共享文件夹的五个原因Linux 下共享文件夹挂了最常见的原因按概率排第一open-vm-tools 没装完整。这个包是 Ubuntu 默认 VMware 虚拟机的推荐安装项但如果你最初创建虚拟机时选择了稍后安装操作系统系统里可能没有预装。排查方法是vmware-toolbox-cmd -v能输出版本号说明 Tools 正常如果命令不存在直接重装。第二共享文件夹添加后没有总是启用。很多人添加完共享后没有回到共享文件夹主页面看顶部的状态栏结果选成了禁用等于白忙活。检查方法很简单进虚拟机设置 - 选项 - 共享文件夹确认上面是总是启用而不是已禁用。第三内核模块或 fuse 驱动未加载。执行lsmod | grep vmhgfs如果为空执行sudo modprobe vmhgfs手动加载。旧版内核和新内核之间偶尔会有模块适配延迟遇到这种直接更新内核和 open-vm-tools。第四宿主机目录路径不存在或没有权限。VMware 在配置共享时不会校验宿主机路径是否存在直接保存。如果路径填错了虚拟机里挂载时只会提示Host path not found。回到宿主机看一眼路径或者重新选一次目录。第五挂载点被占用。如果/mnt/hgfs已经存在且非空挂载命令会失败。执行sudo rmdir /mnt/hgfs之前先确认里面没有重要文件删掉空目录再挂载。3.2 Windows 客户机访问提示拒绝访问 / 0x80070035 / 0x80004005Windows 客户机访问自己的共享文件夹一般不会出问题但如果你按网上教程去访问宿主机的网络共享SMB就会碰到经典错误码。这里的核心问题是你访问的对象不对。0x80070035找不到网络路径通常是宿主机防火墙拦了 SMB 端口或者网络发现没打开。但如果你访问的是\\vmware-host\Shared Folders仍然报这个错则说明 VMware Tools 的共享支持驱动没起来重装 Tools。0x80004005未指定的错误大概率是共享文件夹里的文件名或目录层级触发了 Windows 客户机的路径解析问题试试点开共享根目录、直接访问某个子目录或者把宿主机共享路径改短、改成纯英文。提示拒绝访问看共享文件夹的 NTFS 权限和共享权限。右键宿主机共享目录 - 属性 - 共享选项卡确认 Everyone 有读取权限安全选项卡里确认你的账户有读取执行权限。我还试过一种情况客户端 Windows 版本是 Win11 的 SMB1 兼容性问题。VMware 的\\vmware-host不依赖 SMB1所以基本排除这个因素。真正要小心的是部分网络教程会让你开启 SMB1.0/CIFS 文件共享支持这个功能有安全风险能用 VMware 自带共享方案就别去开系统级 SMB1。3.3 宿主机和虚拟机之间的网络共享误区有些场景下你要的不是从虚拟机里看宿主机文件而是从宿主机访问虚拟机里的文件。这个方向反过来的需求其实也很常见比如把虚拟机当作开发服务器想从浏览器或宿主机直接读写 VM 里的项目文件。遇到这个需求请不要继续纠结 VMware 共享文件夹因为它的设计是单向的宿主机是服务端虚拟机是客户端。反过来的正确姿势是在 Ubuntu 里装 Samba 服务把某个目录共享出来宿主机用\\虚拟机IP\share访问sudo apt install samba -y sudo mkdir /home/yourname/share sudo chmod 777 /home/yourname/share然后编辑/etc/samba/smb.conf在最底部加上[share] path /home/yourname/share browseable yes read only no create mask 0777 directory mask 0777重启服务sudo systemctl restart smbd再用smbpasswd -a yourname设置 Samba 密码。宿主机资源管理器输入\\虚拟机IP\share就能访问。这个方向上的常见错误是 Ubuntu 防火墙ufw拦了 445 端口、或者 Samba 配置没有设置guest ok yes却想免密访问。4. 常见问题速查表与平时代码维护的坑4.1 问题速查表我把日常遇到最多的问题整理成一张表可以直接对着查。现象原因解决动作Linux 下/mnt/hgfs不存在open-vm-tools 未装sudo apt install open-vm-tools open-vm-tools-desktop手动挂载报Host path not found宿主机路径填错回到 VMware 设置重新选择目录Win 客户机访问\\vmware-host报找不到路径VMware Tools 共享驱动异常卸载重装 Tools选择完全安装Win 客户机访问宿主机 SMB 共享报 0x80070035防火墙/网络发现检查宿主机防火墙入站规则 445 端口Ubuntu 重启后共享丢失没有做开机自动挂载用 systemd unit 挂载挂载后无写权限fuse 挂载参数缺allow_other挂载命令加-o allow_other -o uid1000往共享里拷大文件卡死vmhgfs-fuse 传输效率瓶颈改用 Samba 或者压缩成单文件复制虚拟机快照恢复后共享丢失快照回滚了挂载状态手动重新挂载或触发 systemd 服务4.2 不要把共享文件夹当成普通磁盘用这一点必须单独拿出来说。很多读者看共享文件夹方便就直接把编译缓存、数据库文件整个塞进去结果发现每次运行都卡顿、甚至数据损坏。我记得有次帮一个朋友排查他的 Python 项目跑在 Ubuntu VM 里代码放/mnt/hgfs/code然后每次pip install的缓存目录也指到了共享目录结果安装一个中型包要 10 分钟。排查下来问题就是 vmhgfs-fuse 在大量小文件随机写入时性能极差——这是用户态文件系统天生的问题不是配置能解决的。我的建议是代码源文件放共享目录没问题但编译缓存、依赖包、数据库数据文件一律放在虚拟机本地磁盘。具体可以设置pip config set global.cache-dir /home/yourname/.cache/pip把 pip 缓存指回本地MySQL/PostgreSQL 的数据目录不要放在共享目录上只在需要导入导出时才用共享目录临时中转。4.3 快照与共享文件夹的兼容性VMware 快照在共享文件夹挂载状态下创建、恢复大部分情况下没问题但有一个注意点如果快照恢复时宿主机目录被删了或者路径变了虚拟机里的挂载点会变成失效状态但不会自动报错。表现是ls命令卡住或返回空目录。遇到这种情况先确认宿主机目录是否还在然后强制卸载并重新挂载sudo fusermount -u /mnt/hgfs sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid1000另外如果你在快照时正好有文件正在写入共享目录快照恢复后该文件可能停留在写入前的状态。所以重要文件的保存动作别拖——这个是虚拟化层快照的共性问题不只是共享目录特有。4.4 Windows 客户机映射网络驱动器后看不到更新Windows 客户机通过映射网络驱动器访问共享文件夹时偶尔会出现宿主机新增文件但客户机不刷新的情况。这是因为网络驱动器默认开启了缓存和脱机文件功能。在资源管理器里右键映射好的盘符 - 属性 - 脱机文件改成始终脱机可用之外的选项或者干脆关掉脱机文件功能。实测下来关闭脱机文件后宿主机的更新能实时反映到客户机。另外映射盘符后如果你发现文件看起来还在但打不开多半是宿主机上目录里的文件正被某个进程占用比如被杀毒软件扫描锁定。注意别在共享目录里长期运行编辑器的自动保存进程容易互相锁文件。5. 一条命令起共享Python 一行指令方案与适用边界前面讲的都是 VMware 官方共享文件夹配置。如果有人单纯想在局域网内快速分享一个文件夹给别人不想动虚拟机配置可以试试 Python 一条命令起 HTTP 服务。python3 -m http.server 8000 --bind 0.0.0.0 --directory /path/to/share这会启动一个最简单的 HTTP 文件服务器浏览器访问http://宿主机IP:8000就能浏览和下载目录里的文件。如果需要上传功能、或者想更安全一点python3 -m http.server就不够用了可以上caddy file-server或者nginx的 autoindex 模块。这个方案和 VMware 共享文件夹的区别很明确HTTP 服务是单向下载为主适合临时公开展示文件不适合作为开发时的双向读写目录。它更多是应急手段不能替代 vmhgfs。6. 实战总结与个人经验补充再说几个从实际使用中沉淀下来的细节网上教程很少提。第一Vmware 共享文件夹在 Windows 客户机上的支持度远好于 Linux 客户机。如果你只是偶尔从宿主机拷点文件进 Windows 虚拟机建议直接拖拽不用特意配共享但如果你需要持续同步开发目录Windows/Linux 虚拟机都建议上共享文件夹。第二宿主机是 macOS 时vmhgfs-fuse 的挂载性能和稳定性和 Windows 宿主机有差异。如果有条件优先考虑把 VM 放在 Windows 设备上跑共享文件夹开发Mac 上更推荐用 SSH 或 Samba 补位。第三共享文件夹交流文件时注意不要两边同时编辑同一个文件。vmhgfs 虽然有基本的锁机制但跨系统文件锁本来就是个弱项我做前端项目时踩过package-lock.json被宿主机编辑器改坏、虚拟机里 yarn 无法解析的坑。要规范协作还是一次只开一边编辑。最后补一个我在 Ubuntu 22.04 上实测过的稳定组合VMware Workstation 17 open-vm-tools 11.3.5 systemd 挂载 service。这套组合我跑了差不多半年重启虚拟机、宿主机重启、打快照恢复共享目录都能可靠恢复。如果你正好也在配环境照着这个组合来能省掉大部分玄学问题。