简介:本资源是一份面向VMware虚拟化初学者与IT运维人员的实操型配置指南,聚焦解决虚拟机与主机间文件共享这一高频痛点问题。内容以图文结合方式,系统讲解共享文件夹所需的三大核心步骤:虚拟机设置中添加主机共享目录、正确载入windows.iso并安装VMWare Tools、在客户机内映射网络驱动器,覆盖从环境准备到验证成功的完整链路,并深入解析VMWare Tools作用及共享机制原理。资源为单文件PDF文档(1个,407KB),排版清晰、步骤截图详实,适合作为随查随用的配置手册或教学辅助材料。目前已有482人学习下载,特别适合刚完成系统安装、亟需打通主客机数据通道的用户快速上手,避免因VMware Tools安装遗漏或映射路径错误导致的常见失败。
1. VMware虚拟机与主机共享文件夹:不是配完就完事,关键在权限链和挂载持久化
很多用户以为在 VMware Workstation 里勾选“启用共享文件夹”、点一下“确定”,Windows 主机上的 D:\share 就能直接在 Ubuntu 虚拟机里cd /mnt/hgfs/share访问——结果报错No such file or directory;或者能进目录,但一写文件就提示Permission denied;更常见的是重启虚拟机后共享目录彻底消失。这不是操作遗漏,而是 VMware 共享机制依赖三层协同:VMware Tools 的内核模块(vmhgfs-fuse)、用户组权限(vmware组)、以及挂载策略(是否自动、是否持久)。尤其在 VMware Workstation 17+ 中,vmhgfs内核驱动已被弃用,全部转向 FUSE 用户态挂载,这意味着/mnt/hgfs不再是默认挂载点,必须显式启动服务并配置挂载逻辑。本文面向已安装 VMware Tools 但共享失败的 Linux 虚拟机用户(Ubuntu/Debian/CentOS/RockyLinux/Kali 均适用),不讲安装步骤,只拆解“为什么配了不生效”和“怎么让它每次开机都稳稳可用”。
2. VMware Tools 必须运行 vmhgfs-fuse 服务:验证、启动与自启配置
VMware Tools 在现代 Linux 发行版中不再提供内核态vmhgfs驱动,而是通过vmhgfs-fuse进程以用户空间文件系统(FUSE)方式挂载共享文件夹。如果该服务未运行,/mnt/hgfs目录即使存在也为空,且ls /mnt/hgfs返回空结果。
2.1 验证 vmhgfs-fuse 是否正在运行
在虚拟机终端执行:
ps aux | grep vmhgfs-fuse正常输出应包含类似以下行(注意--allow-other参数):
root 1234 0.0 0.1 123456 7890 ? S 10:23 0:00 /usr/bin/vmhgfs-fuse -o allow_other -o auto_unmount -o uid=1000 -o gid=1000 .host:/ /mnt/hgfs若无任何输出,说明服务未启动。此时手动启动会暴露权限问题:
sudo /usr/bin/vmhgfs-fuse -o allow_other -o auto_unmount .host:/ /mnt/hgfs提示:
-o allow_other是关键参数,它允许非 root 用户(如当前登录用户)访问挂载点;缺少此参数会导致普通用户ls /mnt/hgfs权限拒绝。-o uid=1000 -o gid=1000中的1000应替换为你的实际用户 UID/GID(用id -u和id -g查看)。
2.2 启动 vmhgfs-fuse 并加入系统服务
手动命令仅临时有效。需将其注册为 systemd 服务,确保随系统启动:
# 创建服务文件 sudo tee /etc/systemd/system/vmhgfs-fuse.service << 'EOF' [Unit] Description=VMware HGFS FUSE service After=multi-user.target [Service] Type=simple User=root ExecStart=/usr/bin/vmhgfs-fuse -o allow_other -o auto_unmount -o uid=1000 -o gid=1000 .host:/ /mnt/hgfs Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF将其中uid=1000和gid=1000替换为你自己的用户 ID(例如id -u输出1001,则写uid=1001)。保存后启用服务:
sudo systemctl daemon-reload sudo systemctl enable vmhgfs-fuse.service sudo systemctl start vmhgfs-fuse.service验证状态:
sudo systemctl status vmhgfs-fuse.service # 应显示 active (running) ls -l /mnt/hgfs # 应列出主机共享的文件夹名(如 share、Documents)2.3 检查 VMware Tools 服务状态与日志
即使vmhgfs-fuse运行,也可能因 VMware Tools 主服务异常导致挂载失败。检查核心服务:
sudo systemctl status vmtoolsd若状态为inactive (dead)或failed,需重启:
sudo systemctl restart vmtoolsd sudo systemctl enable vmtoolsd查看详细日志定位问题:
sudo journalctl -u vmtoolsd -n 50 --no-pager常见错误包括:
Failed to initialize hgfs: No such device→ 表示内核模块未加载(现代发行版无需此模块,忽略)Unable to connect to host services→ VMware Workstation 未开启共享功能或虚拟机未处于运行状态hgfs is not available→ VMware Tools 未完整安装,需重新安装(见下文补丁)
注意:VMware Workstation 17.6+ 对 Linux Guest 的 VMware Tools 分发方式变更,官方 ISO (
linux.iso) 已移除vmhgfs内核模块,但vmhgfs-fuse二进制仍包含在open-vm-tools-desktop包中。若/usr/bin/vmhgfs-fuse不存在,请先安装:
# Ubuntu/Debian sudo apt update && sudo apt install open-vm-tools-desktop fuse # RockyLinux/CentOS 8+ sudo dnf install open-vm-tools-desktop fuse # Kali Linux sudo apt update && sudo apt install open-vm-tools-desktop安装后确认二进制存在:ls -l /usr/bin/vmhgfs-fuse
3. 主机端共享设置与 Linux 端权限闭环:从 Windows 共享到虚拟机可写
共享文件夹功能是双向协同:主机必须声明共享路径并设权限,虚拟机必须有对应用户组权限才能读写。常见错误是主机设了共享,但虚拟机用户不在vmware组,或主机共享未启用“来宾访问”。
3.1 Windows 主机端共享配置要点(Win10/Win11)
右键目标文件夹 → “属性” → “共享”选项卡 → “高级共享…”
- 勾选“共享此文件夹”,共享名建议用纯英文(如
share,避免空格和中文) - 点击“权限” → 确保
Everyone或Guest有“更改”权限(仅“读取”则虚拟机无法写入)
- 勾选“共享此文件夹”,共享名建议用纯英文(如
关闭密码保护共享(关键!)
- 控制面板 → “网络和 Internet” → “网络和共享中心” → “更改高级共享设置”
- 展开“所有网络” → 将“密码保护的共享”设为“关闭密码保护共享”
提示:若保持开启,虚拟机访问时需输入 Windows 用户名密码,而 VMware 共享不支持交互式凭证输入,必然失败。这是
win11访问win7共享文件夹类问题的根源。
确认网络发现与文件共享已启用
- 同一“高级共享设置”页中,“网络发现”和“文件和打印机共享”必须为“启用”
3.2 Linux 虚拟机端用户组与挂载点权限修复
即使vmhgfs-fuse运行,若当前用户不在vmware组,仍可能遇到权限不足:
# 查看当前用户所属组 groups # 若输出不含 vmware,则添加 sudo usermod -aG vmware $USER # 生效需重新登录或重启虚拟机(或执行 newgrp vmware 临时切换)同时,确保/mnt/hgfs目录权限允许用户访问:
sudo mkdir -p /mnt/hgfs sudo chown root:vmware /mnt/hgfs sudo chmod 755 /mnt/hgfs验证挂载后权限:
ls -ld /mnt/hgfs # 应显示 drwxr-xr-x 1 root vmware ... ls -l /mnt/hgfs/share # 若仍提示 Permission denied,说明挂载时未传 uid/gid 或主机共享权限不足3.3 主机共享名映射规则与大小写敏感性
VMware 共享名在 Linux 虚拟机中严格区分大小写,且不支持空格。例如:
- 主机共享名为
My Share→ 虚拟机中路径为/mnt/hgfs/My\ Share(需转义)或/mnt/hgfs/MyShare - 主机共享名为
SHARE→ 虚拟机中必须用ls /mnt/hgfs/SHARE,share无效
建议主机端统一使用小写字母+下划线命名(如project_files),避免歧义。
| 主机共享名 | 虚拟机访问路径 | 是否推荐 |
|---|---|---|
share | /mnt/hgfs/share | ✅ 推荐 |
Share | /mnt/hgfs/Share | ⚠️ 注意大小写 |
My Documents | /mnt/hgfs/My\ Documents | ❌ 易出错,改用my_documents |
4. 解决重启后共享失效:systemd 依赖优化与挂载点持久化
cifs挂载共享文件夹重启后失效怎么办是高频问题,本质是vmhgfs-fuse服务启动早于fuse模块加载,或/mnt/hgfs目录被其他服务占用。单纯systemctl enable不足以保证可靠挂载。
4.1 修正 systemd 服务依赖关系
默认vmhgfs-fuse.service未声明对fuse的依赖,可能导致服务启动时 FUSE 模块未就绪。编辑服务文件:
sudo systemctl edit vmhgfs-fuse.service输入以下内容(覆盖原依赖):
[Unit] After=fuse.service Wants=fuse.service [Service] RestartPreventExitStatus=1保存退出后重载:
sudo systemctl daemon-reload sudo systemctl restart vmhgfs-fuse.service验证 fuse 模块已加载:
lsmod | grep fuse # 应输出 fuse 模块信息4.2 使用 /etc/fstab 实现挂载兜底(可选但推荐)
当 systemd 服务偶发失败时,fstab提供第二道保障。编辑/etc/fstab:
sudo tee -a /etc/fstab << 'EOF' .host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,uid=1000,gid=1000,auto_unmount 0 0 EOF同样替换uid=1000和gid=1000为你的实际 ID。然后测试挂载:
sudo mount -a # 无报错即成功 ls /mnt/hgfs注意:
fstab方式与vmhgfs-fuse.service并存时,需禁用服务的自动挂载,否则可能冲突。可在服务文件ExecStart行末尾加--no-syslog并确保fstab条目优先级更高(通常没问题)。
4.3 验证重启后状态的三步检查法
每次重启后,按顺序执行:
检查服务状态
systemctl is-active vmhgfs-fuse.service # 应返回 active检查挂载点是否存在且非空
mount | grep hgfs # 应显示挂载信息 ls /mnt/hgfs # 应列出共享文件夹测试读写权限
echo "test" > /mnt/hgfs/share/test.txt && cat /mnt/hgfs/share/test.txt # 成功则输出 test,失败则检查主机共享权限和用户组
若第1步失败,查journalctl -u vmhgfs-fuse.service;若第2步失败,查dmesg | tail -20看 FUSE 相关错误;若第3步失败,回到 3.1 和 3.2 节复查权限链。
5. 进阶技巧:符号链接绕过 /mnt/hgfs 路径限制与多共享目录管理
/mnt/hgfs是 VMware 强制挂载根目录,但实际开发中常需将共享文件夹映射到项目路径(如~/workspace),而非每次cd /mnt/hgfs/share。用符号链接 + 自动同步可提升效率。
5.1 创建用户级符号链接并设为默认工作区
假设主机共享名为project,希望在虚拟机中通过~/workspace访问:
# 创建链接(确保 /mnt/hgfs/project 存在) ln -sf /mnt/hgfs/project ~/workspace # 验证 ls -l ~/workspace # 应显示 workspace -> /mnt/hgfs/project # 设为默认 shell 工作目录(可选) echo 'cd ~/workspace' >> ~/.bashrc source ~/.bashrc提示:
ln -sf中的-f参数强制覆盖已存在链接,避免重复创建错误。此链接在vmhgfs-fuse服务重启后依然有效,因底层路径不变。
5.2 管理多个共享目录:动态挂载脚本
当主机配置了多个共享(如code、data、docs),手动维护/mnt/hgfs/xxx路径易出错。可编写轻量脚本自动检测并挂载:
#!/bin/bash # 保存为 /usr/local/bin/vm-share-mount.sh,赋予执行权限 SHARE_ROOT="/mnt/hgfs" USER_UID=$(id -u) USER_GID=$(id -g) # 创建挂载点 sudo mkdir -p "$SHARE_ROOT" # 检查 vmhgfs-fuse 是否运行,未运行则启动 if ! pgrep -x "vmhgfs-fuse" > /dev/null; then sudo /usr/bin/vmhgfs-fuse -o allow_other -o auto_unmount -o uid=$USER_UID -o gid=$USER_GID .host:/ "$SHARE_ROOT" fi # 为每个子目录创建用户链接(可扩展) for dir in code data docs; do if [ -d "$SHARE_ROOT/$dir" ]; then ln -sf "$SHARE_ROOT/$dir" "$HOME/$dir" fi done赋予执行权限并加入开机启动:
sudo chmod +x /usr/local/bin/vm-share-mount.sh echo '/usr/local/bin/vm-share-mount.sh' | sudo tee -a /etc/rc.local(确保/etc/rc.local存在且有执行权限;Ubuntu 22.04+ 需启用rc-local.service)
5.3 权限调试终极命令:strace 定位挂载失败原因
当一切配置看似正确却仍无法访问,用strace追踪系统调用:
sudo strace -e trace=openat,stat,mount -f /usr/bin/vmhgfs-fuse -o allow_other .host:/ /mnt/hgfs 2>&1 | grep -E "(openat|mount|stat)"输出中若出现openat(AT_FDCWD, "/dev/fuse", O_RDWR) = -1 ENOENT,说明 FUSE 模块未加载;若出现mount("none", "/mnt/hgfs", "fuse.vmhgfs-fuse", ...)后跟= -1 EBUSY,说明挂载点被占用;若stat("/mnt/hgfs")返回-1 ENOENT,说明目录未创建。每条线索直指具体故障层。
最终验证:在虚拟机中touch /mnt/hgfs/share/from_vm.txt,立即在 Windows 主机对应文件夹中看到该文件,且属性显示为你的 Windows 用户名 —— 此时共享链路完全打通。
本文还有配套的精品资源,点击获取