news 2026/8/6 12:45:50

Ubuntu 22.04 VMware共享文件夹挂载失败:vmhgfs-fuse完整解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu 22.04 VMware共享文件夹挂载失败:vmhgfs-fuse完整解决方案

1. 问题场景与核心痛点

如果你正在用VMware Workstation或Fusion跑Ubuntu 22.04,并且像我一样,习惯在虚拟机和宿主机之间设置一个共享文件夹来传文件、共享代码,那你大概率踩过这个坑:在Ubuntu的/mnt/hgfs目录下,那个你明明在VMware设置里勾选并启用的共享文件夹,空空如也,什么也找不到。

这问题在Ubuntu 22.04上尤其常见。我自己的几台开发机和给团队配置的环境都遇到过,症状很一致:VMware Tools显示已安装,共享文件夹功能在虚拟机设置里也启用了,甚至用vmware-hgfsclient命令都能看到共享名,但就是挂载不上,/mnt/hgfs目录里要么是空的,要么压根没这个目录。这直接打断了开发流,代码同步、数据交换都得绕道,效率大打折扣。

问题的根源,通常不在VMware Tools本身是否安装成功,而在于一个关键的驱动模块:vmhgfs-fuse。在Ubuntu 22.04这个较新的LTS版本中,内核更新比较快,而VMware Tools内置的vmhgfs内核模块有时会因为内核版本不兼容而编译失败或加载失败。作为备用方案的FUSE(用户空间文件系统)实现vmhgfs-fuse,就成了解决问题的关键。但很多时候,它要么没被正确安装,要么权限配置有问题,要么就是挂载命令没执行。

接下来,我会把解决这个问题的完整流程拆解开,从诊断到解决,包括几种不同情况下的应对策略。无论你是刚装好系统就遇到,还是某次系统更新后突然失效,都能在这里找到对应的解法。

2. 诊断与排查:定位问题究竟出在哪一步

盲目操作不如先精准定位。当共享文件夹消失时,我们需要像外科手术一样,一步步检查各个环节是否通畅。

2.1 第一步:确认VMware基础设置与共享状态

首先,确保问题不是出在最初的配置上。关闭Ubuntu虚拟机(如果正在运行),回到VMware的虚拟机设置界面。

  1. 检查共享文件夹设置:在“选项” -> “共享文件夹”中,确认状态是“始终启用”(对于Workstation)或“已启用”(对于Fusion)。检查你指定的主机路径是否存在且有正确权限。一个常见的低级错误是指向了不存在的目录或受系统保护的目录(如某些系统盘根目录),VMware可能会静默失败。
  2. 验证文件夹列表:在同一个界面,确保你想要共享的文件夹已经添加在列表里,并且名称没有使用特殊字符或空格(虽然理论上支持,但避免使用可以省去很多麻烦)。

注意:如果你是在虚拟机运行期间修改了共享文件夹设置(比如新增了一个),通常需要重启虚拟机或者至少重新启动VMware Tools服务才能生效,但最稳妥的方式还是先关机再修改设置。

2.2 第二步:在Ubuntu内部进行初步诊断

启动Ubuntu虚拟机,打开终端。我们将使用几个命令来探查虚实。

  1. 检查VMware Tools核心服务

    systemctl status vmware-tools.service

    如果服务是active (running)状态,说明基础服务正常。如果没启动,尝试sudo systemctl start vmware-tools.service。如果这个服务本身就不存在,那可能意味着VMware Tools没有安装完整,我们后续需要重新安装或补充组件。

  2. 探测VMware识别的共享名: 这是非常关键的一步。VMware Tools提供了一个命令,用来列出宿主机共享给当前虚拟机的文件夹名称。

    /usr/bin/vmware-hgfsclient

    如果这个命令返回了你之前在VMware设置中命名的共享文件夹名称(例如myshare),那么恭喜,至少VMware层面的通信和识别是正常的,问题很可能出在Ubuntu内部的挂载环节。如果这个命令没有任何输出,或者报错“找不到命令”,那就说明要么共享根本没启用,要么VMware Tools的HGFS(Host-Guest File System)组件有问题。

  3. 检查传统的挂载点

    ls -la /mnt/hgfs/

    查看/mnt/hgfs目录是否存在,以及其内容。如果目录不存在,那挂载肯定失败了。如果目录存在但为空,而vmware-hgfsclient有输出,则说明驱动或挂载过程有问题。

