我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

VMware虚拟机与主机共享文件夹设置全指南:从Tools到HGFS

VMware虚拟机与主机共享文件夹设置全指南:从Tools到HGFS 每次有人跑来问我在VMware里怎么给虚拟机传文件我基本都会先反问一句你现在是怎么传的得到的答案要么是拖拽要么是做个ISO镜像挂载要么干脆走网盘中转。这些方法不是不能用而是遇到大文件、高频同步、开发调试这类场景就会露馅。今天这篇就是老话题重讲聊聊在主机和本地VMware虚拟机之间用共享文件夹传输文件这件事把设置步骤、挂载点、权限处理这些坑一次性说透。写它的原因是这套操作在Windows和Linux客户机里我都反复折腾过适合正在用VMware Workstation/Pro跑虚拟机的人尤其是做开发、测系统镜像的新手。先说结论共享文件夹是VMware里被低估得最严重的功能之一。它在主机和虚拟机之间建立一条“直通目录”通道两边看到的几乎是同一份数据不用复制、不用同步、不用走网络比U盘、光盘镜像、FTP这些土办法靠谱太多。接下来我从方案选型开始讲把原理、步骤、坑全捋一遍。1. 为什么选共享文件夹几种文件传输方式的对比1.1 拖拽与复制粘贴小文件还行大文件就崩VMware Workstation从很早的版本开始就支持在主机和客户机之间直接拖拽文件同时也支持复制粘贴文本和文件。这个功能刚出来的时候确实惊艳很多人包括我一开始都是用这个方式传文件的。但用久了就会发现拖拽这个方案有三个明显的短板。第一它本质上依赖VMware Tools提供的一个扩展剪贴板通道走的不是专门的文件传输通道而是把文件内容通过内存中转。小文件比如几个文本、截图、PDF完全没问题但一旦文件上了1GB甚至更大拖拽就会变得非常不稳定进度条经常卡住甚至会直接失败客户端里显示复制了个寂寞。第二从虚拟机往主机拖文件有时候根本没反应尤其是Linux客户机里需要在文件管理器里再走一遍复制粘贴操作很别扭。第三拖拽是“一次性”的如果你改了文件又得重新拖一遍根本没有“同步”的概念。所以我的判断是拖拽适合传小东西偶尔用用还挺方便但拿它当主力传输方案早晚会翻车。1.2 共享文件夹的核心优势不是网盘是直通目录VMware的共享文件夹走的是另一套机制官方叫法叫HGFSHost-Guest File System。你可以把它理解成VMware在客户机里虚拟出了一个文件系统服务主机的某个目录直接被“映射”到虚拟机里客户机访问这个目录就像访问本地磁盘一样。关键区别在于它是“直通”的不是“复制”的。你在主机共享目录里新建一个文件虚拟机里立刻能看到反过来你在虚拟机里修改了共享目录里的文件主机这边也是实时变更。这种双向实时同步的特性让共享文件夹特别适合跑开发、放安装包、存临时数据这类场景。我平时写代码就经常把workspace放到共享目录里主机上用IDE写虚拟机里直接跑编译两边不会出现版本不一致的问题。另外一个容易被忽略的点是共享文件夹传输文件不依赖网络。你不需要配置IP地址、不用管NAT还是桥接、不用想着开SMB服务。这就意味着即使你的虚拟机网络配置出问题共享文件夹照样能用排查问题的维度少了一大截。1.3 什么时候不该用共享文件夹再说句公道话共享文件夹也不是万能的有些场景我建议还是别用它。第一超大文件传输。如果你要在主机和虚拟机之间搬十几个GB的文件共享文件夹能用但速度不一定会让你满意。受限于HGFS驱动的IO效率有时候还不如直接把文件拷进虚拟磁盘里快。遇到这种场景我更推荐关机后直接用VMware的虚拟磁盘映射功能或者把磁盘文件挂载出来拷贝速度更稳。第二对IO性能要求极高的场景。比如虚拟机里跑数据库、跑大数据测试千万别把数据文件放在共享目录里。共享目录的读写路径比本地虚拟磁盘多了一层延迟和吞吐都打了折扣跑高负载任务的时候你会明显感觉到慢严重的还可能把主机IO拖垮。第三多台虚拟机并发读写同一个共享目录。虽然技术上支持但如果你没有一个完善的并发控制方案很容易出现文件锁冲突、数据覆盖这类问题。这种情况更适合用真正的网络共享或者版本控制工具。我整理了一个简单的对比表方便按场景选方案方式速度稳定性实时同步依赖网络适用场景拖拽复制慢低否否小文件临时传输共享文件夹中高是否日常开发、安装包、文档双向同步SMB/CIFS共享中高是是跨虚拟机、跨主机网络共享ISO光盘镜像慢高否否一次性批量拷贝软件、驱动磁盘映射快高否否大文件整盘拷贝2. 搭建前的准备VMware Tools是共享文件夹的前提2.1 VMware Tools到底负责什么很多人对VMware Tools的认知停留在“装了鼠标就能在虚拟机里进进出出”的层面其实它不只是鼠标驱动。VMware Tools是一个组件集合至少包含显示驱动、鼠标驱动、剪贴板共享、时间同步服务以及HGFS文件系统客户端。共享文件夹功能能够启用靠的正是HGFS这个组件。换句话说如果你的虚拟机还没装VMware Tools或者Tools装得不完整那么就算你在主机侧把共享文件夹选项折腾出花来虚拟机里也看不到共享目录。这个前置条件卡住了很多人——他们明明在设置里添加了共享文件夹进虚拟机一看就是什么都没有最后排查下来才发现Tools没装好。所以在动共享文件夹设置之前先把Tools确认好这是整个操作的基础。注意这里的“装好”不是指安装包运行一次就完事而是虚拟机里对应的服务已经正常运行后面会讲怎么看。2.2 Windows客户机的安装细节在VMware Workstation里装Windows客户机的Tools是最简单的情况。打开虚拟机在菜单栏选择“虚拟机” → “安装VMware Tools”这时候虚拟机里会弹出一个虚拟光驱里面放着Tools安装包。在Windows客户机里打开光驱找到setup64.exe64位系统或者setup.exe32位系统右键以管理员身份运行一路Next就完事装完重启虚拟机。这里有几个细节值得注意。一是如果虚拟机里开着杀毒软件或者系统加固工具建议先临时关掉否则安装程序写入驱动文件的时候容易被拦截装到一半报错。二是如果你用的是Windows 7这类老系统装新版VMware Tools比如Workstation 17自带的Tools大概率会失败因为新版Tools依赖的运行时组件在老系统里缺失。这种情况下要么先把系统补丁打全要么去VMware官网下载对应老版本的Tools安装包。三是安装完成后重启虚拟机然后在Windows的服务管理器里确认一下能看到VMware Tools服务在运行且启动类型为自动才算真正装好。2.3 Linux客户机优先用open-vm-toolsLinux客户机的情况略微特殊。早期要在Linux里装VMware Tools需要从虚拟光驱挂载安装包然后执行vmware-install.pl脚本这个脚本会调用本地的gcc和内核头文件来编译内核模块。问题在于很多Linux发行版默认没装gcc和kernel-devel导致编译失败新手经常卡在这一步。现在有了更好的选择——open-vm-tools。这是VMware官方和Linux社区共同维护的开源版Tools直接集成在主流发行版的软件源里装起来一行命令的事不用编译、不用管理内核模块省心太多。Ubuntu/Debian/Kali这类基于Debian的系统执行sudo apt update sudo apt install open-vm-tools open-vm-tools-desktopRocky Linux/CentOS/Fedora这类基于RHEL的系统执行sudo dnf install open-vm-tools open-vm-tools-desktop这里解释一下为什么还要装open-vm-tools-desktop。如果你跑的是带桌面的Linux这个包会额外提供显示驱动、剪贴板共享等功能如果只是纯命令行的服务器版装open-vm-tools就够了desktop包那部分功能用不上。装完之后不需要马上重启但建议重启一次让服务完整加载然后用systemctl status vmtoolsd确认状态是active。3. 核心实操Workstation 17里设置共享文件夹3.1 主机侧设置找到选项、勾对参数确认VMware Tools正常之后接下来就是在主机侧把共享文件夹打开。我以VMware Workstation Pro 17为例其他版本界面基本一样只是细节位置略有差别。先关闭虚拟机。不是挂起是真正的关机Shut Down因为某些设置项在虚拟机运行时改不了。关机后在虚拟机列表里右键虚拟机选择“设置”进入“选项”选项卡找到“共享文件夹”这一项。这里有几个选项我逐个解释。文件夹共享的启用方式一定要选“总是启用”。有些朋友觉得选“下次开机时启用”和“总是启用”差不多其实差别大了。选了前者这次会话共享可能不会生效往往要等到虚拟机再次重启才挂载而且很多人选完之后就忘了这回事还以为设置错了。我建议直接选“总是启用”一劳永逸。然后点“添加”选择一个主机目录。注意目录路径不要带中文、不要带空格尽量保持简单的英文路径比如D:\shared、/home/xxx/shared。这不是玄学是老版本HGFS驱动对特殊字符处理不友好踩过这个坑的人不少。在“名称”这里可以给这个共享起一个虚拟机内显示用的名字比如shared、workspace。这个名字在虚拟机的挂载路径里会用到建议也用英文短名。然后勾选“启用此共享”。这里还有个“只读”选项需要重点理解一下如果只勾只读虚拟机里只能读主机目录里的文件不能创建和修改平时开发调试建议不要勾直接开读写。只有一种情况我建议勾只读就是你只想单向分发文件给虚拟机防止虚拟机误修改主机上的原始文件。设置完之后点确定保存。3.2 Windows客户机访问\vmware-host\Shared FoldersWindows客户机里访问共享文件夹是最直观的。打开文件资源管理器在地址栏输入\\vmware-host\Shared Folders回车之后就能看到你在主机侧添加的所有共享目录进去就是那几个文件夹直接用就行。解释一下这个路径的来历方便你以后排查问题。HGFS服务在客户机里虚拟了一个主机名为vmware-host的入口服务名固定叫Shared Folders后面跟上你设置的共享名称就构成了完整的访问路径。如果以后再问“我的共享文件夹在Windows里到底在哪”这个路径就是答案。如果你觉得每次输地址太麻烦有两种优化方式。第一种右键“网络”或者“此电脑”选择“映射网络驱动器”把\vmware-host\Shared Folders\共享名称映射成一个盘符比如Z盘以后在资源管理器里直接点Z盘就能进。第二种在VMware设置共享文件夹时勾选“在Windows客户机中映射为网络驱动器”但它默认映射的是所有共享目录的根路径不如自己手动映射更灵活。需要留意的是如果你在虚拟机的资源管理器里看不到共享文件夹可以先在地址栏手动输入上面的路径试试。很多时候刷新一下或者重新映射一次就好了不一定是配置问题。3.3 Linux客户机访问vmhgfs-fuse挂载Linux客户机的情况要稍微动手。新版open-vm-tools在部分发行版里会自动挂载共享目录到/mnt/hgfs但依赖系统对FUSE挂载的处理方式很多情况下并不会自动挂载需要你手动来一次。先把基础命令跑一遍。首先确认主机侧共享是否可见用vmware-hgfsclient查看vmware-hgfsclient如果这个命令有输出说明虚拟机已经识别到了主机共享目录如果没输出先别往下走回到3.1去检查共享设置和Tools状态。然后创建挂载点并执行挂载sudo mkdir -p /mnt/hgfs sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid1000,gid1000逐项解释一下这行命令。.host:/表示主机共享目录的根路径后面可以接具体的共享名称比如.host:/shared表示只挂载名为shared的共享目录如果不写共享名就是把所有共享目录都挂载到/mnt/hgfs下面路径里直接用目录名区分。allow_other参数允许非root用户也能访问挂载点不然只有root能进。uid和gid参数很关键把挂载后的文件归属映射到当前普通用户否则你以普通用户进去操作文件会因为权限不足报Permission denied。uid值可以用id -u查询gid用id -g大部分个人Linux桌面环境都是1000。挂载完之后进入/mnt/hgfs就能看到共享目录里的文件了。如果需要开机自动挂载可以追加一行到/etc/fstab.host:/ /mnt/hgfs fuse.vmhgfs-fuse defaults,allow_other,uid1000,gid1000 0 0这里注意两点。一是fstab的选项里不再写-o二是加了这个配置后开机时如果HGFS服务还没准备好挂载可能失败所以提示“Resource busy”或者“not ready”之类的问题时可以手动再执行一次挂载命令临时解决。有些老文章会教用mount -t vmhgfs .host:/ /mnt/hgfs这种传统内核模块挂载方式在新版内核里兼容性越来越差经常因为内核模块编译失败导致挂载不成功。我的建议是统一用vmhgfs-fuse也就是FUSE版本省心得多。4. 常见问题与排查技巧实录4.1 VMware Tools安装脚本运行失败的经典报错很多人在安装或更新VMware Tools时会看到一个经典报错原文大概是“VMware Tools 继续运行脚本未能在虚拟机中成功运行。如果您在此虚拟机中配置了自定义脚本请确保...”这类提示。第一次遇到的人容易慌以为Tools装失败了其实这行提示真正想说的是Tools安装程序的主体文件已经装好了但安装完成后的“自定义脚本”环节没执行成功。在Windows客户机里常见原因有三个一是安装包不完整或者被杀毒软件拦截导致安装过程中的某个驱动注册失败二是系统账户权限不够安装脚本需要管理员权限却没拿到三是老系统与新版Tools不兼容比如Windows 7装新版Tools时经常出现这种情况。排查思路很简单先用管理员身份重新运行安装包安装前暂时关闭杀毒软件实时防护如果还不行检查系统更新。在Linux客户机里这个报错更多出现在你手动运行官方vmware-install.pl脚本的场景。脚本后半段会调用perl解释器执行一些辅助配置如果系统里没装perl就会报这个错。解决方法是先补上perl再重装sudo apt install perl但说实话到了现在这个阶段Linux客户机真没必要再折腾官方Tools了直接用open-vm-tools根本不会走到编译脚本那一步这个问题自然就绕开了。4.2 共享文件夹设置了却看不到灰菜单与空目录“设置里明明添加了共享文件夹虚拟机里怎么找不到”这是被问得最多的问题。排查路径基本按照下面这条线走。第一步检查共享文件夹设置里的启用状态是“总是启用”还是“下次开机启用”。如果是后者别折腾了改成“总是启用”再关机重启虚拟机。第二步确认VMware Tools的服务状态。Windows客户机看服务管理器里VMware Tools服务是否在运行Linux客户机看systemctl status vmtoolsd。服务没起来后面的都白搭。第三步针对Linux客户机重点看一眼/mnt/hgfs这个目录是否存在。很多发行版默认没有这个目录你需要自己mkdir创建。再配合vmware-hgfsclient命令确认主机共享是否可见如果命令有输出但/mnt/hgfs是空的十有八九是挂载问题回到3.3手动挂载一次。还有一个容易翻车的情况在Workstation 17里有些时候会发现整个虚拟机的“设置”菜单是灰的或者里面没有共享文件夹选项。这种情况先看虚拟机是不是处于开机或者挂起状态必须在关机状态下部分配置项才可修改。另外如果虚拟机列表里的配置文件和当前Workstation版本不兼容也可能导致菜单异常关掉虚拟机再重新打开一次列表基本能恢复。4.3 权限问题只读、Permission denied与SELinux共享文件夹的权限问题是踩坑的重灾区。从错误现象来看无非就两种一种是虚拟机里进入共享目录后发现只能读不能写另一种是根本进不去报Permission denied。先看“只能读不能写”。这个通常有两个原因。第一个是你设置共享文件夹时勾了“只读”这个好理解取消勾选就行。第二个是主机侧目录本身的NTFS或者POSIX权限不够说白了你在主机上对那个目录没有写权限虚拟机里自然也没有。比如你在Windows主机上共享了C:\Program Files下的某个目录普通用户对它本来就只有读权限虚拟机里当然写不进去。解决办法是换一个有写权限的目录或者调整主机目录的用户权限。再看Linux客户机里的Permission denied。如果你用了vmhgfs-fuse挂载但没有指定uid/gid参数那么默认挂载点归属于root普通用户进去当然被拒。解决方法是重新挂载加上allow_other和uid你的uid,gid你的gid参数。还有一个隐蔽因素SELinux。在Rocky、CentOS这类默认开启SELinux的系统里即使你FUSE挂载参数写对了SELinux策略也可能拦截访问。排查时用sudo ausearch -m avc -ts recent查看有没有AVC拒绝记录临时验证可以先用sudo setenforce 0把SELinux切到permissive模式如果能访问了那就是SELinux策略的问题需要针对fuse文件系统放行或者调整上下文。4.4 延伸CIFS/SMB挂载重启失效是怎么回事热搜词里有一条“cifs挂载共享文件夹重启后失效怎么办”虽然这是另一套方案但和VMware传文件经常被一起提起值得说几句。有不少人不用HGFS共享文件夹而是通过主机开SMB共享、虚拟机里mount -t cifs方式来传文件。这个方案同样能达到双向传输的目的但坑比HGFS多不少。最常见的问题是重启后挂载失效。根源基本都指向/etc/fstab的配置顺序。系统开机挂载CIFS的时候网络很可能还没就绪挂载操作会失败。解决办法是在fstab的挂载选项里加_netdev参数告诉系统等网络准备好之后再挂载。示例//192.168.1.10/shared /mnt/shared cifs credentials/root/.smbcredentials,iocharsetutf8,vers3.0,_netdev 0 0还有两个默认没人提醒你的细节。一是密码别直接写在fstab里明文存着很危险用credentials/root/.smbcredentials指定一个权限600的配置文件更稳妥文件内容就是usernamexxx和passwordxxx两行。二是如果主机是Windows系统Windows防火墙必须放行SMB所需的445端口不然虚拟机永远连不上。热搜里提到的“win11共享文件夹找不到网络路径”十有八九就是防火墙没放行或者SMB协议版本不匹配。坦白说如果你只是想在单机VMware环境里传文件我不太推荐绕这么大一圈走SMB。HGFS配置一次之后就稳定用还不依赖网络何必去折腾防火墙和协议版本。SMB更适合多台物理机之间的网络共享放到虚拟化场景里有点大材小用了。4.5 临时兜底传不进去时的应急方案最后再分享几个应急方案。万一某天HGFS抽风或者你临时在别人的机器上没有共享文件夹配置权限又急着给虚拟机传文件可以直接用下面几个土办法顶一下。如果你只是想从主机把文件放进虚拟机可以在主机共享目录里开个临时HTTP服务然后虚拟机里用curl或者浏览器下载。比如主机上在要传的目录下执行python3 -m http.server 8000然后虚拟机里访问http://主机IP:8000就能下载文件。这个方法对NAT和桥接网络都适用前提是网络是通的但核心优势是零安装、零配置系统自带Python就能搞定。反过来想从虚拟机把文件传到主机更好的办法是走SSH。虚拟机里装个openssh-server主机这边用Windows 10/11自带的OpenSSH客户端直接scpscp 用户名虚拟机IP:/路径/文件名 D:/本地目录这些都是救急手段不追求体验只追求能跑通。日常主力方案还是前面讲的共享文件夹。再说一个偏门但很稳的技巧如果虚拟机已经关机你其实可以把它的虚拟磁盘文件vmdk/vhdx通过VMware的“映射虚拟磁盘”功能挂载成主机的盘符然后直接往里拷文件。这种方式不涉及客户机系统速度飞快适合大批量文件一次性灌进去。最后分享一个我自己的使用习惯。我会把代码、文档、安装包这些“随时要变、两边都要用”的内容都放到主机的共享目录里虚拟机里只放操作系统和运行环境。这样做的好处是就算虚拟机系统彻底崩了直接删掉重建一个再挂上同一个共享目录所有资料都还在重装系统的损失降到最低。另外一个踩坑后的总结是共享文件夹的名字尽量起英文短名别带空格别用中文名虽然新版Tools对中文支持好了很多但谁也不知道哪天就踩到老版本挂载的雷。关于VMware里共享文件夹这件事先聊到这儿有新的坑我再来补充。
返回列表