
1. 项目概述与方案选型思路1.1 这玩意儿到底解决什么问题虚拟机共享文件夹说白了就是让宿主机和虚拟机之间能互相传文件。我见过太多人第一次装完虚拟机导入镜像、装好系统结果发现要把一个安装包拖进虚拟机里死活拖不进去又不想重新挂载ISO镜像最后只能拿U盘当搬运工来回插拔折腾半天。共享文件夹就是用来根治这个痛点的配好之后宿主机上一个目录和虚拟机里的某个路径直接打通两边读写都是实时同步的比拖拽文件好用得多也比配置FTP和Samba省事得多。这个功能最适合几类人刚上手虚拟机的入门用户装完Linux想从Windows宿主机传软件包和脚本的开发测试人员需要在Windows上写代码、在Linux虚拟机里跑服务的还有运维人员批量管理多台虚拟机时把配置文件、安装包统一放在宿主机共享目录里分发。我这些年用下来的体会是只要虚拟机用到Linux共享文件夹几乎就是逃不掉的第一课。这里要提前说清楚一个事儿共享文件夹不是虚拟机“自带”的功能它依赖虚拟机增强工具。VMware里是VMware ToolsVirtualBox里是增强功能Guest Additions。工具没装好共享文件夹选项就永远是灰色的或者在虚拟机里压根看不到挂载点。很多人卡在这一步就放弃了其实原理懂了后面全是水到渠成的事情。1.2 主流的共享方案对比我在实际工作里试过大概四类宿主机和虚拟机之间的文件共享方式各有各的适用场景先做个横向对比方案配置成本实时性适用场景坑的程度VMware共享文件夹低高日常传文件、代码同步中等涉及Tools和挂载权限拖拽复制Drag Drop极低中临时传小文件低但大文件经常断Samba/NFS网络共享高高长期稳定的跨机器共享高权限和网络配置比较烦FTP服务中中单向上传下载中延迟明显直接说结论如果是VMware Workstation/Player里跑Linux虚拟机日常传文件首选就是VMware自带的共享文件夹功能。它走的是虚拟机总线通信不走网络栈延迟低配置起来也是几个勾选的事。拖拽复制做补充适合偶尔传截图和几百KB的小文件。真到了需要多个机器长期稳定访问同一个目录、或者异构网络环境里分享文件那时候再上Samba不迟。下面的内容我会重点讲VMware共享文件夹从配置到排障的完整闭环最后用一节讲Windows和Linux之间跨系统共享的场景扩展因为这是很多人配完基础共享后又立刻会撞上的需求。2. 动手前的准备工具安装与基础配置2.1 VMware Tools是共享文件夹的前置条件先说一个最容易忽略的前置条件VMware Tools。很多人一上来就去找“编辑虚拟机设置”里的共享文件夹选项结果发现是灰的或者配完了Linux里找不到目录十有八九就是Tools没装。VMware Tools是一组驱动和后台服务它负责实现剪贴板共享、拖拽文件、自适应分辨率、共享文件夹这些增强功能。你可以理解成手机和电脑之间的“驱动助手”没装它硬件功能就调用不了。宿主机是Windows虚拟机是Windows的情况相对好办VMware Tools一般会在安装系统后自动弹窗让你装一路Next就行。但虚拟机是Linux的话就得手动走一遍。装之前建议先把软件源更新一下Ubuntu/Debian系执行sudo apt update sudo apt upgrade -y这一步不是废话。我遇到过很多次Linux内核版本比较新、默认源里包比较旧导致的编译失败实例提前把系统更新到最新能省掉后面一堆麻烦。CentOS/RHEL系则是sudo yum update -y更新完之后在VMware菜单栏点“虚拟机 - 安装VMware Tools”这时候虚拟机里会自动挂载一个光盘镜像。注意如果菜单项是灰色的说明光驱没连上去虚拟机设置里确认CD/DVD设备是“已连接”状态使用ISO镜像文件指向VMware安装目录下的linux.iso即可。然后进虚拟机挂载并安装sudo mkdir -p /mnt/cdrom sudo mount /dev/cdrom /mnt/cdrom cd /mnt/cdrom tar zxf VMwareTools-*.tar.gz -C /tmp cd /tmp/vmware-tools-distrib sudo ./vmware-install.pl安装脚本在中间会问一堆问题绝大多数时候直接回车用默认值就行。装完重启虚拟机运行vmware-toolbox-cmd -v能看到版本号Tools就算装成了。提示如果提示/usr/bin/perl找不到说明系统缺Perl解释器。Ubuntu执行sudo apt install perlCentOS执行sudo yum install perl就能解决。2.2 Windows虚拟机里配置共享文件夹Windows虚拟机配置共享文件夹算是三家里最简单的全程图形化操作不用写命令。先确保虚拟机关机或者在开机状态都可以VMware Workstation里点“编辑虚拟机设置”切到“选项”选项卡左侧找到“共享文件夹”。这里有个容易看岔的细节VMware Workstation里有两个入口一个在“虚拟机设置”的“选项”里另一个在“虚拟机”菜单下的“设置”里实际上指向同一个面板。你只需要记住路径就行。然后按下面几步操作选择“总是启用”单选按钮。点“添加”按钮弹出“添加共享文件夹向导”。“名称”填这个共享在宿主机侧的标识比如share路径选宿主机上一个实际存在的目录比如D:\VMShare。勾选“启用此共享”。如果需要在虚拟机里对这个目录有写权限把“只读”复选框留空。如果只是想单向分发文件给虚拟机勾上只读反而更安全防止虚拟机里的程序误改宿主机文件。Windows虚拟机里打开“此电脑”在“网络位置”或“其他位置”分组下就能看到share这个映射盘符。如果没显示按Win R输入\\vmware-host\Shared Folders\share也能访问到。注意VMware在Windows客户机里是通过vmware-hgfs网络重定向器实现的所以路径遵循UNC格式。我在Windows 10/11的虚拟机里实测这个功能开箱即用不需要额外配置。但有一点要注意如果Windows客户机系统太老比如Win7可能需要确保VMware Tools版本对得上否则共享文件夹盘符可能不出现。这时候去VMware安装目录重新装一遍Tools或者手动运行setup.exe修复安装基本都能解决。2.3 Linux虚拟机里配置共享文件夹Linux虚拟机这边配置路径和Windows里一样都是在VMware的“共享文件夹”面板里添加宿主机目录。区别在于Linux不会自动挂载共享目录需要你手动执行挂载命令或者写进/etc/fstab让它开机自动挂载。这一步是新手问到最多的地方我单独拆开讲。先看手动挂载Ubuntu 18.04及以后内核4.18以上的版本共享文件夹挂载工具用的是vmhgfs-fuse它通过FUSE用户态文件系统把宿主机目录映射进来。挂载命令sudo mkdir -p /mnt/hgfs sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid1000这里解释一下各参数的含义.host:/代表宿主机上的所有共享根目录。VMware把宿主机侧配置的所有共享都挂在这个虚拟路径下后面直接能看到以共享名命名的子目录。/mnt/hgfs是虚拟机内的挂载点习惯上都用这个路径。-o allow_other允许非root用户访问挂载点不加这个参数普通用户进去会报权限不足。-o uid1000把挂载点的属主指定为UID 1000一般Ubuntu第一个创建的用户就是这个ID。挂载完成后执行ls /mnt/hgfs就能看到宿主机里设置的共享文件夹名称了。再说开机自动挂载。如果每次重启虚拟机都要手动敲一遍命令那确实太痛苦了。打开/etc/fstab在末尾追加一行.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,uid1000,gid1000 0 0保存退出后执行sudo mount -a验证配置有没有语法问题。没报错的话重启虚拟机后共享目录就会自动挂载好。这里有个容易踩的坑uid和gid参数一定不要照抄我的要先执行id命令看你自己用户的UID和GID否则挂载点属主对不上后面写文件会一直提示Permission denied。3. 实操全程记录配置一个可用的共享文件夹3.1 Windows宿主机 Ubuntu虚拟机完整演示我带大家走一遍完整流程就拿最常见的组合举例宿主机是Windows 10/11虚拟机是Ubuntu 22.04 LTS。第一步在宿主机上新建一个目录作为共享根目录路径建议不要用中文和空格避免虚拟机里访问时出现编码问题。我习惯建在D:\VirtualMachine\share专门放和虚拟机交换的文件。第二步编辑虚拟机设置在“选项 - 共享文件夹”里启用共享添加刚才的目录名称填code。第三步进Ubuntu虚拟机先确认VMware Tools版本Ubuntu 22.04默认安装的是open-vm-tools这个和VMware官方Tools二选一即可。检查命令vmware-toolbox-cmd -v如果提示命令不存在先安装sudo apt install open-vm-tools open-vm-tools-desktop -y这里说个细节Ubuntu装在VMware里时open-vm-tools-desktop这个包负责图形界面的自适应分辨率、剪贴板共享、拖拽功能只装open-vm-tools的话命令行工具齐全但桌面体验会差不少。第四步创建挂载点并挂载sudo mkdir -p /mnt/hgfs sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid$(id -u)第五步验证ls -l /mnt/hgfs echo hello from vm /mnt/hgfs/code/test.txt如果宿主机侧D:\VirtualMachine\share目录里出现了test.txt并且内容正确共享就通了。反方向也试一下在宿主机里往这个目录丢一个文件虚拟机里马上能看到这就是实时同步的效果。我把整个流程整理成一个速查表方便你对照操作步骤操作内容验证方法1宿主机新建共享目录目录真实存在路径无中文2虚拟机设置添加共享选项面板里能看到共享条目3安装open-vm-toolsvmware-toolbox-cmd -v 有输出4mkdir挂载点目录创建成功5vmhgfs-fuse挂载ls /mnt/hgfs 能看到共享名6双向读写测试两边文件实时可见3.2 Ubuntu的另一种挂载方式直接挂载单个共享目录刚才挂的是.host:/实际上VMware也支持直接挂载某个具体的共享目录命令是sudo vmhgfs-fuse .host:/code /mnt/code -o allow_other这种方式的优势是隔离性更好宿主机上配置了多个共享时虚拟机里可以针对不同目录挂到不同的挂载点权限也能分开管理。缺点是每次新增共享都要重新手动挂载不如挂根目录来得省事。我个人在实际项目里的做法是开发机和测试机挂根目录/mnt/hgfs因为要频繁访问多个共享生产环境的虚拟机上只挂必须的那个共享目录并且加上-o ro只读参数避免误操作影响宿主机数据。另外再多说一句vmhgfs-fuse是FUSE文件系统它有一个特点对大量小文件的读写性能一般般尤其是几万个小文件的项目目录。我试过在共享目录里直接编译大型C项目编译速度明显比在虚拟机本地磁盘上慢。所以我的建议是代码文件放本地虚拟机磁盘编译构建也在本地只有需要和宿主机交互的最终产物、安装包、脚本这类文件走共享目录不然性能会把你逼疯。3.3 宿主机Linux 虚拟机Linux的对照配置还有一种常见情况是宿主机本身就是Linux比如你工作用Ubuntu开个CentOS虚拟机做测试。这种环境配置思路完全一样但有几个小差别值得提醒。宿主机侧不需要做额外设置VMware Workstation for Linux的界面操作和Windows版一致。虚拟机里安装的是open-vm-toolssudo yum install open-vm-tools -yCentOS/RHEL里挂载工具的名字稍微有点变化但命令兼容sudo mkdir -p /mnt/hgfs sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other还有一点Linux宿主机很多默认防火墙规则比较严但共享文件夹不走网络所以防火墙对它是无感的不用额外放行端口。这一点对比后面的Samba方案优势非常明显。4. 权限问题与报错汇总我踩过的坑都在这4.1 找不到共享文件夹先按这个顺序排查这是出现频率最高的一个问题我在各种技术社群里见到过太多次“VMware共享文件夹后找不到文件”的求助帖。遇到这种问题先不要慌按下面的顺序逐项检查。第一步确认宿主机侧的共享文件夹面板里“总是启用”是真的选中了。很多人在这里点了“启用”又点了“确定”回到设置一看选项又跳回了“已禁用”这种情况一般是因为虚拟机的Tools没正常工作界面做了自动纠正。第二步确认VMware Tools的版本和状态。执行systemctl status vmware-tools.serviceUbuntu下open-vm-tools对应的服务名可能是open-vm-tools.service。如果服务状态不是active先尝试重启服务sudo systemctl restart open-vm-tools.service第三步确认挂载点。执行ls /mnt/hgfs如果提示“No such file or directory”说明挂载没成功。重新执行vmhgfs-fuse挂载命令注意看有没有报错输出。如果报fuse: device not found说明内核的FUSE模块没加载执行sudo modprobe fuse。第四步检查有没有被其他进程占用了挂载点。我在Ubuntu 20.04上碰到过一次诡异现象/mnt/hgfs已经挂载了但访问时提示“Transport endpoint is not connected”这是典型的挂载连接断开的故障。解决方法是先卸载再重新挂载sudo umount /mnt/hgfs sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other这一套下来90%的“找不到共享文件夹”问题都能解决。4.2 能看不能写权限拒绝的常见原因共享文件夹能浏览但没法写入这是另一种高频故障。原因分两种情况一种是宿主机目录本身的NTFS权限限制另一种是虚拟机侧挂载参数没带对。宿主机是Windows时检查一下共享目录的“属性 - 安全”里当前Windows用户是否有“修改”和“写入”权限。特别是目录创建者在管理员账户下而VMware Workstation是以普通用户权限启动的情况很容易出现写入被拒。虚拟机是Linux时重点看挂载参数里的uid和gid。执行ls -l /mnt/hgfs如果挂载点属主是root而你的当前用户是普通用户写入肯定会失败。解决办法就是重新挂载加上uid$(id -u)参数。另外allow_other这个选项必须保留否则即使uid对了非root用户访问挂载点照样会被系统安全策略拦下来。还有一个容易被忽略的因素SELinux。CentOS/RHEL系统默认开启SELinux它可能会拦截FUSE文件系统的某些操作。执行getenforce看状态如果是Enforcing可以先临时设成Permissive试试sudo setenforce 0如果这样就能写了说明确实是SELinux拦截可以针对FUSE域写允许规则或者直接在/etc/selinux/config里把SELinux设为disabled安全性自己权衡生产环境不建议。4.3 权限疑难杂症速查表我把常见问题的现象、原因和解决手段整理成一张表直接对着查就行现象可能原因解决手段共享文件夹选项灰色不可点VMware Tools未安装或未运行安装open-vm-tools重启虚拟机/mnt/hgfs目录不存在挂载未执行手动执行vmhgfs-fuse命令能看目录但进不去挂载权限过严加上allow_other参数重新挂载能读不能写uid/gid不对或宿主机NTFS权限受限指定uid挂载检查Windows目录权限提示Transport endpoint not connected挂载连接断开umount后重新挂载重启后共享消失/etc/fstab没配置追加fstab条目并sudo mount -a验证大量小文件传输极慢FUSE架构特性改为压缩包传输或使用本地磁盘Windows客户机看不到共享盘符Tools版本过旧重装或修复安装VMware Tools这些坑我基本都踩过一遍尤其那个“Transport endpoint not connected”第一次碰到时还以为是虚拟机坏了后来才知道是宿主机休眠唤醒后FUSE连接断开的典型症状。插一句如果你经常用笔记本合盖休眠再打开虚拟机里的共享文件夹有时候会“假死”几分钟这属于正常现象等一下或者umount再挂载就好。5. 进阶玩法从共享文件夹到跨系统文件共享5.1 什么时候该上Samba什么时候用共享文件夹就够了VMware共享文件夹虽然好用但它有个天然边界只服务于宿主机和虚拟机之间的“一对一”通道。一旦你的需求变成“局域网里多台真机互相访问文件”共享文件夹就无能为力了。我自己维护过一套测试环境三台物理机加两台虚拟机需要共享一批测试数据宿主机和虚拟机关系是交错在一起的这时候就得考虑Samba方案。原则其实简单只有一台宿主机和一台虚拟机或者几台虚拟机都在同一台宿主机上VMware共享文件夹够用配置成本最低涉及多台物理机跨网络访问上Samba临时传一次大文件直接挂载ISO或者用scp都比折腾共享强。Samba配置对新手不太友好我见过太多被smb.conf的valid users和write list搞到头大的例子所以能用共享文件夹解决的问题就不要轻易上升到Samba。5.2 配置一个最简单的Windows和Linux互访Samba共享如果你确实需要把Ubuntu上的目录共享给Windows宿主机或其他Windows机器我给你一个能跑起来的最简配置。环境是Ubuntu 22.04目标是把/home/你的用户名/share目录共享出去Windows侧通过\\IP\share访问。安装Sambasudo apt install samba -y备份原始配置然后编辑sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak sudo vim /etc/samba/smb.conf在文件末尾追加[share] comment Shared Folder path /home/你的用户名/share browseable yes read only no valid users 你的用户名 create mask 0644 directory mask 0755然后创建Samba用户并设置密码这个密码是访问共享时用的可以和系统密码一致也可以不一致sudo smbpasswd -a 你的用户名重启服务sudo systemctl restart smbdWindows侧打开文件资源管理器地址栏输入\\192.168.x.x\share输入刚才设置的用户名和密码就能进去了。这里有个Ubuntu的坑要特别提醒如果共享目录放在/home/你的用户名/底下而你的家目录权限是700Samba用户即使通过了认证到了目录层级也可能被拦。解决方式是把共享目录的权限放开一点chmod 755 /home/你的用户名 chmod 755 /home/你的用户名/share我当初在这个权限折叠问题上卡了快一个小时日志里只显示“NT_STATUS_ACCESS_DENIED”排查到最后才发现是家目录权限挡住了Samba的路径遍历。5.3 虚拟机里部署FTP共享另一种轻量思路补充一个轻量方案如果只是想让虚拟机里的Linux系统对外提供一个下载/上传目录vsftpd比Samba更轻配置也更简单。我有时候给临时环境做文件分发就喜欢起一个FTP容器用完就关。Ubuntu安装并启动sudo apt install vsftpd -y sudo systemctl enable vsftpd sudo systemctl start vsftpd修改/etc/vsftpd.conf关键配置anonymous_enableNO local_enableYES write_enableYES local_root/home/你的用户名/ftp把要分享的文件放到local_root指向的目录Windows侧用浏览器或者FileZilla访问ftp://192.168.x.x输入用户名密码就能上传下载。FTP的好处是客户端适配广命令行、脚本都能直接跑缺点是明文传输安全性差一点内网临时用没大问题。这里给个建议临时用别忘了用完关服务内网扫描工具分分钟能扫出来开着的21端口。6. 我的最后几句心得配置虚拟机共享文件夹算是我玩虚拟化这几年来做过次数最多、也最基础的一项操作。从最早踩坑踩到崩溃到现在闭着眼都能配完中间最大的感悟就是很多问题都不是功能本身的问题而是前置条件没满足。Tools没装好就去开共享挂载参数不看就去找权限设置这属于顺序错了后面做多少都是白费。我自己现在的工作流是宿主机建一个统一存放交换文件的目录目录下按虚拟机名称分子目录每台虚拟机挂载对应子目录fstab写死自动挂载。这样做的好处是时间久了也不会搞混哪台机器对应哪个共享排查问题也方便。另外我还会定期清理共享目录里的垃圾文件因为Windows和Linux两边都往这个目录丢东西时间长了很容易变成“垃圾桶”。最后再分享一个小经验如果你的虚拟机是跑生产服务的共享文件夹这种方案只适合做文件交换千万别把数据库数据文件、Web站点根目录直接放在共享文件夹里。虚拟机重启、宿主机休眠、FUSE连接抖动任何一个环节出问题都可能让你的服务跟着遭殃。生产环境数据必须落在虚拟机本地磁盘上这是个原则问题。希望这篇东西能帮你把虚拟机和宿主机之间的文件交换这件事一次性搞定。配置过程中如果还有什么奇怪的报错欢迎顺着上面的排查表逐条对大概率能找到答案。