VMware Linux共享文件夹配置详解:从挂载到权限调优
发布时间:2026/9/30 8:24:56 作者:尧图编辑部 阅读量:1,286

简介面向在VMware虚拟机中使用Linux、需要实现主机与虚拟机间文件共享的开发者与运维人员这份图文教程通过完整截图与分步骤讲解解决共享文件夹配置过程中常见的挂载失败、Tools安装异常等问题。资源包为单个PDF文档共1个文件、约675KB内容涵盖VMware共享文件夹功能开启、VMware Tools安装、/mnt/hgfs目录创建、编辑 /etc/fstab 实现持久化挂载等关键环节并配有验证方法方便读者确认主机文件已出现在虚拟机中。已有5104人学习下载适合刚接触VMware的Linux用户也适合希望摆脱U盘或网络传输、提升开发调试效率的工程师。教程不仅给出具体命令和界面操作路径还对手动创建挂载目录等易错点做了补充按照步骤操作即可快速建立稳定的文件共享通道。1. 主机和VMware中的Linux共享文件夹能解决什么问题在 Windows 主机上装 VMware Workstation再跑一个 Ubuntu 或 CentOS 虚拟机做开发、编译、跑实验这是很多工程师的日常。最常见的痛点就是文件怎么在两个系统之间传递小文件靠拖拽偶尔成功大文件用 U 盘镜像麻烦开 HTTP 服务下载又绕了一圈。主机和VMware中的Linux实现共享文件夹就是把 Windows 上的一个真实目录直接映射进虚拟机Linux 里访问它就像访问本地磁盘一样双向读写、实时同步。这篇教程适合三类人在 Windows 上做 Linux 开发的程序员、拿虚拟机练手运维命令的初学者、需要把 Windows 下的代码或数据集喂给 Linux 工具链的测试人员。全程不需要额外软件只用 VMware Workstation 自带的共享文件夹功能加上 Linux 侧的几个命令。2. 共享文件夹的运行机制VMware Tools、vmhgfs 与 /mnt/hgfs2.1 没有 VMware Tools共享文件夹就是空谈很多人配置共享文件夹时把虚拟机设置里的开关打开、添加了目录进 Linux 一看/mnt/hgfs要么不存在要么是空的。问题基本都出在虚拟机里没装 VMware Tools。共享文件夹不是 VMware Workstation 用网络共享协议实现的它依赖客户机里一个专门的驱动叫 vmhgfs全称是 Host-Guest File System这个驱动由 VMware Tools 提供。VMware Tools 在 Linux 发行版的软件源里有开源版本叫 open-vm-tools。Ubuntu 桌面版通常预装了 open-vm-tools-desktop但很多精简安装的服务器版不带CentOS/RHEL 的 Minimal 安装也不带。我拿到一台新虚拟机第一件事就是确认这个包在不在命令就两条# Ubuntu / Debian 系 sudo apt update sudo apt install -y open-vm-tools open-vm-tools-desktop # CentOS / RHEL / Fedora 系 sudo dnf install -y open-vm-tools两个系统各自装完都要重启虚拟机或者至少重启一下 vmtoolsd 服务。open-vm-tools-desktop 这个包在桌面版里额外提供拖拽、剪贴板共享、分辨率自适应如果只需要共享文件夹只装 open-vm-tools 也够用。判断装没装用dpkg -l | grep open-vm-tools或者rpm -qa | grep open-vm-tools能查到包名说明已经装上了。这里有个容易忽略的点如果虚拟机创建后装过旧版 VMware Tools再换 open-vm-tools 可能出现两个版本打架表现为挂载成功但读写卡顿或报错这时候把 VMware 自带的 Tools 卸载干净再装 open-vm-tools 才是正路。2.2 共享文件夹的完整数据链路从 Windows 目录到 /mnt/hgfs把机制捋清楚后面排错会快很多。你在 VMware Workstation 的虚拟机设置里添加一个共享文件夹本质上是在给虚拟机的虚拟硬件里加了一个设备数据流动方向是这样的Windows 主机上的真实目录被 VMware 的 vmware-vmx 进程接管通过虚拟化层把文件内容编码成 vmhgfs 协议的请求发送给虚拟机里的 open-vm-tools 服务再由 vmhgfs-fuse 把内容挂载成一个 FUSE 文件系统出现在 Linux 的文件系统树里。挂载点默认是/mnt/hgfs但我建议你把它理解成一个“入口目录”真正的内容是你添加共享文件夹时填写的“名称”它在/mnt/hgfs下生成一个同名子目录。比如你在虚拟机设置里把 Windows 的D:\share共享出去名称填code那么 Linux 里访问的路径就是/mnt/hgfs/code不是/mnt/hgfs/share。名称可以在设置里随时改改完不需要重启虚拟机重新挂载一次就生效。这里有一个新旧差异要留意老版本 VMware Tools 用的是内核模块方式挂载挂载类型显示为vmhgfs新版本 open-vm-tools 走的是 FUSE 用户态文件系统挂载类型显示为fuse.vmhgfs-fuse。两种方式在用户看来行为一致但排错思路略有不同。内核模块方式依赖/dev/vmhgfs设备节点FUSE 方式依赖/dev/fuse所以说共享文件夹“突然不好用了”先分清自己属于哪种挂载类型再动手。绝大多数现代发行版都是 FUSE 方式下文也按这个主流方案讲。2.3 动手先确认环境三条命令自检在配置共享文件夹之前花一分钟做环境自检能省掉后面一大半的玄学问题。我给虚拟机做初始化时通常连续执行这三条vmtoolsd --version ls -ld /mnt/hgfs /dev/fuse 2/dev/null systemctl status vmtoolsd 2/dev/null || systemctl status open-vm-tools.service第一条vmtoolsd --version拿到 Tools 的版本号如果提示command not found说明 open-vm-tools 根本没装回到 2.1 去装。第二条检查/mnt/hgfs目录和/dev/fuse设备是否存在/mnt/hgfs不存在就手动sudo mkdir -p /mnt/hgfs/dev/fuse不存在说明内核没加载 fuse 模块需要sudo modprobe fuse这个坑出现过很多次。第三条看 vmtoolsd 服务的运行状态正常应该是active (running)。如果服务没起来先手工sudo systemctl start vmtoolsd再继续别带着一个半死状态的服务往下配置后面怎么调都白搭。这三条命令全部通过就可以放心进入下一步配置了。如果某一条不正常先把环境修好这是共享文件夹能否稳定的根基根基不牢后面全靠运气。我自己就是在这里踩过一回装完系统直接配共享发现怎么挂载都报错回头一看 open-vm-tools 压根没装上。3. 在主机侧启用共享文件夹Workstation 设置与挂载落地3.1 主机侧添加共享文件夹设置路径与两个关键选项先打开 VMware Workstation确保目标虚拟机处于关机或已启动状态都可以共享文件夹的设置在运行中也能改但 Linux 侧要重新挂载才能看到变化。右键虚拟机标签点“设置”在弹出的虚拟机设置窗口里切到“选项”页签左侧列表找到“共享文件夹”右侧选择“总是启用”然后点“添加”按钮。这时会弹出添加共享文件夹向导第一步点“浏览”选择 Windows 主机上的真实目录比如D:\share。第二步让填“名称”这个名称就是 Linux 里的目录名我强烈建议用纯英文小写加下划线不要用中文、空格、特殊符号。虽然新版支持一些特殊字符但在 shell 里操作带空格的中文目录名非常痛苦敲 tab 补全时还容易乱码给自己省点事。最后一步勾选“启用此共享”点完成。看到列表里出现刚才添加的目录状态是“已启用”就说明主机侧配置好了。这里有个小技巧可以在同一台虚拟机里添加多个共享文件夹把代码、数据集、安装包分开管理Linux 侧挂载后会在/mnt/hgfs下出现多个子目录。不用的共享可以随时在列表里右键“移除”或者取消勾选“启用此共享”不会影响其他共享项。“总是启用”和“下次开机或挂载时启用”的区别在于前者不弹提示后者每次开机都会问你是否允许共享我通常选“总是启用”省得每次开机多点一下。3.2 Linux 侧首次挂载一条命令跑通主机侧配好之后进 Linux 虚拟机挂载操作其实非常轻量。确认/mnt/hgfs目录存在不存在就创建然后执行挂载命令再列目录看一眼sudo mkdir -p /mnt/hgfs sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid$(id -u) -o gid$(id -g) ls -l /mnt/hgfs命令里的.host:/表示“主机端所有共享的根”对应vmhgfs-fuse内置的路径规则冒号后面的/不是 Linux 根目录而是一个特殊标识。挂载点必须是空目录如果之前有残留文件挂载后会被遮挡。-o allow_other允许非 root 用户访问这个挂载点uid$(id -u)和gid$(id -g)把挂载点的属主映射到当前用户这样普通用户才对这个目录有完整的读写权限不加这几个参数的话目录默认是 root 所有普通用户写不进去。执行完ls -l /mnt/hgfs如果能看到虚拟机上配置的共享名称就说明成功了。这时可以去/mnt/hgfs/code里touch test.txt再到 Windows 的D:\share里刷新一下文件应该已经出现了。反向验证同理在 Windows 侧放一个文件Linux 里ls能看到整个链路就是通的。如果想临时卸载执行sudo umount /mnt/hgfs卸载后 Windows 侧对目录的修改不会再影响虚拟机内但不会删除任何文件。3.3 开机自动挂载fstab 与 systemd 两种写法手动挂载的问题是重启虚拟机后失效每次开机都要敲一遍命令非常影响体验。我一般用/etc/fstab做开机自动挂载这是最直接的方式。在/etc/fstab末尾追加一行.host:/ /mnt/hgfs fuse.vmhgfs-fuse defaults,allow_other,uid1000,gid1000 0 0注意把uid1000,gid1000换成你 Linux 用户的真实 uid 和 gid用id命令可以查到。文件系统类型写fuse.vmhgfs-fuse有些旧版本内核或发行版也接受fuse如果mount -a时报未知文件系统类型改成fuse再试。修改完 fstab 不要立刻重启先执行sudo mount -a验证语法没有报错再重启。不过 fstab 有一个问题如果开机时 VMware Tools 还没准备好挂载可能失败系统会进入紧急模式。所以我在生产环境更推荐用 systemd 的 mount 单元来管理写一个/etc/systemd/system/mnt-hgfs.mount文件[Unit] DescriptionMount VMware Shared Folders Aftervmtoolsd.service [Mount] What.host:/ Where/mnt/hgfs Typefuse.vmhgfs-fuse Optionsdefaults,allow_other,uid1000,gid1000 [Install] WantedBymulti-user.target文件名必须和挂载点对应挂载点/mnt/hgfs文件名就是mnt-hgfs.mount中间是减号不是下划线。写完后执行sudo systemctl daemon-reload sudo systemctl enable --now mnt-hgfs.mount看下状态是不是active (mounted)。systemd 方式的好处是可以通过systemctl restart mnt-hgfs.mount单独重启挂载不用动整个虚拟机排查问题更方便。提示fstab 和 systemd 选一种即可两个都配可能互相冲突。我习惯用 systemd 方式因为它对依赖关系处理得更细腻不会像 fstab 那样挂载失败卡启动流程。4. 权限模型与参数调优普通用户读写、SELinux 与卸载清理4.1 allow_other、uid、gid为什么默认挂载只有 root 能写共享文件夹配置好之后最常见的后续需求是让虚拟机里的普通用户能直接读写。这里牵涉 FUSE 文件系统的一个特性默认情况下非 root 用户对 FUSE 挂载点的访问受到严格限制。vmhgfs-fuse 如果以 root 身份挂载且没有加allow_other那么即使你在 Windows 侧把目录权限设成 Everyone 完全控制Linux 里的普通用户依然只能读不能写甚至ls都会提示权限不足。这就是为什么挂载命令里要显式带上三个参数。allow_other告诉内核允许其他用户访问这个挂载点不加这个参数挂载点只对挂载用户自己可见uid和gid指定挂载点虚拟出来的文件属主。我见过很多人在网上抄命令抄的时候没注意这几个参数结果普通用户写不了文件于是到 Windows 侧改权限改来改去问题依旧其实是挂载参数的问题跟 Windows 权限没关系。一个干净的挂载命令模板是这样sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other,uid1000,gid1000挂载后用ls -ld /mnt/hgfs检查属主如果显示drwx------ 1 root root说明 allow_other 没生效如果显示drwxrwxrwx但属主是数字1000说明 uid/gid 参数没被正确解析多数情况是 fuse 版本太老不支持这种传参方式。遇到这种情况用sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid$(id -u) -o gid$(id -g)的拆分写法更可靠$(id -u)和$(id -g)是 shell 命令替换会自动把当前用户的 uid 和 gid 填进去不需要自己查数字。还有个细节如果你用普通用户身份直接执行 vmhgfs-fuse 而不是 sudo需要检查/etc/fuse.conf里是否启用了user_allow_other没启用的话会报错。不过日常使用我都是 root 挂载然后用 uid/gid 映射给普通用户省去 fuse.conf 的配置纠缠。4.2 主机侧文件系统与 SELinux 的叠加影响共享文件夹的权限不只是 Linux 单方面的事Windows 主机的文件系统也会参与约束。如果共享目录所在分区是 NTFSWindows 侧对某个文件的“只读”属性会直接传递给 Linux表现为chmod改了权限但写入依然被拒。如果目录在 exFAT 分区上没有 POSIX 权限概念Linux 侧看到的所有文件权限都由挂载参数控制chmod也不能持久生效。这个现象第一次遇到时特别让人困惑因为你在 Linux 里ls -l看到的权限是 vmhgfs-fuse 虚拟出来的实际写入时还要过一遍 Windows 侧的真实属性。一般建议把共享目录放在 NTFS 分区的普通文件夹里避免放在系统盘根目录或外接 exFAT 移动硬盘上。另外 Windows 侧如果开了 BitLocker 之类的加密也可能影响 vmhgfs 读取但这种组合不常见遇到时先固化在普通目录再排查。SELinux 在 CentOS/RHEL 默认开启对 FUSE 文件系统的访问也有约束。表现是挂载正常、ls正常但某些服务进程比如 httpd读取共享目录时报权限错误。查看方法是在虚拟机里执行ls -Z /mnt/hgfs如果看到system_u:object_r:fusefs_t:SystemLow之类的上下文而访问进程需要的是httpd_sys_content_t说明共享目录的安全上下文不匹配。解决有两条路简单粗暴的执行sudo setenforce 0临时放行确认是这个原因再做永久策略正规的用 semanage 把/mnt/hgfs的默认上下文改成服务需要的类型。Ubuntu/Debian 没有 SELinux这个坑主要针对 CentOS/RHEL 系列如果虚拟机里浏览器或 Nginx 读不到共享目录优先查这个方向。4.3 一组排错命令挂载状态、内核模块、fuse 可用性权限问题、挂载问题、驱动问题光靠肉眼观察很难定位。我习惯按顺序跑一组命令把状态一次性拉出来看mount | grep hgfs dmesg | grep -i fuse | tail -20 lsmod | grep vmhgfs head -c 16 /dev/fuse | hexdump第一条mount | grep hgfs看挂载项是否存在输出里应该有vmhgfs-fuse on /mnt/hgfs type fuse.vmhgfs-fuse如果没有说明根本没挂上往前查挂载命令的报错。第二条dmesg查内核日志里 fuse 相关的条目能看见模块加载信息和异常堆栈。第三条lsmod | grep vmhgfs确认虚拟机里是否真的有 vmhgfs 驱动新版本 open-vm-tools 的驱动模块可能不叫vmhgfs而是直接的fuse查不到这个模块名也正常重点看第一条挂载类型。第四条head -c 16 /dev/fuse | hexdump验证/dev/fuse设备是否可用读不到数据说明设备节点有问题执行sudo rm -f /dev/fuse sudo mknod /dev/fuse c 10 229 sudo chmod 666 /dev/fuse手工重建。如果这几条命令显示都正常但共享文件夹还是读写异常可以试试在 Windows 侧把共享目录的“缓存”选项改为“始终可以存档”或者关闭索引服务。这类问题属于 Windows 文件系统层面干扰在虚拟机里折腾没有意义回到宿主机调整再回来看效果。5. 共享文件夹常见问题避坑5 个报错的现象、原因与处理5.1 挂载时报 “fuse: device not found” 或 “No such file or directory”现象执行 vmhgfs-fuse 命令时终端输出fuse: device not found, try modprobe fuse first或者提示找不到/dev/fuse。原因Linux 内核的 fuse 模块没有加载或者 /dev/fuse 设备节点缺失。常见于精简安装的 CentOS/AlmaLinux系统没把 fuse 模块编进内核默认加载列表。解决先执行sudo modprobe fuse然后ls -l /dev/fuse确认设备出现再重新挂载。如果重启后又失效把 fuse 写进模块加载配置echo fuse | sudo tee /etc/modules-load.d/fuse.conf确保开机自动加载。5.2 /mnt/hgfs 目录存在但 ls 是空的现象进入/mnt/hgfs后什么也看不到挂载命令也没报错。原因通常有三个虚拟机设置里共享文件夹没有勾选“总是启用”open-vm-tools 没装或者服务没起来共享文件夹的名称带中文或特殊字符导致挂载后实际目录名和预期不一致。解决顺序先回 VMware Workstation 的设置页面确认共享列表里状态是“已启用”再到虚拟机里systemctl status vmtoolsd确认服务在跑最后用vmhgfs-fuse .host:/ /mnt/hgfs -o list_export这个隐藏参数列出主机端真正导出的共享名称看看是不是名字和你想的不一样。排除完这三个目录基本就出来了。5.3 普通用户写入文件提示 Permission denied现象root 用户读写正常切换到普通用户写文件就报权限不足但ls -ld /mnt/hgfs看权限是 777。原因挂载时没有加allow_other参数导致挂载点只对挂载用户开放或者 uid/gid 参数指定的用户和你当前登录的用户不一致比如拿 root 挂载时把 uid 指定成了自己的 0普通用户自然被拒绝。解决卸载后重新挂载命令改成sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other,uid1000,gid1000注意先把 uid/gid 替换成你实际要授权的用户。如果改了参数还是不行检查 Windows 侧目录属性里是否勾选了“只读”Windows 的只读属性会直接屏蔽 Linux 的写入操作。5.4 重启虚拟机后共享文件夹消失现象手动挂载后一切正常重启虚拟机后/mnt/hgfs变成空目录或者直接不存在。原因没有配置开机自动挂载手动挂载只在当前运行期生效。解决按 3.3 的内容配置 fstab 或 systemd 挂载单元。这里提醒一点不要同时配置 fstab 和 systemd mount unit两个都会尝试挂载同一个目录轻则报device is busy重则开机卡住。选一种方案配完后sudo reboot验证一次确认开机后挂载自动生效。5.5 把“0x80004005 无法访问共享主机”和 VMware 共享文件夹混为一谈现象Windows 主机上尝试访问网络共享时弹出0x80004005 无法访问共享主机有人会误以为是 VMware 的共享文件夹坏了跑进虚拟机重新配置半天。原因这个报错是 Windows 的 SMB 网络共享报错和 VMware 的 vmhgfs 共享文件夹是两条完全独立的技术路径。VMware 共享文件夹是虚拟化层实现的不需要网络而 0x80004005 是 Windows 通过局域网访问其他机器的 SMB 共享时报错常见诱因是 SMB 1.0/2.0 协议版本不匹配、防火墙拦截或者网络发现被关闭。解决先分清自己在操作哪个功能。如果是访问虚拟机里 Linux 通过 Samba 提供的共享目录去查 Samba 服务和 Windows 的 SMB 功能开关如果是 VMware 共享文件夹失效回到 5.2 的排查顺序。用“添加网络位置”的方式去访问 Linux 虚拟机里的文件然后报“输入的文件夹似乎无效”也是同一个误区的变种VMware 共享文件夹不需要在 Windows 侧添加网络位置直接在 Linux 虚拟机里访问/mnt/hgfs即可。6. 进阶用法从手动挂载到 systemd 自动挂载服务模板前面讲的都是基础用法到最后一节我给出一个生产环境可复制的 systemd 自动挂载模板并加两个提升日常效率的小技巧。模板解决三个问题开机顺序依赖、挂载失败自动重试、权限参数集中管理。创建/etc/systemd/system/mnt-hgfs.mount[Unit] DescriptionMount VMware Shared Folders Requiresvmtoolsd.service Aftervmtoolsd.service network.target [Mount] What.host:/ Where/mnt/hgfs Typefuse.vmhgfs-fuse Optionsdefaults,allow_other,uid1000,gid1000,umask0022 [Install] WantedBymulti-user.target加了umask0022后共享目录里的新文件默认权限是 644新目录是 755更适合开发和部署场景而不是默认的 777。创建完成后执行sudo systemctl daemon-reload sudo systemctl enable --now mnt-hgfs.mount systemctl status mnt-hgfs.mount看到active (mounted)就说明服务已经接管了挂载。以后每次修改 Windows 侧共享目录的路径或名称改完虚拟机设置后在 Linux 里sudo systemctl restart mnt-hgfs.mount即可不需要重启虚拟机。接下来一个实用技巧用软链接把共享目录整合进开发工作区。比如共享名称是code但你习惯把所有项目放在~/work下可以执行mkdir -p ~/work ln -s /mnt/hgfs/code ~/work/vm-share这样你的 IDE 打开~/work/vm-share就是在直接编辑 Windows 主机上的文件同时代码还保留在宿主机方便做版本管理和备份。另一个技巧是给 Docker 容器挂载共享目录比如虚拟机里跑了一个编译容器需要读 Windows 上的源码docker run -v /mnt/hgfs/code:/src -it ubuntu:22.04 bash容器启动后/src就是 Windows 主机上的那个目录数据仍然是存在宿主机的容器删了不丢。这套链路对交叉编译、离线包验证、日志分析场景非常实用。最后说一个我自己的教训有一次虚拟机里装了两个版本的 open-vm-tools共享目录读着读着就断dmesg里全是 vmhgfs 的报错。我花了一个下午查挂载参数、查权限配置最后发现是旧版 VMware Tools 残留的内核模块和新版冲突。所以每台新虚拟机我第一件事永远是确认 Tools 环境干净再谈共享文件夹。这个顺序救了我很多次希望你也能用得上。本文还有配套的精品资源点击获取