2.3 第三步:深入检查内核模块与FUSE驱动

这是区分问题类型的关键。

  1. 检查内核模块vmhgfs

    lsmod | grep vmhgfs

    这个命令查看vmhgfs内核模块是否被加载。在Ubuntu 22.04上,由于内核较新,这个模块经常因为签名问题或版本不匹配而加载失败。如果这里没有输出,说明内核模块没加载。可以尝试手动加载:

    sudo modprobe vmhgfs

    如果成功,再用lsmod | grep vmhgfs确认。但大概率你会看到类似“未找到模块”或“操作不允许”的错误。这很正常,也指引我们走向FUSE方案。

  2. 检查FUSE替代方案vmhgfs-fuse: 既然内核模块可能不行,我们就依赖用户空间的FUSE驱动。

    which vmhgfs-fuse

    或者

    dpkg -l | grep vmware-tools

    查看vmhgfs-fuse包是否已安装。在较新版本的VMware Tools(或Open VM Tools)中,vmhgfs-fuse是一个独立的包。如果which命令没有返回路径(如/usr/bin/vmhgfs-fuse),或者dpkg列表里没有vmware-toolsopen-vm-tools-desktop(通常包含fuse组件),那么我们就需要安装它。

通过以上三步,你基本可以确定问题所在:

  • 场景Avmware-hgfsclient有输出,但/mnt/hgfs为空或不存在。vmhgfs模块未加载,且vmhgfs-fuse可能未安装或未运行。这是最常见的情况
  • 场景Bvmware-hgfsclient无输出。说明VMware Tools的HGFS客户端功能未正常工作,可能需要彻底重装或修复VMware Tools。
  • 场景C:一切看起来都正常(服务、模块、命令),但就是访问不了。这可能是权限问题SELinux/AppArmor安全模块的干扰(在Ubuntu上主要是AppArmor)。

3. 解决方案一:安装并配置vmhgfs-fuse(最主流解法)

对于大多数Ubuntu 22.04用户,尤其是使用VMware Workstation 16+或Fusion 12+的,解决共享文件夹问题的核心就是正确安装和使用vmhgfs-fuse

3.1 安装必要的软件包

首先,更新软件包列表并安装open-vm-tools-desktopfuse。Open VM Tools是VMware Tools的开源实现,在Ubuntu仓库中维护得更好,与系统内核兼容性更佳。

sudo apt update sudo apt install open-vm-tools-desktop fuse

open-vm-tools-desktop这个包已经包含了open-vm-tools(基础服务)和open-vm-tools-desktop(图形界面和剪贴板、拖放等增强功能所需的组件),通常也会依赖或包含vmhgfs-fuse。安装fuse是确保FUSE用户空间框架可用。

安装完成后,确认vmhgfs-fuse工具已就位:

which vmhgfs-fuse # 应该输出类似 /usr/bin/vmhgfs-fuse

3.2 手动挂载共享文件夹

