
在日常交流群里经常有同事拿着截图来问我VMware里明明已经开启了共享文件夹Windows 主机上的目录也选好了怎么到 Ubuntu 虚拟机里就是看不到甚至有人为此重装了一遍 VMware Tools最后还是一头雾水。说实话这个功能本身并不复杂但它涉及虚拟机软件、客户机系统、文件系统驱动三个层面的配合任何一个环节断了表现出来都是“共享文件夹不见了”。这篇文章我就把 VMware Workstation 里 Ubuntu 与 Windows 共享文件夹这件事从头到尾拆开讲一遍。包括HGFS的工作逻辑、VMware Tools 的安装方式、共享目录的配置方法、挂载命令和开机自动挂载写法以及我这些年踩过的权限坑和失效坑。无论你用的是桌面版的 Ubuntu 还是纯命令行服务器版按着下面的步骤走基本都能搞定。1. 为什么“设置好了”却看不到先搞懂 HGFS 的工作逻辑很多人的第一步就理解错了以为在 VMware 图形界面里把“共享文件夹”开关打开宿主机目录就会像U盘一样自动出现在 Ubuntu 里。实际上VMware 的共享文件夹功能走的是 HGFSHost-Guest File System这套文件系统的驱动并不是 Windows 侧提供的而是装在虚拟机里的 VMware Tools 提供的。1.1 “共享文件夹”和“拖拽文件”是两码事这里先区分两个容易混淆的功能。VMware 里有一个“启用拖拽”的选项这个功能允许你把文件从 Windows 窗口直接拖进 Ubuntu 桌面但它走的是 VMware 的剪贴板增强和拖放通道适合临时传几个文件不适合作为持续存在的目录使用。而“共享文件夹”则在虚拟机里映射成一个真正的文件系统路径比如 /mnt/hgfs/Share你可以在里面直接读写、创建项目、跑脚本两边看到的永远是同一份文件。理解这个区别很重要。拖拽依赖的是图形会话如果 Ubuntu 跑的是无桌面服务器版拖拽基本是废的而共享文件夹只要 HGFS 驱动正常SSH 连进去也一样能访问。1.2 共享文件夹的三条技术路径对比在 VMware 虚拟机里实现 Windows 与 Ubuntu 文件互通其实不止 HGFS 一种方式。我把几种常见方案放在一起比较过各有各的适用场景。方案原理优点缺点HGFS / vmhgfs-fuseVMware Tools 提供的客户机文件系统驱动配置简单无需网络隔离性好性能一般对 inotify 支持不完整跨平台权限语义粗糙Samba / SMB通过网络共享协议访问 Windows 目录兼容性好多虚拟机可同时访问稳定需要网络连通路径写起来稍长性能受网络影响NFSLinux 原生网络文件系统Linux 之间效率高适合服务器场景Windows 挂载 NFS 相对麻烦配置门槛偏高单从“快速让 Windows 和 Ubuntu 互相传文件”这个需求来看HGFS 是最省事的方案也是本文的重点。如果你后续要把共享目录做成长期稳定的数据交换通道或者有多台虚拟机都要访问同一份数据那再考虑升级到 Samba 或 NFS第五节我会展开讲。1.3 为什么 HGFS 必须依赖 VMware Tools这里用一个生活类比虚拟机像你租的房子Windows 宿主机是房东共享文件夹是房东在墙上给你留的一个柜子而 VMware Tools 就是打开这个柜子的钥匙。没有钥匙你就算知道墙里有柜子也死活打不开门。在 HGFS 的实现里VMware Tools 会向 Ubuntu 内核注册文件系统驱动早期是 vmhgfs 内核模块新版 Open-VM-Tools 里则通过 FUSE 用户态方式提供 vmhgfs-fuse。只有驱动注册成功你在 Ubuntu 里执行挂载命令时才能看到宿主机共享目录。所以下一步必须先解决 VMware Tools 的安装问题。2. VMware Tools 没装对共享文件夹永远出不来VMware Tools 有两种安装来源很多教程还在教你去虚拟机菜单栏点“Install VMware Tools”然后挂载那个虚拟光驱解压 tar 包来装。这个方法在旧版 Ubuntu 上还行新版本内核一升级那个官方 tar 包里的老驱动经常编不过去或者装完一重启就失效。我现在几乎没有再用过那种手动方式。2.1 推荐直接用 Open-VM-ToolsUbuntu 官方软件源里维护了一套开源版 VMware Tools叫 Open-VM-Tools功能和 VMware 官方闭源版基本一致而且紧跟 Ubuntu 内核更新不会出现“升级内核后共享目录消失”这种周期性故障。在 Ubuntu 终端里执行以下命令即可安装sudo apt update sudo apt install -y open-vm-tools open-vm-tools-desktop如果你是带桌面的 Ubuntu 版本建议把 open-vm-tools-desktop 也一起装上它会启用分辨率自适应、剪贴板共享、拖拽文件等图形会话相关功能。如果只是命令行服务器版装 open-vm-tools 就够了少一个包少一份依赖。装完以后把虚拟机重启一次或者至少把当前会话注销重新登录一次确保服务正常启动。我个人习惯直接重启因为后面挂载共享目录时FUSE 模块和设备节点有时候在系统刚装完驱动时不一定会立即就绪。2.2 确认 VMware Tools 是否生效重启之后先在 Ubuntu 里执行这条命令vmware-hgfsclient这条命令会列出虚拟机配置里所有的共享文件夹名称。注意如果这里没有任何输出说明 VMware Tools 没有正常工作或者共享文件夹根本没配置。这一步就像体检报告单上的第一项指标后面的操作都要建立在这一条有输出的基础上。再顺手检查一下服务状态systemctl status open-vm-tools如果服务显示 active (running)说明驱动框架已经在跑。这时如果 vmware-hgfsclient 有输出就可以进入下一步配置共享文件夹了。2.3 一个容易被忽略的版本问题如果你是在旧版 VMware Workstation比如 14、15上装了新版 UbuntuOpen-VM-Tools 的某些特性可能不完全兼容表现症状是鼠标卡顿、剪贴板失效、共享目录时好时坏。这种组合下可以先把 VMware Workstation 升级到 15.5 以上或者至少确认虚拟机硬件版本设置不要太高。另外提一句VMware Workstation 17 Pro 从 2024 年 5 月之后对个人用户免费了如果还在用旧版本直接升级到 17 会省掉很多奇奇怪怪的兼容性问题。官方下载页面直接下载即可许可证界面选择个人用途就能免费使用。3. 一步步配置共享文件夹并挂载到 Ubuntu准备工作做完下面进入真正的操作环节。整个流程分三段先在 VMware 侧添加共享目录然后在 Ubuntu 侧挂载最后配置开机自动挂载。3.1 VMware 侧添加共享文件夹打开虚拟机的设置窗口按以下步骤操作在 VMware Workstation 中选中目标虚拟机点击“编辑虚拟机设置”。切换到“选项”选项卡。左侧找到“共享文件夹”。右侧选择“总是启用”。点击“添加”按向导选择 Windows 宿主机上的一个目录比如 D:\share。设置共享名称建议纯英文不要带空格。如果你起名“myshare”后面挂载时就用这个名称指代该目录。勾选“启用此共享”完成添加。这里有一个细节VMware 支持同时添加多个共享文件夹你可以给每个目录单独命名。如果希望在 Windows 侧改动文件但 Ubuntu 侧只能读不能改可以在添加目录时勾选“只读”。日常传文件不建议只读容易踩“刚写一半发现没权限”的坑。4. Ubuntu 侧挂载共享目录回到 Ubuntu 终端先创建挂载点。默认路径一般习惯用 /mnt/hgfs但这个目录在较新系统中不一定自动存在手动创建一下sudo mkdir -p /mnt/hgfs然后运行挂载命令sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid1000,gid1000这条命令把宿主机上所有共享文件夹的根挂载到 /mnt/hgfs。如果你只想挂载某一个共享目录可以写成sudo vmhgfs-fuse .host:/myshare /mnt/hgfs/myshare -o allow_other -o uid1000,gid1000挂载完之后执行ls -l /mnt/hgfs正常情况下你就能看到刚才在 VMware 里添加的共享文件夹名称进去就是 Windows 那边对应的目录内容。这里说明一下参数含义别光复制不知道什么意思.host:/ 表示宿主机共享根目录等价于“所有共享的集合”。allow_other 允许除 root 之外的用户访问挂载点不加这个参数普通用户经常进不了目录。uid1000,gid1000 把共享目录中的文件和目录所有者映射到 Ubuntu 第一个普通用户通常是安装系统时创建的用户。如果不指定 uid/gid挂载后文件所有者会显示成 root普通用户写不进去。关于这个 uid 值你可以用 id -u 命令查看当前用户的 uid。绝大多数 Ubuntu 桌面版第一个用户是 1000但如果你的系统里用户编号不同直接把两个参数改成实际值即可。4.1 设置开机自动挂载避免每次重启都要手动执行很多人配置完共享文件夹重启虚拟机后又发现 /mnt/hgfs 空了一脸懵。原因很简单vmhgfs-fuse 的挂载不会自动执行你需要把它写进 /etc/fstab让系统启动时自动挂载。编辑 fstabsudo nano /etc/fstab在文件末尾追加这一行.host:/ /mnt/hgfs fuse.vmhgfs-fuse defaults,allow_other,uid1000,gid1000 0 0保存后执行下面命令验证配置是否正确不用重启就能应用sudo mount -a如果这条命令没有报错再执行 ls /mnt/hgfs 确认目录内容可见说明 fstab 配置成功。今后每次开虚拟机目录都会自动挂载好。这里有一个我踩过几次的坑fstab 写错一行系统启动时可能会卡在等待挂载超时甚至直接进入紧急模式。所以写完 fstab 一定要先执行 mount -a 测试确认无误再重启别把“配置自动挂载”变成“把系统搞到起不来”。4.2 关于“重启后共享失效”的高频场景有些人会用 CIFS 挂载 Windows 共享比如 //WindowsIP/share这个在重启后也经常失效原因通常是网络没有就绪时 fstab 里的挂载任务已经开始执行。解决办法是在 fstab 的挂载参数里加上 _netdev告诉系统等网络可用后再挂载。HGFS 走的是虚拟设备通道不依赖网络所以一般不会遇到这个问题但如果你同时配了 CIFS 或 NFS记住 _netdev 这个参数能省不少心。5. 常见问题排查实录挂载失败、目录空白、权限拒绝对照表这里把我这些年遇到过的、以及群里高频出现的问题整理成一个速查表每一条都是实际验证过的排查思路。现象可能原因排查与解决办法vmware-hgfsclient 无输出VMware Tools 未安装或服务未启动重新安装 open-vm-tools检查 systemctl status open-vm-tools确认共享文件夹是“总是启用”/mnt/hgfs 目录存在但内容为空挂载未执行或未成功手动执行 vmhgfs-fuse查看 dmesg 输出是否有 fuse 错误挂载时报 fuse: device not found系统未加载 fuse 模块执行 modprobe fuse再重新挂载文件能看到但无法写入挂载参数缺少 uid/gid 或 allow_other重新挂载补上 -o uid1000,gid1000 -o allow_other普通用户打开 /mnt/hgfs 报 Permission denied挂载时未加 allow_other重新挂载并加 allow_other 参数重启后共享目录没有被挂载fstab 写错或未生效检查 fstab 行执行 mount -a确认没有多余空格或全角符号大文件拷贝到一半失败HGFS 对超大文件支持不完善改用 Samba 或直接拖拽或分卷传输在共享目录里跑代码/文件监听工具无效HGFS 对 inotify 事件支持不完整开发目录放在虚拟机本地磁盘共享目录只做文件交换5.1 重点展开fuse 模块问题怎么处理在较新的 Ubuntu 版本上fuse 默认是启用的但如果你用的是精简安装、容器化定制系统或者云镜像裁剪版本偶尔会遇到 /dev/fuse 不存在的情况。这时先手动加载模块sudo modprobe fuse然后确认设备节点ls -l /dev/fuse如果 ls 之后发现连 /dev/fuse 都没有执行sudo mknod -m 666 /dev/fuse c 10 229这个操作很少用到但在定制内核环境下我确实遇到过。如果 modprobe 报错 module not found那多半是内核没有包含 fuse 支持这种情况建议换回 Ubuntu 官方内核别在裁剪内核上浪费时间。5.2 关于文件权限和换行符的“隐藏坑”共享文件夹挂在 /mnt/hgfs 下之后你会发现文件权限经常显示成 777 或者带有 execute 标志因为 NTFS 文件系统本身没有 POSIX 权限概念vmhgfs-fuse 会为所有文件分配一个统一权限。所以你可能会看到 Windows 那边存的一个 txt 文本在 Ubuntu 里也是可执行的。这不会影响读写但如果你习惯性地给脚本文件设置了执行权限Windows 那边并不会感知到换了一台机器之后脚本权限仍然是 Windows 默认状态。还有换行符问题在 Windows 下用记事本写的脚本文件到 Ubuntu 里可能会因为 CRLF 换行符报错“/usr/bin/env: bad interpreter”这个和共享文件夹本身无关但因为它太常见了我每次遇到有人说“共享文件夹里脚本跑不了”时第一反应就是让他检查换行符。建议在 Windows 写代码时直接把编辑器默认换行符改成 LF或者到 Ubuntu 里用 dos2unix 统一转一次。5.3 开发场景下的一个实用建议如果你打算把共享文件夹当代码目录直接在 /mnt/hgfs/xxx 下面跑 npm、webpack、gulp或者用 IDE 的文件监听功能我劝你慎重。HGFS 对 inotify 事件的支持不完整很多文件监听工具在共享目录里会失灵表现为改文件后不触发编译、保存后页面不刷新。我的处理方式很干脆开发目录始终放在虚拟机本地磁盘共享文件夹只用来交换安装包、文档、数据库备份等静态文件。代码同步通过 git 仓库完成这样既不影响 HGFS 的性能边界也不会因为 inotify 问题耽误开发效率。6. 更进一步Samba、NFS 与远程开发哪种模式更顺手HGFS 解决的是“宿主机和这台 Ubuntu 之间快速共享”的问题。但如果你的 Ubuntu 还要和局域网里的其他电脑共享文件或者要多台虚拟机访问同一个 Windows 目录HGFS 就不太够用了需要换方案。6.1 Samba和 Windows 共享最通用的方式在 Ubuntu 上装 Samba 服务Windows 打开文件管理器直接输 \ubuntuIP\share 就能访问这是跨平台共享的标准做法。安装并开启服务sudo apt install -y samba sudo systemctl start smbd sudo systemctl enable smbd然后编辑 /etc/samba/smb.conf在文件末尾追加一个共享定义[share] path /home/yourname/share browseable yes read only no valid users yourname重启服务并设置 Samba 访问密码sudo systemctl restart smbd sudo smbpasswd -a yournameWindows 侧通过 \IP地址\share 访问。如果提示找不到网络路径先确认 Ubuntu 防火墙是否放行 445 端口。这种方式因为是走标准 SMB 协议稳定性比 HGFS 好也适合长期挂载使用。网上很多“CIFS挂载共享文件夹重启失效”的求助基本都是因为 SMB 客户端在 fstab 里没加 _netdev我前面已经提过。6.2 NFSLinux 机器之间的高效通道如果共享的两端都是 LinuxNFS 是更高效的选择。Ubuntu 上装 NFS 服务端sudo apt install -y nfs-kernel-server编辑 /etc/exports添加要共享的目录/home/yourname/share 192.168.10.0/24(rw,sync,no_subtree_check)然后应用配置sudo exportfs -ra sudo systemctl restart nfs-kernel-server客户端挂载sudo mount -t nfs ubuntu-server-ip:/home/yourname/share /mnt/nfsNFS 在 Linux 生态里性能损耗低权限模型也和 POSIX 一致适合服务器之间的数据交换。缺点是 Windows 连接 NFS 需要额外安装“NFS 客户端”功能操作路径较长如果共享双方有一方是 Windows还是优先 Samba 吧。6.3 远程 SSH 模式绕开共享目录的另一种思路有时候你需要的可能不是挂在本地路径的共享文件夹而是能随时操作虚拟机里的文件。这种场景下我更推荐直接用 VSCode 的 Remote-SSH 插件通过 SSH 连进 Ubuntu在 VSCode 里打开远程目录写代码。远程终端、文件树、调试器都能直接用完全没有 HGFS 的 inotify 限制也不用操心挂载参数。具体操作不复杂宿主机装好 VSCode装 Remote-SSH 插件虚拟机里确保 openssh-server 已安装并启动然后在 VSCode 里配置 SSH Host 就能连接。这种方式对个人开发场景来说比折腾共享文件夹更干净。7. 一点个人体会在我自己的日常环境里VMware 共享文件夹用得最多的场景是给虚拟机导安装包、传数据库备份、拿宿主机上的截图这些场景稳定可靠就够用。倒是早期我试图把整个 Python 项目直接放在共享目录里开发结果文件监听失效、权限总出问题来回折腾了好几天后来换成 git 同步代码、本地磁盘跑开发环境世界才清净下来。很多人喜欢问“到底用哪种方式最好”我的回答是先确认你的需求是文件交换还是持续开发。如果只是交换文件HGFS 的配置成本最低照着前面第三节的步骤十分钟就能跑通如果是长期不断地读写同一份数据Samba 的稳定性更值得信任如果是开发写代码优先考虑远程 SSH 模式。根据自己的场景选一种方式别一上来就全都配一遍。最后再分享一个小技巧配置完共享文件夹以后在 Ubuntu 里先把常用目录做一个软链接比如 ln -s /mnt/hgfs/myshare ~/share以后直接用 ~/share 访问省得每次都要敲一长串路径。Windows 侧也建议在桌面放一个指向 D:\share 的快捷方式两边各一步就能打开共享目录日常用起来方便很多。