VMware 里给 Ubuntu 虚拟机配一个和 Windows 互通的共享文件夹,这事听起来就三个步骤:设置里加目录、装虚拟机工具、挂载。可真自己动手,很多人会卡在ls /mnt/hgfs什么都看不到这一步。我前前后后配过不少次,Windows 宿主机加 Ubuntu 客户机的组合是最常见的,也最容易出问题。今天就把这套配置完整拆一遍,从虚拟机设置里的共享目录添加,到 Ubuntu 里的工具安装、手动挂载、开机自启,再到拖拽复制、权限问题和排错,一次性说清楚。
这篇文章适合刚接触 Ubuntu 虚拟机的朋友,也适合已经试过网上各种教程但一直没跑通的同学。如果你已经很熟练,建议直接跳到最后的排查清单,有几个细节是常规文档里不会写的。
1. 动手前的整体思路:共享文件夹的数据流向
1.1 它和“拖文件进去”不是一回事
很多人以为共享文件夹就是把一个 Windows 目录“映射”到 Ubuntu 里,像 U 盘一样插进去。严格来说,VMware 实现共享文件夹走的是 HGFS(Host-Guest File System)协议:宿主机把 Windows 文件系统暴露成一个叫.host:/的虚拟根,客户机里的虚拟机工具负责把这个根挂载到系统目录下。
所以你在命令里会看到.host:/这种奇怪的写法,它不是网络路径,而是 VMware 虚拟化层的保留入口。Ubuntu 一侧能看到的就是普通的文件目录,应用层读写行为和本地目录几乎没有区别,但底层数据流其实是“Ubuntu 文件系统调用 -> 虚拟机工具 -> 宿主机文件系统”,中间隔着一层虚拟化通道。
理解这一点有个实际意义:共享文件夹不是自动出现的。Windows 里设好了共享目录,Ubuntu 里还缺一个“挂载动作”。很多教程只说设置,不说挂载,导致你跟着做完以后/mnt/hgfs仍然是空的。
1.2 先决定用 open-vm-tools 还是 VMware Tools
在 Ubuntu 里装虚拟机工具,有两条路:一条是用 VMware Workstation 自带的 VMware Tools 安装包,另一条是用 Ubuntu 软件源里的 open-vm-tools。我的建议很直接:新版本 Ubuntu 一律用 open-vm-tools。
原因在于,较新的 VMware Workstation 和 Ubuntu 内核配合时,共享文件夹默认走 FUSE 用户态挂载,而不是老掉牙的内核模块。open-vm-tools 自带的vmhgfs-fuse命令就是干这个的,安装简单、随系统更新,不容易因为内核升级而掉驱动。传统 VMware Tools 在某些场景下也能用,但换内核以后容易出现模块不匹配,反而给自己找麻烦。
如果只是 Ubuntu Server,装open-vm-tools就够。如果是 Ubuntu Desktop,还需要open-vm-tools-desktop,否则拖拽、剪贴板共享、窗口自适应这些桌面增强功能会缺失。这个区别后面专门讲。
2. 宿主机端设置:Windows 侧把目录“交出去”
2.1 在虚拟机设置里添加共享目录的完整流程
先假设 Windows 宿主机上已经有一个目录,比如D:\share,你要把它共享给 Ubuntu。操作步骤并不复杂:
- 在 VMware Workstation 里选中目标虚拟机,点击“编辑虚拟机设置”。
- 切到“选项”页签,找到“共享文件夹”。
- 先选择“总是启用”,这一步很关键,如果选的是“下次关机前有效”之类的临时选项,重启虚拟机后共享就没了。
- 点击“添加”,在向导里浏览并选择宿主机路径,例如
D:\share。 - 给共享目录起一个名字。我建议不要用默认的完整文件夹名,直接改成
vm-share这种简短、无空格的名称。 - 确认“启用此共享”已勾选,最后完成。
完成以后,虚拟机设置里会多出一条共享记录。如果虚拟机当前是运行状态,设置一般也会即时生效,但 Ubuntu 客户端经常不会实时弹出目录,需要手动挂载或重启虚拟机里的工具服务。
名称这件事多强调一句。Windows 允许目录名带空格,比如D:\My Documents,但在 Ubuntu 挂载后你就得处理带空格的路径,写自动化脚本时很痛苦。建议在宿主机端就建一个干净的目录名,例如D:\vm-share或D:\shared\data。
2.2 共享名称、只读选项和“映射网络驱动器”的取舍
在添加共享目录的向导里,有一个“启用此共享”复选框,还有一个“只读”选项。如果勾了只读,Ubuntu 里就只能读不能写,这对日常交换文件来说很反直觉。我第一次配的时候就因为勾了只读,在 Ubuntu 里写文件一直报权限错误,排查了半天才发现是宿主机设置的问题。
还有一个容易被忽略的选项叫“映射为 Windows 网络驱动器”。这个名字很有迷惑性,我明确告诉你:它对 Linux 客户机没有意义,那个选项是给 Windows 客户机用的。配 Ubuntu 时不需要勾,勾了也不起作用,反而让人以为是哪里没配好。
高级选项里通常还有“在此虚拟机下一次打开电源时启用”之类的开关,保持默认就行。如果你需要同时共享多个目录,可以重复添加,最终 Ubuntu 的/mnt/hgfs下会出现多个对应名称的子目录。
提示:宿主机选择共享路径时,尽量避免直接共享整个 C 盘或系统敏感目录。虚拟机中的操作有风险,万一误删或格式化了共享目录里的文件,影响的是宿主机数据。独立建一个专用目录最稳。
2.3 宿主机端“看不到共享文件夹选项”怎么处理
有一部分朋友会遇到“选项页里没有共享文件夹”或按钮是灰的。这不是 Ubuntu 的问题,通常是以下几个原因:
- 当前虚拟机处于挂起状态,某些选项被锁定,恢复运行或彻底关机后再开设置。
- 使用了精简版或非官方修改版 Workstation,功能被阉割。换用官方安装包基本能解决。
- 虚拟机是由其他虚拟化平台导入的,硬件兼容版本太老。可以试试“虚拟机”菜单里的“升级虚拟机硬件”。
如果设置界面正常,但 Ubuntu 里就是识别不到,那问题大概率出在客户机工具一侧,下一部分详细说。
3. Ubuntu 客户机端:安装工具并完成挂载
3.1 安装 open-vm-tools 和 open-vm-tools-desktop
进入 Ubuntu 虚拟机,打开终端。先把软件源索引更新一下,然后安装工具包:
sudo apt update sudo apt install -y open-vm-tools open-vm-tools-desktop如果你是 Ubuntu Server,不需要桌面拖拽功能,只装open-vm-tools就够了。Ubuntu Desktop 建议两个都装,因为open-vm-tools-desktop依赖会把桌面集成组件拉进来,比如剪贴板共享、文件拖拽和分辨率自适应。
安装完成后,不需要立刻重启。先检查工具是否已经加载:
vmware-hgfsclient这个命令会列出宿主机共享给你的目录名。如果输出了vm-share,说明虚拟化层已经识别到了;如果没有任何输出,先别急着挂载,回到第 2 节检查共享设置是否真正生效。
3.2 手动挂载 /mnt/hgfs 的命令与参数说明
默认情况下,Ubuntu 里共享目录的挂载点是/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:/:表示宿主机上的所有共享根目录。/mnt/hgfs:客户机里的挂载点。-o allow_other:允许除 root 以外的用户访问。没有这个参数,非 root 用户进入/mnt/hgfs很可能被拒绝。-o uid=$(id -u) -o gid=$(id -g):让挂载后的文件显示为当前用户的 uid 和 gid。id -u通常会输出1000,也就是第一个普通用户。
挂载完成以后验证一下:
ls -l /mnt/hgfs mount | grep vmhgfs正常情况你会在/mnt/hgfs下看到vm-share子目录,进入后就能访问 Windows 里的文件了。
有朋友问,能不能只挂载某一个共享目录,而不是全部?也可以:
sudo mkdir -p /mnt/hgfs/vm-share sudo vmhgfs-fuse .host:/vm-share /mnt/hgfs/vm-share -o allow_other -o uid=1000 -o gid=1000但说实话没必要逐个挂载,一个.host:/挂全部最省心。
旧教程里还有一种写法:
sudo mount -t vmhgfs .host:/ /mnt/hgfs如果你敲完出现unknown filesystem type 'vmhgfs',不用纠结,那是因为新版本系统没有装对应的内核模块,直接用vmhgfs-fuse就对了。这是新旧工具实现方式不同导致的,不是你操作有问题。
3.3 让共享文件夹开机自动挂载的推荐方案
手动挂载只能管到当前开机。重启虚拟机以后/mnt/hgfs又会空掉,这时候就需要开机自动挂载。
网上很多教程会教你写进/etc/fstab,我也给一个可用的写法:
.host:/ /mnt/hgfs fuse.vmhgfs-fuse defaults,allow_other,uid=1000,gid=1000 0 0但这个写法有一个风险:如果系统启动过程中 HGFS 通道还没就绪,而 systemd 又按 fstab 顺序去挂载,可能造成开机失败、进入紧急模式。虽然可以通过x-systemd.after之类的参数去规避,但复杂度上来了,对新手不友好。
我个人的推荐方案是写一个 systemd 服务来管理挂载,稳定且容易排查。在/etc/systemd/system/下创建一个服务文件:
sudo nano /etc/systemd/system/vmware-shared-folders.service内容如下:
[Unit] Description=Mount VMware shared folders After=network.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other,uid=1000,gid=1000 ExecStop=/usr/bin/fusermount -u /mnt/hgfs [Install] WantedBy=multi-user.target然后执行:
sudo systemctl daemon-reload sudo systemctl enable --now vmware-shared-folders这个服务会在系统进入多用户模式时执行一次挂载,并且在关机时自动卸载。以后开机不用再管它。
如果你已经手动挂载过,自己写服务后发现没有变化,先卸载再测试:
sudo fusermount -u /mnt/hgfs sudo systemctl start vmware-shared-folders之所以推荐 systemd 而不是 fstab,还有个原因是 fstab 一旦写错,可能连系统都进不去。service 文件就算写错,最多是挂载失败,把服务禁用掉再手动修就行,风险小得多。
4. 文件互通和拖拽粘贴的进阶体验
4.1 为什么桌面版要额外装 open-vm-tools-desktop
如果只装了open-vm-tools,命令行下读写共享文件夹没问题,但桌面环境会很别扭:窗口大小不会随 VMware 窗口自适应,从 Windows 往 Ubuntu 拖文件拖不进去,剪贴板也不能共享。
open-vm-tools-desktop补齐的就是这些桌面集成能力。它依赖open-vm-tools,所以安装命令可以一起装,不用分开。装完以后如果想立刻生效,重启虚拟机最省事。有些情况下重启服务也能生效,但桌面会话对组件加载时机比较敏感,重启一下不浪费时间。
4.2 客户机隔离选项与“双向”拖拽逻辑
除了工具要装,VMware 设置里还有一道开关。在“虚拟机设置”->“选项”->“客户机隔离”里,你会看到两个复选框:“启用复制粘贴”和“启用拖放”。这两个都要勾上。
拖拽的逻辑是“复制”,不是“移动”。Windows 里的文件拖进 Ubuntu,等价于把文件复制到 Ubuntu 的当前目录或桌面;Ubuntu 里的文件拖到 Windows,也同样是复制。如果你希望文件在两个系统间频繁交换,直接通过共享文件夹读写会更稳定,拖拽适合偶尔传一份文件。
有一点要提前打预防针:如果你用的是 Wayland 会话,某些 VM 版本对拖拽支持不太好。遇到拖拽不生效但复制粘贴正常的情况,不用纠结,直接走共享文件夹路径复制就行。这不是你的问题,是虚拟化环境与图形协议之间的兼容问题。
5. 常见问题与排查技巧实录
5.1 共享文件夹怎么都看不到
这是出现频率最高的问题。表现是:Windows 侧设置界面一切正常,Ubuntu 里/mnt/hgfs也存在,但里面是空的,或者vmware-hgfsclient直接没有输出。
按顺序排查:
- 确认共享文件夹设置为“总是启用”。只勾选了“启用此共享”但上面的大选项还是禁用状态,等于没开。
- 确认 Ubuntu 里工具已安装。跑一下
vmware-hgfsclient,如果没有这个命令,说明工具没装好。 - 如果你用的是精简版 Workstation,换官方安装包。
- 在 Windows 宿主机上把共享目录的“只读”属性取消,避免读写方向被限死。
- 如果以上都对,重启虚拟机。很多时候工具加载发生在桌面会话之后,启动顺序乱掉,重启比调试省心。
5.2 能看到目录但没权限进入
表现是ls /mnt/hgfs能看到目录名,但cd进去提示Permission denied,或者新建文件提示没有权限。
第一个可能原因是挂载时没有加allow_other和 uid/gid 参数。重新挂载一下:
sudo fusermount -u /mnt/hgfs sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid=$(id -u) -o gid=$(id -g)第二个原因是宿主机目录本身加了访问控制。Windows 上右键共享目录,查看安全属性,确认当前用户有读写权限。
第三个原因很隐蔽:共享目录本身是 Windows 的压缩文件夹或加密属性。开启加密属性的目录在跨平台挂载时可能无法正常访问,把整个共享目录放进一个普通的新建文件夹里最稳。
5.3 重启后挂载失效
重启以后/mnt/hgfs就空,说明你没有配开机自动挂载。按第 3.3 节的 systemd 服务配置一次即可。
如果你之前用了 fstab,并且重启后直接卡在系统启动界面,大概率是 fstab 写错了。别慌,进入恢复模式或输入 root 密码后,编辑/etc/fstab,把.host:/ /mnt/hgfs那一行删掉或注释掉,再重启。这也是为什么我强烈不建议新手优先用 fstab 的原因。
5.4 实测中很好用的排查命令清单
把这些命令存在自己笔记里,遇到问题按顺序跑一遍:
| 命令 | 作用 |
|---|---|
vmware-hgfsclient | 查看宿主机共享目录是否被虚拟机识别 |
ls -l /mnt/hgfs | 查看共享目录挂载后的内容 |
mount | grep vmhgfs | 查看挂载状态和挂载参数 |
sudo fusermount -u /mnt/hgfs | 卸载挂载点,常用于重挂 |
dmesg | grep -i vmhgfs | 查看内核日志中关于 HGFS 的信息 |
systemctl list-units | grep -i vm | 检查虚拟机相关服务是否启动 |
用fusermount -u卸载时如果提示target is busy,说明有进程正在占用目录里的文件。可以用lsof +f -- /mnt/hgfs看看是谁占着,关掉对应的文件管理器或编辑器再卸载。
最后分享一个我个人很喜欢的技巧:共享挂载好之后,在 Ubuntu 里做一个软链接,把/mnt/hgfs/vm-share指到~/Shared,这样平时写代码、传安装包都不用敲长路径:
ln -s /mnt/hgfs/vm-share ~/Shared如果你经常在 Windows 和 Ubuntu 两边交换材料,建议在共享目录里单独建一个temp子目录,专门放一次性文件,这样不会因为误操作把有用的项目文件删掉。
实际踩过几次坑之后,我觉得共享文件夹配置本身不复杂,复杂的是挂载时机和权限。只要理顺了“Windows 设置 -> 工具安装 -> 挂载动作 -> 开机自启”这条链路,后面基本一劳永逸。