安装好工具后,我们尝试手动挂载。这能帮助我们验证功能是否正常,并排除自动挂载脚本的问题。

  1. 创建挂载点(如果不存在):

    sudo mkdir -p /mnt/hgfs

    -p参数确保如果父目录不存在则一并创建。

  2. 执行手动挂载: 使用vmhgfs-fuse命令进行挂载。这里需要知道你的共享名(通过vmware-hgfsclient获取,假设为myshare)。

    sudo /usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid=1000 -o gid=1000 -o umask=022
    • .host:/:这是一个固定的源路径格式,代表从宿主机共享的所有文件夹。
    • /mnt/hgfs:目标挂载点。
    • -o allow_other:允许非root用户(即你自己的账户)访问这个挂载点。这是解决“权限被拒绝”的关键选项
    • -o uid=1000 -o gid=1000:将挂载的文件系统所有权设置为你的普通用户(Ubuntu默认第一个用户的UID和GID通常是1000)。这样你就不用每次都sudo来读写文件了。
    • -o umask=022:设置创建文件和目录的默认权限掩码(对应目录755,文件644)。
  3. 验证挂载

    mount | grep hgfs

    你应该能看到一行关于vmhgfs-fuse的挂载记录。 然后检查目录内容:

    ls -l /mnt/hgfs/

    如果看到了你的共享名myshare,并且能访问其中的文件,那么恭喜,手动挂载成功!

3.3 配置自动挂载(实现开机即用)

手动挂载每次重启都会失效。我们需要配置系统在启动时自动完成这个操作。有两种主流方法:修改/etc/fstab文件,或者创建一个systemd服务单元。这里推荐使用/etc/fstab,因为它更标准、更简洁。

  1. 编辑/etc/fstab文件

    sudo nano /etc/fstab

    在文件末尾添加一行:

    .host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,uid=1000,gid=1000,umask=022,nofail 0 0
    • fuse.vmhgfs-fuse:指定文件系统类型。
    • nofail:这个选项非常重要。它表示即使挂载失败(例如在非VMware环境启动),系统也不会因此卡住而无法启动。
    • 最后的两个0是关于文件系统检查(fsck)和挂载顺序的,对于FUSE文件系统通常设为0。

    实操心得:务必加上nofail选项。我曾经在物理机(非虚拟机)上启动一个曾经是虚拟机的系统镜像,就因为忘了这个选项,导致系统启动时在/mnt/hgfs处等待超时,进入紧急恢复模式。加上nofail就安全多了。

  2. 测试fstab配置并应用: 在重启前,可以先测试一下这个配置是否能正确挂载:

    sudo umount /mnt/hgfs # 先卸载之前的手动挂载 sudo mount -a

    mount -a会尝试挂载/etc/fstab中所有未挂载的文件系统。如果没有报错,再用ls /mnt/hgfs检查是否成功。

  3. 重启验证

    sudo reboot

    重启后,直接检查/mnt/hgfs目录,共享文件夹应该已经在了。

4. 解决方案二:处理内核模块问题与重装VMware Tools

如果vmhgfs-fuse方案对你无效,或者你出于性能考虑(内核模块理论上性能略好于FUSE)希望修复内核模块,可以尝试这个路径。

4.1 编译或修复vmhgfs内核模块

有时,VMware Tools安装程序编译的内核模块与当前运行的内核不匹配。我们可以尝试重新编译。

  1. 确保已安装内核头文件

    sudo apt install linux-headers-$(uname -r) build-essential
  2. 找到VMware Tools的安装目录并重新编译: VMware Tools通常安装在/usr/lib/vmware-tools/opt/vmware-tools。对于使用Open VM Tools的情况,可能需要重新配置。 一个更直接的方法是使用VMware自带的vmware-config-tools.pl脚本(如果存在):

    sudo /usr/bin/vmware-config-tools.pl

    或者,如果使用的是从VMware下载的.tar.gz格式的Tools:

    cd /path/to/vmware-tools-distrib sudo ./vmware-install.pl

    在安装/配置过程中,脚本会检测内核并尝试重新编译所有模块,包括vmhgfs

    注意事项:这个过程可能会因为内核版本太新而失败,并提示找不到合适的源或签名密钥。这正是Ubuntu 22.04上内核模块方案经常失效的原因。如果失败,不必纠结,坚定地使用方案一的FUSE方法。

