
1. 为什么虚拟机和Windows传文件这么讲究虚拟机刚装好的第一件事很多人不是配环境而是想办法把文件弄进去。我刚接触虚拟化那会儿最崩溃的瞬间就是系统装好了、软件需要安装包但安装包在Windows主机里虚拟机里却什么都拖不进去。后来用上共享文件夹又踩了不少权限坑。这篇文章把我这些年用过的文件传输方法完整梳理一遍希望能帮你少走弯路。先说清楚场景。虚拟机里的系统可能是Windows 7、Windows 10、Ubuntu、CentOS也可能是旧一些的Windows Server。宿主机的Windows版本也五花八门Win10、Win11都有。不同的客户机系统对应的方法会有差异但核心逻辑是相通的要么通过虚拟化软件提供的“增强工具”打通主机和客户机要么通过网络让两边像两台独立电脑一样互传文件要么干脆用虚拟光驱或虚拟磁盘这种冷门但稳定的方式。我见过很多人卡在一个方法上死活传不了其实换个思路就好了。文章会覆盖几类人一是刚接触虚拟机的新手装完系统不知道该点什么二是日常开发运维需要在Windows宿主机和Linux虚拟机之间频繁传代码和安装包三是给老机器装老系统发现常规拖拽和共享根本不支持。无论你是哪种下面的方法基本能覆盖90%的需求。2. 装好增强组件拖拽复制粘贴才能用2.1 为什么增强组件决定体验很多人第一次装完VMware虚拟机立刻去拖文件结果鼠标拖进去没有任何反应。这不是你操作的问题而是虚拟机系统里还没装对应的驱动和服务组件。VMware里叫VMware ToolsVirtualBox里叫增强功能Guest Additions它们本质上是一组虚拟化平台提供的驱动和后台服务负责把主机的鼠标、键盘、剪贴板、文件夹、显卡能力“透传”给客户机。没有这些组件时虚拟机只能通过最原始的虚拟网卡和虚拟光驱跟外部打交道。所以判断一台虚拟机能不能顺畅传文件第一件事就是看增强组件有没有装。很多网上教程里说“VMware虚拟机安装教程”之后要装VMware Tools就是这个原因。它是后续一切顺畅操作的前提。如果客户机是Windows装好增强组件通常会有系统托盘图标右键能看到“共享文件夹设置”之类的入口。如果是Linux核心是加载内核模块比如VMware的vmhgfs-fuse或者VirtualBox的vboxsf模块。模块没加载共享文件夹就算配置了也挂载不上这在后面专门说。2.2 VMware Tools 安装细节不同版本的VMware界面略有差别但逻辑基本一致。以VMware Workstation为例启动虚拟机后在菜单栏找到“虚拟机”或“VM”点击“安装VMware Tools”或“Install VMware Tools”。这个操作会向虚拟光驱里挂载一个.iso镜像客户机系统里会像插入一张光盘一样多出一个“DVD驱动器”。此时分两种情况客户机是Windows打开“此电脑”找到DVD驱动器双击运行setup64.exe或setup.exe。Win7及更老的32位系统用setup.exe64位系统用setup64.exe。安装过程下一步到底中间会闪几个命令行窗口属于正常现象。装完必须重启虚拟机否则驱动不生效。客户机是Linux打开终端挂载光驱。不同发行版挂载路径略有区别Ubuntu经常是/media/cdromCentOS是/mnt/cdrom也可能自动挂载到/media/用户名/VMware Tools。进入目录后执行sudo ./vmware-install.pl后面会出现一堆提问绝大多数直接回车用默认值即可。如果内核头文件缺失会报错需要先安装build-essential或kernel-devel相关的包。装完重启后你会立刻发现鼠标进出虚拟机不再需要按CtrlAlt分辨率也能自动适配窗口剪贴板和拖拽文件基本就能用了。这里有个经验我经常帮同事处理装完Tools还是不能拖拽的情况多半是安装过程中提示“找不到内核源码”导致模块编译失败。这时不要反复重装先用vmware-config-tools.pl -d重新配置一下或者查一下客户机的内核版本和内核头文件版本是否一致。2.3 VirtualBox 增强功能安装细节VirtualBox对应的组件叫增强功能Guest Additions安装入口在菜单栏“设备”或“Devices”里的“安装增强功能”或“Insert Guest Additions CD image”。同样会挂载一个镜像客户机Windows下直接运行光盘里的VBoxWindowsAdditions.exeUbuntu/Debian中则会有一个VBoxLinuxAdditions.run。Linux下安装前通常需要先安装编译依赖。Ubuntu/Debian系执行sudo apt update sudo apt install -y build-essential linux-headers-$(uname -r)然后挂载镜像执行sudo sh /media/cdrom/VBoxLinuxAdditions.run装完重启。如果共享文件夹还是不能自动挂载可能是vboxsf模块没加载手动运行sudo modprobe vboxsf试试。这个问题在VirtualBox的较新版本里依然会遇到因为Linux内核更新频繁VirtualBox适配往往慢半拍。还有一个容易被忽略的点如果你给虚拟机分配的内存比较大、CPU核心数多但增强功能安装得很慢不要以为是死机。Windows客户机装增强功能时屏幕分辨率会发生变化还会有几次黑屏闪烁都是驱动安装的正常表现。耐心等它装完别中途强关虚拟机。3. 共享文件夹最常用的双向传输方案3.1 从VMware配置共享文件夹说起增强功能装好之后共享文件夹就成了最高频使用的传输方式。它的原理是虚拟化软件把一个宿主机的目录“映射”到客户机里客户机看到的只是一个盘符或一个目录读写操作由虚拟化软件在底层做转换。整个过程不经过网络不占用IP地址也不会因为防火墙被拦。VMware Workstation里配置路径是先关闭虚拟机不用关。右键虚拟机标签页打开“设置”Settings找到“选项”Options页签点“共享文件夹”Shared Folders选择“总是启用”Always enabled然后点“添加”Add选一个宿主机目录作为共享根目录。这一步还可以只勾选“只读”如果只是交付文件给对方建议勾上防止客户机里的恶意软件乱改主机文件。客户机是Windows时打开“此电脑”你会看到一个类似“\vmware-host\Shared Folders\xxxx”的路径或者直接在“网络位置”里出现共享目录。有些版本不会自动映射盘符更稳的方法是直接在“运行”框里输入\\vmware-host\Shared Folders回车就能看到所有共享目录。然后把常用目录右键“映射网络驱动器”分配一个Z盘用起来跟本地磁盘没区别。客户机是Linux时共享文件夹一般自动挂载在/mnt/hgfs/下。如果你的Linux发行版没自动挂载可以手动执行sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid1000其中.host:/表示所有共享目录uid1000改成你当前用户的uid否则挂载出来的文件你只能看不能写。如果提示fuse: bad mount point说明/mnt/hgfs不存在先创建目录再挂载。这个方法我在Ubuntu 20.04、22.04上都验证过。3.2 VirtualBox 的共享文件夹配置VirtualBox的共享文件夹没有VMware那么显眼需要在虚拟机窗口菜单栏点“设备”-“共享文件夹”-“共享文件夹设置”打开一个弹窗后点右上角的加号选择宿主机目录同时设置“共享名称”Share Name和“自动挂载”Auto-mount。共享名称尽量用英文不要带空格和中文。我在Windows宿主机上用过中文目录名结果在Ubuntu客户机里挂载后目录名变成一串转义字符传个文件折腾半天。老老实实填成share、data这种名字两边都好记。Windows客户机使用VirtualBox共享文件夹时在“此电脑”的地址栏输入\\vboxsrv\share名称就能访问。Linux客户机自动挂载点一般是/media/sf_共享名称。如果登陆用户不是root且没有权限读取需要把用户加入vboxsf组sudo usermod -aG vboxsf $USER改完注销重新登录生效。这个组权限问题我见得太多了十次VirtualBox共享权限报错八次是不在vboxsf组里。3.3 权限和路径那些坑共享文件夹传输文件时最常见的三个坑是路径含中文或空格导致挂载失败、权限不足无法写入、以及Windows宿主机杀毒软件把共享目录当风险文件扫描导致传输变慢。第一个坑路径尽量简洁。VMware和VirtualBox对中文路径支持其实还行但在Linux客户机里挂载时经常出问题。建议共享目录直接建在C:\share、D:\vm_share这类位置。第二个坑权限问题分两层。宿主机上被共享的目录要给虚拟机的用户写权限。Windows宿主机右键目录-属性-共享确认共享权限里添加了“Everyone”或指定用户。客户机里Windows虚拟机往共享目录写文件时如果当前登录账户不是管理员部分目录会提示拒绝访问Linux虚拟机则检查目录所有者用chown或chmod调整权限。第三个坑传输大目录时杀毒软件会实时扫描每个文件速度可能慢得离谱。如果你只是临时传一个几十GB的镜像包建议在宿主机上把共享目录加入杀毒软件白名单传完再删除白名单规则。我实测同一个5GB文件加入白名单后传输时间从40分钟缩短到5分钟。4. 网络传输不装工具也能传的通用方法4.1 SMB共享Windows和虚拟机都能用有时候虚拟机里没有装增强组件或者客户机是macOS、高级Linux发行版共享文件夹方案就不太好用了。网络传输是最通用的备选方案。它的本质是把虚拟机当作局域网里的一台独立电脑通过标准网络协议传文件。SMBServer Message Block是Windows原生支持的文件共享协议。如果你的虚拟机里跑的是Windows 7或Windows 10可以在虚拟机系统里把某个文件夹设为共享右键文件夹-属性-共享-添加Everyone并设置读取/写入权限。然后从宿主机打开“运行”输入\\虚拟机的IP地址\共享名即可访问。关键点是虚拟机的网络模式。VMware和VirtualBox默认都是NAT模式虚拟机通过宿主机转发上网局域网里的其他机器包括宿主机以外的真机不一定能直接访问虚拟机。如果只想在宿主机和客户机之间传文件NAT模式下一般可以访问但如果局域网里其他电脑也想通过SMB访问这台虚拟机建议把网络模式改成桥接Bridge模式让虚拟机直接获取局域网IP。在Windows客户机里设置SMB共享之前要确保“网络发现”和“文件和打印机共享”已经开启。控制面板-网络和共享中心-高级共享设置里把当前网络配置文件专用下的两个选项都打开。还要注意Windows防火墙默认防火墙可能会弹窗询问是否允许共享点允许就好。我在自己机器上试过如果不放行SMB端口445宿主机始终访问不了虚拟机共享目录。Linux客户机也可以用SMB不过要装samba服务配置复杂度高一点。如果是Linux虚拟机给Windows宿主机传文件我更推荐下面的SCP/SFTP方式。4.2 SCP/SFTPLinux虚拟机最顺手SCPSecure Copy和SFTPSSH File Transfer Protocol都基于SSH协议只要虚拟机里开了SSH服务Windows宿主机就可以用命令行或图形化工具传文件。这是Windows和Linux虚拟机之间传文件的“黄金方案”尤其在服务器运维场景里几乎人人都在用。在Linux虚拟机里安装和启动SSH服务Ubuntu/Debian系统执行sudo apt install openssh-server sudo systemctl enable ssh sudo systemctl start sshCentOS/RHEL系统则sudo yum install openssh-server sudo systemctl enable sshd sudo systemctl start sshd确认服务起来后用ip addr或ifconfig查看虚拟机的IP地址比如192.168.87.132。Windows宿主机要传文件最简单的是打开PowerShell或CMD执行scp命令scp D:\readme.txt user192.168.87.132:/home/user/这条命令把本机D盘的readme.txt传到虚拟机用户家目录。反向传输同样简单scp user192.168.87.132:/home/user/result.log D:\backup\如果需要传整个目录加上-r参数即可。用scp传文件好处是加密、无广告、不依赖图形界面缺点是要能记住命令。数据量大时建议压缩后传或配合tar一起用比如tar czf - /home/user/data | ssh user192.168.87.132 cat /backup/data.tar.gz这条命令在本地打包并实时推送到虚拟机省去中间文件速度更快。如果你不喜欢命令行用WinSCP或FileZilla这类SFTP图形客户端最舒服。填上虚拟机IP、SSH用户名和密码就能像操作FTP一样拖拽文件。实测下来WinSCP还会缓存目录结构传大量小文件时比scp命令快不少。4.3 HTTP临时传文件大文件应急方案有一种场景很常见虚拟机里没有SSH服务没有增强组件共享文件夹也没配置但两边能通过网络互相ping通。这时候用HTTP协议起一个临时文件服务是最省事的办法。进入需要传输文件的目录比如Windows宿主机上的D:\temp在CMD或PowerShell里执行python -m http.server 8000如果宿主机没装Python也可以用python3。运行后这台主机的8000端口会暴露D:\temp目录下的所有文件。虚拟机里打开浏览器输入http://宿主机IP:8000直接下载不需要额外装任何客户端工具。反向操作也成立如果文件在虚拟机里要在Windows下载就在Linux虚拟机里执行python3 -m http.server 8080然后在Windows宿主机浏览器输入http://虚拟机IP:8080即可。这个方法对临时交付特别友好不用记scp命令浏览器点两下就能下载。但要注意两点一是http.server默认只监听当前目录不要在有敏感文件的大目录里开服务用完及时CtrlC关掉二是传输速度受虚拟网卡影响很大我实测VMware默认虚拟网卡能跑满千兆但有些Linux虚拟机用的e1000网卡速度只有几十MB/s。想要更快可以在虚拟机设置里把网卡类型改成VMXNET3或者vhostLinux下需要安装open-vm-tools的驱动。5. 特殊场景传大文件、传很多小文件、离线环境5.1 大文件如何传得快大文件传输是文件传输里最容易让人抓狂的场景。一个5GB的数据库备份、10GB的开发镜像包如果用拖拽方式传进度条走得很慢不说中途断了可能直接失败。我总结几条加速经验供参考。第一先压缩再传。把一个10GB的日志目录压缩成单个tar.gz包不仅文件数量变成1个传输效率也大幅提升。在Linux虚拟机里执行tar czf /home/user/logs.tar.gz /var/log/再配合scp上传整个过程稳定很多。第二用共享文件夹模式传大文件通常比网络协议更快。因为共享文件夹走的是虚拟化软件内部高速通道不经过真实网卡。特别是VMware的VMCI通道传输大文件时非常接近宿主机本地磁盘速度。如果发现共享文件夹速度慢检查一下客户机是否安装了最新版的VMware Tools以及共享目录所在的物理盘是否够快。第三断点续传是关键。大文件传一半断了是家常便饭scp不支持断点续传但sftp的客户端工具比如WinSCP支持rsync也支持rsync -avP /home/user/bigfile.tar.gz user192.168.87.132:/home/user/-P参数会显示进度并支持断点续传。传大文件时我一般不用scp直接用rsync被坑过太多次了。5.2 很多小文件如何传小文件多起来反而比大文件更费时间。比如一个源码项目里面几百个几百字节的配置文件。如果逐个上传光是建立连接的往返时间就够让人崩溃的。解决办法是先打包再传。在源目录执行tar czf project.tar.gz ./project/传完后在虚拟机里解压tar xzf project.tar.gz对Windows之间传多小文件也同理先压缩成zip或rar再拖拽。我见过有人不用压缩直接拷贝一个含两万个文件的目录花了40分钟压缩成一个zip后拷贝只用3分钟解压也只要1分钟。多花一点打包时间换来传输效率成倍提升这笔账非常划算。如果你硬要用SMB共享直接复制多文件目录建议在客户机里启用“通过共享文件夹/网络复制”时Windows的robocopy命令可以设置多线程robocopy C:\source X:\dest /MIR /MT:32/MT:32表示32个线程并行复制。实测比资源管理器直接拖拽快很多。5.3 无网络离线环境怎么传有些虚拟化环境根本不提供网络比如某些隔离的测试环境或者虚拟机网络配置异常一时半会儿修不好。这时候增强组件和共享文件夹也不可用的话就只能考虑“虚拟光驱”方案了。思路很直接把要传的文件做成一个ISO镜像然后在虚拟机设置里把该ISO挂载到虚拟光驱。客户机里会出现一张新光盘打开就能看到里面的文件。制作ISO的方法很多Windows下可以用UltraISO、PowerISO工具都有试用版Linux下直接用mkisofs或genisoimagemkisofs -o /home/user/transfer.iso /home/user/files/然后把transfer.iso放到宿主机某个目录在虚拟机设置里把它挂到CD/DVD光驱即可。这个方法不需要网络不需要增强组件任何主流系统都能识别ISO。缺点是只适合一次性单向传输文件总容量受镜像文件大小限制最好控制在4GB以内超过的话要用UDF格式。比ISO更进阶的是直接挂载虚拟磁盘。如果你手头有vmdk或vhd格式的额外磁盘可以把它附加给虚拟机然后启动后在客户机里把它格式化为数据盘。之后关机把该磁盘从虚拟机里卸下来在宿主机里用vmdk转vhd工具或7-Zip直接读取磁盘内容。这个方法适合批量交付场景比如要给客户机装软件集把整个数据盘做好后直接带过去。6. 常见问题与排查技巧实录6.1 共享文件夹不显示共享文件夹配置完成后客户机里找不到这个问题最为高频。我整理了从高到低的排查顺序确认增强组件是否真的装好。Windows客户机可以在任务管理器里看到vmtoolsd.exe进程或者服务列表里找VMware Tools Service。Linux客户机执行lsmod | grep vmhgfs或grep vboxsf /proc/filesystems来确认内核模块已加载。确认共享文件夹是否启用。VMware里要勾选“总是启用”VirtualBox里要勾选“自动挂载”。很多人只是填了目录名就关掉窗口实际根本没启用。检查路径拼写。VirtualBox的共享名称如果填了share_folder访问路径就要严格写成\\vboxsrv\share_folder多一个下划线都不行。Linux客户机手动挂载时挂载点目录必须存在。执行sudo mkdir -p /mnt/hgfs sudo vmhgfs-fuse .host:/ /mnt/hgfs如果挂载时报错Protocol error一般是VMware Tools版本太老和客户机内核不匹配。升级VMware到最新版或者在客户机里重新编译Tools。Windows客户机里不显示映射盘符时打开“运行”直接输入\\vmware-host\Shared Folders或\\vboxsrv\这是最可靠的手动访问方式。还有一个冷门情况系统策略禁用映射网络驱动器。在某些精简版Windows里组策略限制了网络盘符映射资源管理器里看不出来但运行框路径可以正常访问所以我的首选建议始终是“运行框里直接敲路径”。6.2 拖拽复制粘贴失效拖拽复制粘贴失效通常有几种原因。增强组件没装是最常见的一种装好文件没重启或者安装过程报错也会导致拖拽功能异常。Windows客户机里拖拽功能由VMware Tools的拖拽服务控制。如果服务没启动可以在服务管理器里找到“VMware Tools Service”或“VMware Tools”设为自动启动并手动开始。VirtualBox的情况也类似卸载后重装增强功能重启虚拟机一般能解决。Linux客户机里拖拽复制粘贴对桌面环境要求高我实测在Ubuntu默认GNOME桌面里没问题但在精简的Xfce、LXDE里面经常失灵。遇到这种情况别死磕拖拽直接改用共享文件夹或scp更高效。有时是Wayland会话的问题切换到Xorg会话可能就好了。大文件拖拽失败是一个经常出现的老问题。VMware的拖拽通道对超过几百MB的文件不太友好传大文件时进度条卡住、最终失败都是常见现象。这时就应该用共享文件夹或scp不要和大文件过不去。另外拖拽功能的安全性也要注意。在给客户机安装不明来历软件时拖拽传输容易把危险文件放进来我在测试环境里试过一旦客户机中了恶意软件它完全能通过拖拽通道反向读取宿主机剪贴板里的路径信息。所以非必要不开启拖拽从宿主机传给客户机文件尽量走只读共享文件夹。6.3 文件传输速度慢速度慢原因可能出在多个环节。网络传输时首先要排除病毒扫描干扰然后检查虚拟机网卡类型。VMware默认的e1000虚拟网卡在千兆网络下只能跑到300Mbps左右换成VMXNET3可以跑到1Gbps左右。VirtualBox默认的virtio-net在Linux客户机里也能跑得很快Windows客户机装增强功能时顺带安装驱动。共享文件夹传输慢主要是客户机系统盘或共享目录所在物理盘性能不足。如果宿主机用的是机械硬盘共享文件夹速度会明显慢于NVMe SSD。另一可能原因是增强组件版本过旧。VMware Tools和VirtualBox增强功能会持续适配新系统和新内核用几年不更新共享文件夹性能会明显下降建议跟随虚拟机软件版本定期重装。网络传输时TCP窗口、MTU设置也会影响速度。虚拟机默认MTU 1500在多数局域网环境里没问题。但如果网络里出现大量丢包速度会断崖式下跌可以用ping -l 1400测一下大包延迟。在Linux客户机里调整TCP拥塞控制算法为bbr也能改善高延迟网络的吞吐能力echo net.core.default_qdiscfq | sudo tee -a /etc/sysctl.conf echo net.ipv4.tcp_congestion_controlbbr | sudo tee -a /etc/sysctl.conf sudo sysctl -p6.4 权限不足和防火墙拦截权限不足的问题Windows场景比Linux更隐蔽。共享文件夹配置了Everyone完全控制但客户机里依然无法写入这时要看客户机用户是否有正确的凭据。部分精简版系统为了安全禁用了网络共享凭据的匿名访问需要在虚拟机操作系统的“凭据管理器”里添加宿主机IP的Windows凭据账户填宿主机当前用户和密码。防火墙拦截主要影响SMB和HTTP传输。Windows客户机防火墙对于非标准端口比如8000会弹窗询问默认是放的但SMB的445端口在某些系统版本里默认就是拦截的。排查时关闭防火墙试试速度如果关闭后能访问说明是防火墙规则问题。不要把防火墙整个关了不管更稳妥的是在防火墙高级设置里添加“入站规则”放行TCP端口445或手动放行指定程序。Linux客户机防火墙ufw或firewalld也常被忽略。Ubuntu默认没开ufw还好CentOS的firewalld默认是开启状态ssh和http端口需要手动放行sudo firewall-cmd --permanent --add-servicessh sudo firewall-cmd --permanent --add-servicehttp sudo firewall-cmd --reload不少新手在CentOS虚拟机里装好SSH后从Windows连不上折腾半天发现是firewalld拦了22端口。7. 一点实战心得写了这么多最后说点个人体会。在我实际的工作流里传输文件从来不是只看单一方法而是根据场景切换。日常Windows宿主机和Ubuntu虚拟机之间传代码我直接用共享文件夹因为实时同步和双向编辑最方便代码改动立刻能在另一边生效。传交付用的安装包或镜像优先用scp或SFTP客户端因为走加密通道而且不依赖VMware Tools的版本兼容性换到公司强制要求的VirtualBox环境照样能用。传真正的大数据文件其实我更多依赖rsync因为它能断点续传、能显示速度、还能增量同步这样即使传输中断也不会前功尽弃。给你一个简单判断原则要“实时干活”用共享文件夹要“快速拷贝”用scp或HTTP服务要“稳定传大文件”用rsync并加上压缩和断点续传参数要是网络环境实在不行就做ISO镜像走虚拟光驱。所有方案的核心都是让文件安全、快速地到达对端别用一把钥匙开所有锁。如果你还在为传输速度慢或者权限问题头疼建议从最简单的“在运行框里输入路径”开始排查很多看似复杂的问题往往只是缺少一个空格或一次重启而已。折腾虚拟机的过程本身就是积累经验的过程希望这篇文章能帮你少踩一些我当年踩过的大坑。