干这行这么多年,每次给新同事或者朋友远程解决虚拟机问题,十个里有八个都卡在“共享文件夹”这一步。要么是装完虚拟机发现文件拖不进去,要么是配好了共享文件夹结果里面空空如也,再要么就是一顿操作猛如虎,最后弹出来一个 0x80070035 或者 0x80004005 让你原地崩溃。
这篇文章我就把“vm 共享文件夹”这件事彻底讲透。不只是告诉你按钮在哪儿、勾哪个选项,还会把背后的原理、为什么这么配、以及我这些年踩过的坑和排查思路一并分享出来。不管你是用 VMware Workstation、Oracle VM VirtualBox,还是 Linux 和 Windows 混合环境,看完这篇你都能自己搞定,而且是不带犹豫的那种。
1. 内容整体设计与思路拆解
1.1 虚拟机文件互传到底有哪几条路
先说个基础认知。虚拟机(VM)和宿主机之间的文件交换,抛开云盘和 U 盘这些物理搬砖手段,常见技术路径就三条:拖拽复制、共享文件夹、网络共享。很多人一上来就直接问“怎么开共享文件夹”,但实际上很多场景根本不需要共享文件夹这么重的方案。
拖拽复制依赖虚拟机增强工具(VMware Tools 或 VirtualBox Guest Additions),适合小文件、偶尔传一次。优势是没有任何学习成本,缺点是大文件极易中断、目录层级多的时候体验稀碎,而且某些精简版系统压根没装增强工具,拖拽就是灰的。
共享文件夹是 VMware 和 VirtualBox 都提供的“虚拟机直通宿主机目录”机制,适合需要高频读写的场景,比如你的项目代码在宿主机、虚拟机里做编译或运行,或者把日志直接落到宿主机磁盘上方便查看。
网络共享则是通过 SMB 协议走局域网,虚拟机把宿主机或另一台机器当成 NAS 来用。这套方案最大的好处是不用装任何增强工具,但前提是两台机器网络要通,而且权限配置头绪更多。
我在实际工作中的选型逻辑很简单:系统是刚装的、需求是临时的,优先拖拽;目录是开发项目、长期要用的,直接共享文件夹;机器环境比较杂,像 Windows 虚拟机访问 Linux 宿主机之类的,那就老老实实走 SMB 网络共享。三者没有绝对好坏,关键看你的场景和网络拓扑。
1.2 为什么“装好系统后第一件事是装增强工具”
很多新手在“vm 共享文件夹”上栽跟头,九成是漏了增强工具这一步。VMware Tools 或者 VirtualBox Guest Additions,它们不仅仅提供“拖拽”和“共享文件夹”功能,还包含显卡驱动、鼠标无缝切换、剪贴板共享、时间同步等一整套半虚拟化驱动。
没有这套东西,虚拟机里的系统跑在纯模拟的慢速设备上,性能打折不说,共享文件夹这个功能压根就不会出现在菜单里。你就想想,Windows 虚拟机没装驱动的时候分辨率固定 1024x768、鼠标要用 Ctrl+Alt 释放,那种半残状态基本就是没装增强工具的样子。
所以无论用 VMware 还是 VirtualBox,装完系统的第一件事永远是装增强工具,再谈别的。
2. 核心细节解析与实操要点:VMware 共享文件夹篇
2.1 VMware Tools 的安装与验证
VMware Workstation 里装 Tools,常规路径是菜单栏“虚拟机 -> 安装 VMware Tools”。但有个细节很多人不知道:在选择安装之后,虚拟机的光驱里会出现一个虚拟 CD-ROM,里面是一个 tar.gz 压缩包,Windows 客户机会自动弹出安装向导,而 Linux 客户机则常常毫无反应。
Linux 下正确的安装方式是把光驱里的压缩包拷出来解压,然后执行安装脚本:
# 挂载虚拟光驱(如果没自动挂载) sudo mount /dev/cdrom /mnt # 解压安装包到临时目录 cd /tmp tar -zxvf /mnt/VMwareTools-*.tar.gz # 执行安装脚本 cd vmware-tools-distrib sudo ./vmware-install.pl -d-d参数代表用默认值一路安装,省得它一行一行问。安装完成后sudo reboot重启一次,然后用vmware-toolbox-cmd验证一下是否正常:
vmware-toolbox-cmd stat hosttime能返回虚拟机时间就说明 Tools 工作正常。如果你是 Ubuntu 或者 Debian 系,我更推荐用另一个思路——直接装 open-vm-tools,效果一样甚至更稳:
sudo apt update && sudo apt install -y open-vm-tools这里有个我踩过的坑:如果你又装 open-vm-tools 又装官方 VMware Tools,内核模块可能会冲突,出现挂载不上共享文件夹或者共享目录时好时坏的问题。我的习惯是统一用 open-vm-tools,毕竟它是开源实现,和 Linux 内核配合更丝滑。
2.2 图形界面配置共享文件夹的隐藏路径
在 VMware Workstation 里添加共享文件夹的方法是:虚拟机设置 -> 选项 -> 共享文件夹 -> 选择“总是启用” -> 添加。这里我提醒几个关键点。
第一,“名称”和“主机路径”的关系。名称是给虚拟机里用的逻辑标签,主机路径才是宿主机上的真实目录。很多人把这两个搞混,在虚拟机里找路径找半天,其实名称就是你在客户机里的访问“根目录”。
第二,要不要勾“启用此共享”。这个选项只针对单个共享生效,如果你在共享列表里看到一个共享是灰色的,多半是没勾这个。我建议把所有共享都勾上,省得到时候排查半天。
第三,虚拟机的访问凭据。共享文件夹默认以当前登录的宿主机用户权限来访问,也就是说虚拟机里能读写的范围理论上和宿主机该用户一致,这是需要注意的安全边界。
Linux 客户机挂载方式是这样的:
# 创建一个挂载点 sudo mkdir -p /mnt/hgfs # 挂载所有 vmware 共享 sudo mount -t vmhgfs .host:/ /mnt/hgfs如果出现mount: unknown filesystem type 'vmhgfs',说明 vmhgfs-fuse 模块没加载或者没装 fuse。Ubuntu 下可以执行:
sudo apt install -y fuse sudo modprobe vmhgfs然后重新挂载。用vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other,uid=1000,gid=1000也可以直接以当前用户身份挂载,避免permission denied问题。这里的 uid 和 gid 可以用id -u和id -g查。
挂载成功后,你就能在/mnt/hgfs/共享名称/下看到宿主机目录里的文件了。Windows 客户机则更省事,开共享后用net use Z: \\vmware-host\Shared Folders\共享名称或者直接在“此电脑”地址栏输入\\vmware-host\Shared Folders,就能看到所有共享目录。
2.3 开机自动挂载和权限细节
很多 Linux 用户挂载是成功了,但一重启就废,原因是不想每次手动敲 mount 命令。解决办法是把挂载语句写进/etc/fstab,但这里有个大坑:fstab 里写 vmhgfs 类型的挂载,开机时内核模块和网络还没准备好,经常挂载失败。
我实测最稳的方式是写成 systemd 服务或者干脆在/etc/rc.local里延迟执行。给一个简单可用的 systemd 单元示例:
# /etc/systemd/system/vmhgfs-mount.service [Unit] Description=Mount VMware Shared Folders After=network.target [Service] Type=oneshot ExecStart=/usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other,uid=1000,gid=1000,umask=022 RemainAfterExit=yes [Install] WantedBy=multi-user.target然后:
sudo systemctl daemon-reload sudo systemctl enable --now vmhgfs-mount.service这个方法我在 Ubuntu 20.04/22.04 上反复验证过,比 fstab 稳得多。顺带提一句 uid/gid 别用 0(root),否则虚拟机里的普通用户还是访问不了,别问我怎么知道的,问就是我曾在 root 权限下折腾了一下午。
3. 核心细节解析与实操要点:VirtualBox 共享文件夹篇
3.1 增强功能和共享文件夹配置
VirtualBox 的共享文件夹思路和 VMware 类似,但操作路径不同:在虚拟机运行时,菜单栏“设备 -> 安装增强功能”,或者命令行VBoxManage都能搞定。
Linux 客户机安装增强功能依赖编译工具链,否则VBoxLinuxAdditions.run会失败。Debian/Ubuntu 系需先装:
sudo apt install -y build-essential linux-headers-$(uname -r) dkms如果内核 headers 装不上,多半是 apt 源的问题,换国内镜像源后重新apt update再试,很多人在这一步被劝退。
装完增强功能重启,然后在“设备 -> 共享文件夹 -> 共享文件夹设置”里添加宿主机目录,注意勾选“自动挂载”和“固定分配”。Linux 客户机会自动挂载到/media/sf_共享名,但默认访问权限是 vboxsf 用户组,你当前用户不在组里就只能干瞪眼。
解决办法:
sudo usermod -aG vboxsf 你的用户名重新登录后就能读写/media/sf_共享名下的文件了。
3.2 命令行配置和跨宿主机使用
如果你习惯纯命令路线,可以用 VBoxManage 在宿主机侧添加共享:
VBoxManage sharedfolder add "虚拟机名称" --name "share" --hostpath "/宿主机/目录" --automount这个命令我在自动化脚本里用得多,适合批量创建虚拟机后统一配置。VirtualBox 的共享文件夹也支持“临时(只读)”模式,适合你只希望虚拟机读取安装包但不允许它删改的场景,比如把 ISO 挂载目录设成只读。
关于 Windows 客户机,VirtualBox 默认会把共享文件夹映射为网络驱动器,但偶尔会出现盘符不出现的情况。此时在虚拟机的 Windows 里按Win+R输入\\VBOXSVR\共享名,回车就能访问。这是很多教程没提但非常实用的小技巧。
3.3 不装增强功能的备用方案
有人会问:我的虚拟机就是装不上增强功能,或者我用的精简版系统不带系统头文件,怎么办?那就别纠结共享文件夹了,直接用网络共享绕过去。这也是我经常采用的路子。
把宿主机上要共享的目录开成 SMB 共享,然后虚拟机里通过\\192.168.x.x\share访问。Ubuntu 虚拟机里挂载很简单:
sudo apt install -y cifs-utils sudo mkdir -p /mnt/host_share sudo mount -t cifs //192.168.x.x/share /mnt/host_share -o username=宿主机用户名,password=密码,uid=1000,gid=1000Windows 宿主机开启共享的方式是:右键目录 -> 属性 -> 共享 -> 高级共享,设置好共享名后,再在网络和共享中心里打开“网络发现”和“文件和打印机共享”。这一步少一个,其他机器就找不到你的共享。
4. 实操过程与核心环节实现:用三套方案彻底打通文件互传
4.1 方案一:VMware 完整配置流程(Ubuntu 客户机)
假设宿主机是 Windows,虚拟机是 Ubuntu Server 22.04,我们来走一遍全流程。
第一步,安装 open-vm-tools:
sudo apt update && sudo apt install -y open-vm-tools第二步,在 VMware 里配置共享目录:虚拟机右键设置,进入“选项 -> 共享文件夹”,勾选“总是启用”,然后添加,主机路径选择D:\workspace,名称填workspace。
第三步,客户机挂载:
sudo mkdir -p /mnt/workspace sudo vmhgfs-fuse .host:/workspace /mnt/workspace -o allow_other,uid=1000,gid=1000第四步,验证写入:
echo "test" > /mnt/workspace/test.txt然后去宿主机 D 盘看看 test.txt 在不在。在,就说明整个链路通了。
这里补充一下:vmhgfs-fuse .host:/workspace里的.host:是 VMware 专门给的虚拟主机标识,/workspace对应刚刚添加共享时填的“名称”,不是宿主机路径。这算是最常见的理解误区。
4.2 方案二:VirtualBox + Samba 网络共享(Windows 访问 Linux)
这个场景在开发环境里很常见:宿主机 Windows,虚拟机 Ubuntu 里跑服务,想把日志共享给宿主机看。VirtualBox 的共享文件夹可以,但很多时候 Samba 更灵活。
虚拟机的网卡模式我建议设成“桥接模式”或“NAT 模式加端口转发”,保证宿主机和虚拟机之间能互相 ping 通。然后安装并配置 Samba:
sudo apt install -y samba sudo mkdir -p /srv/share sudo chmod 777 /srv/share修改/etc/samba/smb.conf,在文件末尾加入:
[share] path = /srv/share browseable = yes read only = no guest ok = yes force user = nobody force group = nogroup然后重启 Samba 服务:
sudo systemctl restart smbdWindows 宿主机访问时,地址栏输入\\192.168.x.x\share,就能看到共享目录了。如果要加密码,去掉guest ok = yes,然后给 Samba 用户设密码:
sudo smbpasswd -a 用户名Windows 访问时会弹出凭据输入框,输进去就行。这套方案不依赖 VirtualBox 增强功能,跨 Windows/Linux/macOS 都没问题。
4.3 方案三:Python 一行命令开启临时共享
有些场景你只是临时发个文件,没必要配 Samba 或共享文件夹。Python 的内置 HTTP 服务器就是一个非常实用的备选方案。在要共享的目录下执行:
python3 -m http.server 8000然后在另一台机器浏览器里访问http://宿主机IP:8000,就能下载该目录里的文件了。Windows 上没有 python3 的话用 py 也是同理:
py -m http.server 8000这个方案只支持下载,不支持上传。如果你要临时上传,可以用 Python 的 uploadserver 模块:
pip install uploadserver python3 -m uploadserver 8000然后访问同一个地址,页面里就多了一个选择文件上传的按钮。这种方式做临时中转特别好用,尤其是在两台机器之间没有共享配置的情况下,比插 U 盘快太多了。
实测小提示:记得在两台机器上把防火墙打开对应的 TCP 端口,否则访问不了。Windows 宿主机弹窗时直接点“允许访问”,Linux 虚拟机用ufw allow 8000。
4.4 端口转发与 vm 连接的外部场景
热词里有个 “failed to connect to remote vm com.sun.jdi.connect.spi.closedconnectionexcep”,这个其实是 Java 远程调试连接虚拟机时常见报错。问题往往不是 JVM 本身,而是虚拟机网络配置导致调试端口不通。
如果你的虚拟机跑的是 Java 应用,宿主机要连进来调试,需要确认三件事:虚拟机的 IP 能 ping 通;调试端口(默认 5005)没被防火墙拦截;JVM 启动参数加的是-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005。对于新版本 JDK,address=*:5005和address=5005有区别,前者监听所有网卡,后者只监听本机回环地址,所以建议显式写*:5005。
这个问题之所以出现在“共享文件夹”的场景里,是因为很多调试环境的代码文件就是通过共享目录挂进去的。文件内容能同步,但网络层没放开,Java 的 Socket 连接自然失败。
5. 常见问题与排查技巧实录:看完能自己搞定 90% 的报错
5.1 Windows 共享文件夹报错速查表
很多人遇到报错就慌,其实 Windows 的错误码就那么几个规律。我整理了一张表,基本覆盖高频问题:
| 错误代码 / 现象 | 常见原因 | 解决办法 |
|---|---|---|
| 0x80070035 网络路径找不到 | SMB 协议被禁用、网络发现关闭 | 启用 SMB 1.0/2.0,打开网络发现 |
| 0x80004005 无法访问共享文件夹 | 凭据过期、权限不足 | 用net use * /delete清理旧凭据,重新认证 |
| 0x800704b3 网络路径错误 | 网卡被禁用、网络连接断开 | 检查适配器状态,ipconfig确认 IP |
| 拒绝访问 | 共享权限和 NTFS 权限不匹配 | 同时检查“共享”页和“安全”页的权限 |
| 无法访问,提示找不到网络名 | 445 端口被防火墙拦截 | 放行 445 或检查防火墙规则 |
| 输入密码后一直弹窗 | 本机凭据管理器存了旧密码 | Win+R 输入control keymgr.dll删除旧凭据 |
处理这类问题的优先顺序是:先看网络通不通,再查 SMB 服务开没开,再看共享权限和防火墙,最后看凭据。很多人第一步就卡在“网络发现”上:控制面板 -> 所有控制面板项 -> 网络和共享中心 -> 高级共享设置,把当前配置文件的“网络发现”和“文件和打印机共享”都打开。尤其是 Win11,默认网络发现是关闭的,这也是为什么 Win11 访问共享文件夹老报 0x80070035 的头号原因。
5.2 Linux 挂载共享目录的常见报错
mount: unknown filesystem type 'vmhgfs':内核模块没加载。执行sudo modprobe vmhgfs,如果模块不存在就重装 open-vm-tools。no such file or directory:共享名称填错了。先去共享设置里确认“名称”,再检查挂载点的绝对路径。permission denied:用户或者权限问题。加上uid=1000,gid=1000,allow_other参数重挂,并确认宿主机目录本身可读。cannot mount: Host unreachable:宿主机侧的 VMware Tools 服务没跑起来,或者共享文件夹没有“总是启用”,只启用了“在下次打开电源时启用”。
5.3 关于“输入的文件夹似乎无效”与“共享文件夹需要密码”
“共享文件夹似乎无效”这个提示我见过两种来源。一是 Windows 的“添加网络位置”向导,当你输入\\192.168.x.x\share时如果对方没开共享、路径不存在、防火墙拦截,就会提示无效。二是某些国产办公软件内置的网络位置添加功能,本质也是 SMB 路径探测。
排查思路是先在资源管理器地址栏直接输这个 UNC 路径,看能不能访问。能访问,说明是向导问题;不能访问,问题就在共享配置上,按 5.1 的表格逐步排查。
“共享文件夹怎么设密码”这个问题,本质上也是 SMB 权限问题。Windows 共享没有单独的“共享密码”,它验证的是你访问时输入的另一个 Windows 账户的用户名和密码。所以想要设密码,就是关闭“来宾账户”,或者取消勾选共享设置里的“允许其他用户修改我的文件”,让对方必须以带密码的账户登录。Samba 共享则用smbpasswd单独管理用户密码,多了一层独立性。
6. 经验沉淀:我把方案浓缩成一句话版本
每次我把这套流程讲完之后,总有人问我能不能给个“最短路径”。我自己常用的判断逻辑是这样的:Windows 宿主机 + VMware 虚拟机,直接共享文件夹 + open-vm-tools,稳定省心。Linux 宿主机 + Windows 虚拟机,优先 Samba,别和增强功能死磕。临时中转,Python HTTP 服务一键搞定,用完就关。
另外还有两个我在实际使用中发现的小细节值得说一说:一是共享文件夹不要放太多小文件,尤其是 node_modules 这种上万个文件的目录,FUSE 在遍历目录时速度会让你怀疑人生,重度开发场景更推荐把代码放虚拟机本地磁盘,通过版本库或者 rsync 同步到宿主,而不是直接挂共享目录编译。二是不要同时用多个方案挂同一个目录,我见过又开 VMware 共享文件夹又开 Samba 指向同一宿主机目录的结果是出现文件锁竞争,文件突然变只读,排查了半小时最后发现是两个协议互相打架。
虚拟机共享文件夹这个功能,说穿了就是“媒介”二字。它解决的问题永远是你如何在两台逻辑隔离的系统之间高效传递数据。理解了底层是 FUSE 驱动也好、SMB 协议也罢,再遇到报错就不会慌,因为你知道它本质上是在做什么,也知道该往哪个方向去查。希望这篇文章能帮你把这件小事彻底搞定。