4.2 完全重装Open VM Tools(推荐)

对于大多数从仓库安装的情况,彻底清理并重装Open VM Tools是更干净的做法。

  1. 彻底移除旧组件

    sudo apt purge open-vm-tools open-vm-tools-desktop vmware-tools vmware-tools-* sudo apt autoremove sudo rm -rf /etc/vmware-tools /usr/lib/vmware-tools # 谨慎操作,确认目录存在
  2. 重新安装

    sudo apt update sudo apt install open-vm-tools-desktop
  3. 重启服务并验证

    sudo systemctl restart open-vm-tools sudo systemctl status open-vm-tools

    然后再次执行vmware-hgfsclient和手动挂载vmhgfs-fuse的步骤。

5. 解决方案三:排查权限与安全模块问题

当文件和工具都就位,但访问依然被拒绝时,就要考虑权限和安全策略了。

5.1 用户组权限检查

确保你的用户账户在必要的组里,主要是fuse组。

  1. 将用户加入fuse

    sudo usermod -aG fuse $USER

    -aG表示追加(append)到(Group),不会移除其他组。

  2. 生效组变更: 你需要完全注销并重新登录,或者开启一个新的登录会话(例如新建一个终端窗口,但最好重启会话),新的组权限才会生效。

  3. 检查挂载点权限

    ls -ld /mnt/hgfs

    确保挂载点目录的权限对你(uid=1000)是可读可执行的(至少drwxr-xr-x)。

5.2 处理AppArmor限制(Ubuntu特有)

Ubuntu默认启用了AppArmor,这是一个强制访问控制(MAC)系统,可能会限制vmhgfs-fuse的行为。

  1. 检查是否有AppArmor报错

    sudo dmesg | grep -i apparmor | grep -i vmhgfs 或 sudo journalctl -xe | grep -i apparmor | grep -i fuse

    如果看到关于vmhgfs-fusefuse的拒绝(DENIED)信息,说明AppArmor在干预。

  2. 调整AppArmor配置: 编辑AppArmor对于fuse的配置:

    sudo nano /etc/apparmor.d/abstractions/fuse

    在这个文件中,寻找与挂载或路径相关的规则。一个比较激进但有效的临时测试方法是,在文件末尾添加:

    /mnt/hgfs/** rw,

    或者,直接禁用一个可能相关的配置(不推荐长期使用):

    sudo ln -s /etc/apparmor.d/usr.bin.fusermount /etc/apparmor.d/disable/ sudo apparmor_parser -R /etc/apparmor.d/usr.bin.fusermount

    更安全且推荐的做法是,如果问题确实由AppArmor引起,可以尝试将vmhgfs-fuse的挂载命令包装在一个不受限制的上下文中,或者为它创建一个自定义的AppArmor profile。但对于大多数个人开发环境,如果上述allow_other和用户组设置正确,AppArmor通常不会阻拦。

  3. 重启AppArmor服务: 修改配置后,需要重载AppArmor:

    sudo systemctl reload apparmor

6. 高级调试与故障排除实录

即使按照上述步骤操作,你可能还是会遇到一些“诡异”的情况。这里记录几个我实际踩过的坑和对应的排查思路。

6.1 情况一:挂载成功但文件不可见或无法访问

症状mount命令显示已挂载,/mnt/hgfs目录也存在,但ls查看是空的,或者访问时提示“权限不够”。

排查与解决

  1. 检查挂载选项:再次确认挂载命令或/etc/fstab中是否包含了allow_other和正确的uid/gid。缺少allow_other是非root用户无法访问的最常见原因。
  2. 验证宿主机共享文件夹权限:回到Windows或macOS宿主机,检查你共享的那个文件夹,确保其安全设置允许“Everyone”或你的当前用户至少具有“读取”权限。有时虚拟机是以一个特定的系统账户访问宿主机文件的。
  3. 使用debug选项挂载:为了获取更详细的错误信息,可以尝试以debug模式挂载,并将输出重定向到文件:
    sudo /usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other,uid=1000,gid=1000,debug
    然后尝试访问目录,查看系统日志sudo dmesg -Tsudo journalctl -f中是否有来自fusevmhgfs的错误信息。

6.2 情况二:系统升级(如内核更新)后共享文件夹失效

症状:某次执行sudo apt upgrade并重启后,共享文件夹没了。

原因与解决:这通常是内核升级后,原先为旧内核编译的vmhgfs内核模块失效,而自动挂载脚本(如果依赖内核模块)也失败了。

  • 如果使用FUSE方案:这种情况影响较小。只需确保open-vm-tools-desktopfuse包在升级后仍然安装,并且/etc/fstab中的自动挂载配置还在。重启后,FUSE驱动会重新工作。
  • 如果依赖内核模块:你需要按照4.1节的方法,重新运行VMware Tools配置脚本(如vmware-config-tools.pl)来为新内核编译模块。这也是为什么我强烈推荐FUSE方案——它不依赖特定内核版本,更稳定。

6.3 情况三:vmware-hgfsclient命令本身报错或不存在

症状:执行/usr/bin/vmware-hgfsclient时提示“命令未找到”或执行后报错。

解决

  1. 命令未找到:说明VMware Tools的HGFS客户端组件没有安装。通过安装open-vm-tools-desktop包来解决。
  2. 命令报错:例如提示“未能检索共享文件夹列表”。这通常意味着VMware Tools服务通信有问题。
    • 首先检查vmware-toolsopen-vm-tools服务状态(systemctl status)。
    • 尝试重启服务:sudo systemctl restart open-vm-tools
    • 最极端的情况下,关闭虚拟机,在VMware设置中先禁用共享文件夹,应用,再重新启用共享文件夹,然后启动虚拟机。这相当于重置了宿主机端的共享服务。

6.4 一个快速的一键诊断与修复脚本

为了方便,我把关键诊断和修复步骤整合成了一个Shell脚本。你可以保存为fix_vmware_share.sh,并赋予执行权限(chmod +x fix_vmware_share.sh),在遇到问题时以sudo权限运行它。它会引导你进行诊断并尝试修复。

#!/bin/bash # 诊断和修复VMware共享文件夹问题的脚本 echo "=== VMware共享文件夹诊断与修复工具 ===" echo "" # 1. 检查服务 echo "[1] 检查VMware Tools服务状态..." if systemctl is-active --quiet open-vm-tools 2>/dev/null || systemctl is-active --quiet vmware-tools 2>/dev/null; then echo " 服务正在运行。" else echo " 服务未运行,正在尝试启动..." sudo systemctl start open-vm-tools 2>/dev/null || sudo systemctl start vmware-tools 2>/dev/null fi # 2. 检查共享列表 echo "" echo "[2] 检查宿主机共享的文件夹列表..." if command -v vmware-hgfsclient &> /dev/null; then SHARES=$(vmware-hgfsclient 2>/dev/null) if [ -n "$SHARES" ]; then echo " 检测到共享文件夹: $SHARES" else echo " 警告:未检测到任何共享文件夹。请确认VMware设置中已启用共享。" fi else echo " 错误:vmware-hgfsclient 命令未找到。可能需要安装 open-vm-tools-desktop。" fi # 3. 检查挂载点 echo "" echo "[3] 检查 /mnt/hgfs 挂载点..." if [ -d "/mnt/hgfs" ]; then echo " 目录 /mnt/hgfs 存在。" MOUNT_INFO=$(mount | grep hgfs) if [ -n "$MOUNT_INFO" ]; then echo " 已挂载: $MOUNT_INFO" else echo " 目录存在,但未挂载任何内容。" fi else echo " 目录 /mnt/hgfs 不存在,正在创建..." sudo mkdir -p /mnt/hgfs sudo chown $USER:$USER /mnt/hgfs 2>/dev/null || true fi # 4. 检查并安装必要软件包 echo "" echo "[4] 检查 vmhgfs-fuse 和 fuse..." if ! command -v vmhgfs-fuse &> /dev/null; then echo " vmhgfs-fuse 未安装,正在尝试安装 open-vm-tools-desktop 和 fuse..." sudo apt update && sudo apt install -y open-vm-tools-desktop fuse else echo " vmhgfs-fuse 已安装。" fi # 5. 尝试手动挂载 echo "" echo "[5] 尝试手动挂载共享文件夹..." if [ -n "$SHARES" ] && command -v vmhgfs-fuse &> /dev/null; then echo " 正在尝试挂载 .host:/ 到 /mnt/hgfs ..." sudo umount /mnt/hgfs 2>/dev/null # 先尝试卸载 sudo /usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid=$(id -u) -o gid=$(id -g) -o umask=022 if [ $? -eq 0 ]; then echo " 手动挂载成功!" echo " 共享文件夹内容:" ls -la /mnt/hgfs/ else echo " 手动挂载失败。请检查上方错误信息。" fi else echo " 跳过手动挂载(缺少共享信息或vmhgfs-fuse命令)。" fi # 6. 建议配置自动挂载 echo "" echo "=== 建议后续步骤 ===" echo "如果手动挂载成功,建议将其添加到 /etc/fstab 以实现开机自动挂载。" echo "可以添加如下行(请使用 sudo 编辑 /etc/fstab):" echo ".host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,uid=$(id -u),gid=$(id -g),umask=022,nofail 0 0" echo "" echo "脚本执行完毕。请根据上述输出信息进一步排查。"

这个脚本能自动化完成大部分检查工作和基础修复,并给出明确的后续操作建议,非常适合在遇到问题时快速运行一遍,定位问题环节。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 7:16:40

小学生学C++编程语法知识(为什么 class 需要封装?)

C面向对象核心:为什么 class 需要封装?同学们,上节课我们学习了:struct 和 class 的区别我们知道:class默认:private也就是:自己的数据,别人不能随便修改。那么问题来了:…

作者头像 李华
网站建设 2026/8/5 7:14:44

MySQL 8.0 源码编译安装与深度调优实战指南

1. 项目概述:为什么选择源码安装MySQL?在数据库运维和开发领域,MySQL的安装几乎是每个从业者的必修课。市面上充斥着各种一键安装包、Docker镜像和系统包管理器(如yum、apt)的安装教程,它们确实方便快捷&am…

作者头像 李华
网站建设 2026/8/5 7:13:38

KeyShot渲染软件完整安装配置指南:从系统准备到SolidWorks插件集成

1. 从“安装”到“高效使用”:一个渲染新手的完整入门指南最近在几个设计交流群里,看到不少朋友都在问关于KeyShot安装的问题。有人卡在许可证激活,有人装完发现材质库是空的,还有人和SolidWorks联动不起来。这让我想起自己几年前…

作者头像 李华
网站建设 2026/8/5 7:13:20

从“小球落地”问题解析动态规划与图论建模的竞赛思维

1. 项目概述与核心思路最近在带几个准备CSP-S复赛的学生集训,发现他们对于动态规划和图论这两大核心模块的理解,总是停留在“背模板”的阶段。一遇到稍微变化一点的题目,比如把经典的“爬楼梯”问题换个场景,或者在图论里加个条件…

作者头像 李华
网站建设 2026/8/5 7:12:08

Wi-Fi 7核心技术解析:从MLO、4096-QAM到Ubuntu适配指南

1. 从WIFI6到WIFI7:我们到底在期待什么?最近几年,每次Wi-Fi协议的迭代升级都能引起一阵不小的讨论。从Wi-Fi 5(802.11ac)到Wi-Fi 6(802.11ax),我们体验到了更快的速度、更好的多设备…

作者头像 李华