十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

主机与虚拟机文件传输全解:拖放、共享文件夹、SCP与ISO全攻略

主机与虚拟机文件传输全解:拖放、共享文件夹、SCP与ISO全攻略 直接说结论在VMware Workstation里把文件从物理主机弄进虚拟机最省事的路径是“拖拽复制粘贴”但这条路径经常失灵——不是VMware Tools没装好就是服务没起来再不就是没装增强功能。而一旦它失灵很多人就卡住了只能在虚拟机里临时开个共享网盘来传文件绕一大圈还没考虑数据安全。这篇文章我把“主机和虚拟机之间倒腾文件”这件事分三层讲清楚最常用的拖放和剪贴板共享怎么让它稳定工作、坏了怎么排查第二层是走网络的传法SSH、共享文件夹、HTTP临时服务各自适合什么场景第三层是更高级一点的玩法主机当跳板映射盘符、虚拟机里直接挂载ISO或磁盘扩容。看完之后你不需要再记一堆碎片化的技巧一张决策表就能选对方案。1. 拖放文件失败的真正卡点VMware Tools的完整性与权限模型先问个问题为什么你把文件拖到虚拟机窗口里鼠标变成了带斜杠的圆圈绝大多数情况下不是“不能拖”而是VMware Tools没正常工作。VMware Tools是Virtual Machine的驱动和服务集合它不只是装完就完了——里面包含了SVGA驱动、鼠标同步、剪贴板共享、拖放支持、时间同步这些基础服务拖放和剪贴板复制只是其中两个组件。很多人的操作流程是装好Windows虚拟机发现能联网了就直接开始用跳过了“安装VMware Tools”这一步。那拖放自然就是废的。如果你用的是精简安装的Linux虚拟机或者是网上下的Ghost版Windows镜像里面往往已经被作者删掉了VMware Tools相关组件这时候拖放功能当然不可用。完整的排查链路我按优先级排列菜单栏确认Tools状态VMware Workstation顶部菜单 “虚拟机” - “安装VMware Tools” 或“重新安装VMware Tools”。如果这一项是灰色不可点的说明虚拟机已安装的Tools版本和当前Workstation版本不匹配或者系统内部Tools服务已损坏。Windows虚拟机内检查服务按 WinR 输入services.msc找“VMware Tools”服务确保启动类型是“自动”状态是“正在运行”。这个服务的作用是桥接Workstation的拖放请求到底层驱动。如果服务是停止状态手动启动一次然后注销再登录拖放大概率就恢复。Linux虚拟机检查装载点装了open-vm-tools的Linux用systemctl status open-vm-tools查看服务状态。比较常见的坑是系统更新内核后open-vm-tools没有跟着重编译或重新安装模块加载失败拖放功能就没了。拖放方向与格式限制就算Tools正常拖放也不是万能的。把文件从主机拖到虚拟机里这一方向通常最稳反过来从虚拟机往外拖在很多Linux桌面环境下会失焦或失败。此外同时拖太多零散小文件VMware可能会出现文件丢失或桌面上不刷新不建议一次拖100个以上文件。排查完这些还没有解决那就要怀疑是不是虚拟机配置里直接禁用了拖放。关闭虚拟机在虚拟机设置 - 选项 - 客户机隔离中勾选“启用拖放”和“启用复制粘贴”。这里有个细节如果你在模板虚拟机里建了一个不带图形界面的最小化系统很多选项默认就是灰色或关闭的。2. 玄学之外的可靠备选剪贴板共享与共享文件夹的配置逻辑拖放失效后大部分人第一反应是改用复制粘贴——结果发现还是不行。这里必须点破一个认知误区拖放和剪贴板共享是两个独立的服务模块但它们的配置入口都在“客户机隔离”面板里。有时候你只勾了“启用复制粘贴”没勾“启用拖放”自然拖放不能用反过来有时拖放能用但粘贴文字失败也是因为剪贴板共享组件没被启用。正确的配置是这样的打开虚拟机设置 - 选项 - 客户机隔离把“启用拖放”和“启用复制粘贴”都勾上。然后用vmware-toolbox-cmdWindows下也有对应程序重启Tools服务我习惯的做法是物理机上重启虚拟机系统干脆利落地让全部驱动重载一遍。如果勾选之后还是不行就要手动检查虚拟机的 .vmx 配置文件。这个方法很多人不知道虚拟机关机状态找到虚拟机目录下的.vmx文件用记事本打开搜索isolation.tools.dnd.disable和isolation.tools.copy.disable。这两个参数如果值为TRUE说明在配置文件层面被写死了。把它改成FALSE或直接删掉这两行保存后重新开机问题基本就能解决。不过我要提醒一句依赖拖放和剪贴板传大文件是有风险的习惯。它靠的是主机端复制到内存再通过虚拟机通道写入虚拟磁盘一旦传一半断掉不会有什么原子性保护大文件容易变成0字节。我自己的准则是小于50MB的零散文件用拖放没问题超过这个量级直接走文件共享或FTP省时省心。说到更稳定的方案VMware的“共享文件夹”功能才是真正的生产力工具。它不基于网络而是VMware Tools在虚拟机内核里直接映射主机目录走的是虚拟设备通道速度快且稳定。Windows虚拟机里配置映射方式如下虚拟机设置 - 选项 - 共享文件夹 - 选择“总是启用”点“添加”选择主机上的一个目录比如D:\VMSHARE勾选“启用此共享”确定。然后进入Windows虚拟机打开“此电脑”在地址栏输入\\vmware-host\Shared Folders就能看到你刚添加的目录。更常用的做法是右键“映射网络驱动器”给它分配一个盘符比如 Z 盘这样在虚拟机里访问Z盘就像是访问主机上的一块硬盘使用体验比拖放顺畅得多。Linux虚拟机Ubuntu/Debian/CentOS挂载共享文件夹的通用步骤是sudo mkdir -p /mnt/hgfs sudo vmhgfs-fuse .host:/D:\VMSHARE /mnt/hgfs -o allow_other -o uid1000这里有一个非常烦人的细节vmhgfs-fuse在系统重启后不会自动挂载。如果不想每次开机都手动执行一次写进/etc/fstab时不建议直接用vmhgfs-fuse的完整命令行因为fstab的解析顺序和网络/模块加载时序对不上很容易开机失败。我通常的做法是写一个 systemd service或者干脆在.profile里加一行带|| true的命令保证就算挂载失败也不影响登录。腾讯云服务器、阿里云服务器这类Linux实例通常没法直接使用VMware共享文件夹——因为它们不是跑在VMware Workstation里。这一点要区分开不要拿着虚拟机平台的经验往云主机上硬套。3. 网络传输方案选型SSH/SFTP/共享文件夹/HTTP临时服务各管一摊当拖放和共享文件夹都因为某些原因用不了比如虚拟机里跑的是精简版WindowsTools装不上或者Linux里没有图形桌面VMware Tools的共享文件夹模块编译失败就需要把思路切换到网络传输上。只要主机和虚拟机之间能通就能用TCP/IP传文件。这里先解决一个问题主机和虚拟机之间的网络是不是通的这和虚拟机的网络模式强相关。VMware里常用的三种模式网络模式通信关系适用场景NAT模式虚拟机通过主机共享IP上网主机可以访问虚拟机虚拟机访问主机需要走网关地址一般是192.168.x.1或10.0.x.1最常用默认模式适合只需要上网的虚拟机桥接模式虚拟机和主机处于同一局域网相当于一台独立设备需要局域网其他设备访问虚拟机或虚拟机需要独立IP仅主机模式只有主机和虚拟机之间能通信不能上网隔离测试、不安全的实验环境在NAT模式下主机访问虚拟机里的服务没问题但虚拟机主动访问主机的共享文件夹或SMB服务时会默认走虚拟机网卡网关——也就是VMnet8这个地址通常是192.168.x.1就是主机在虚拟网络里分配到的地址。所以虚拟机里用scp或sftp主动连回主机时要连接的是192.168.x.1而不是主机的局域网IP。3.1 Windows虚拟机的最省事方法开共享文件夹或关防火墙如果虚拟机是Windows 10/11最传统的方式就是主机共享一个文件夹虚拟机通过\\192.168.x.1\sharename访问。但在实际项目中这样经常会卡在网络发现和防火墙权限上。说个真实案例有朋友在Windows 11主机里开了共享Windows 7虚拟机怎么都访问不了。排查到最后是主机上“网络发现”这个功能没有被启用——文件共享和网络发现是两个独立设置共享开了但发现没开虚拟机就看不到入口。而“网络发现”在Windows新版本里往往默认关闭。解决方法是在“高级共享设置”中开启网络发现并关闭“密码保护的共享”否则会被SMB的用户名密码验证卡住。3.2 Linux虚拟机的标准姿势SSH SCP/SFTPLinux虚拟机的标准方案就是跑SSH服务然后主机侧用SCP或SFTP直接推送文件完全不需要在虚拟机里装任何额外软件只要确认sshd在运行# 主机发送文件到虚拟机 scp /path/to/local/file user虚拟机IP:/home/user/ # 主机拉取虚拟机里的文件 scp user虚拟机IP:/home/user/remote_file /path/to/local/如果你传的是整个目录记得加上-r参数如果你是Windows主机可以在PowerShell里直接用scp.exe——Win10 1809之后的系统自带OpenSSH客户端不需要额外安装。如果追求图形化操作可以用WinSCP或MobaXterm它们本质上是SFTP客户端通过22端口和虚拟机通信比命令行直观得多。这里要专门提一个不怎么被新手重视的点SSH协议的指纹校验和端口占用。如果你之前连过同一台虚拟机后来虚拟机重装系统导致SSH主机密钥变化再连时会报“Mismatch”或“REMOTE HOST IDENTIFICATION HAS CHANGED”解决方式是ssh-keygen -R 192.168.x.x每次把这块忘掉的用户不在少数遇到这种报错最直接的杀手锏就是用上述命令清除旧指纹缓存。3.3 临时传文件不装任何东西的HTTP方案有时候虚拟机里没SSH、没有Tools也不方便设置共享那就可以走“主机开HTTP服务虚拟机内下载”的思路。这里不是推荐什么重型服务一条Python命令就能搞定# 在主机文件所在目录执行 python3 -m http.server 8080然后在虚拟机浏览器里输入http://192.168.x.1:8080就能看到文件列表点击即可下载。这个方案只在局域网内部临时用别暴露在公网否则相当于临时开了个无认证的下载站。用完后立刻 CtrlC 结束进程。它同样适用于反向场景虚拟机开HTTP服务主机去下载虚拟机的文件。原理一样只是服务端搬到了虚拟机里。4. 跨越磁盘层的传输思路ISO挂载与镜像直接访问如果你的场景比较复杂——虚拟机没网络Tools也装不上主机和虚拟机之间的所有软件通道都断了那最底层的方案是通过虚拟光驱挂载ISO来交换文件。做法很简单主机上用一个工具比如UltraISO或Windows自带的资源管理器把要传的文件打包成一个ISO镜像然后在虚拟机设置里把ISO挂载到CD/DVD光驱上。虚拟机开机后光驱里就能看到这些文件。ISO方案的优势是它模拟的是真实的CD-ROM设备虚拟机的BIOS和操作系统都会自动识别不依赖任何驱动。缺点是只能单向传输而且文件打包解包需要额外步骤。所以我把它定位成“最后手段”但我自己真遇到过不少次某个老系统比如Windows XP时期的老软件测试连网卡驱动都没有VMware Tools也装不上ISO挂载反而成了最简单可行的文件交换方式。这里有几个细节值得说ISO里的文件尽量用小写无空格文件名避免老系统或老旧安装工具解析路径出错虚拟机开着的时候也可以挂ISO在“虚拟机 - 设置 - CD/DVD”里选择“使用ISO镜像文件”确定后不用重启虚拟机内直接刷新光驱即可看到可以连续挂多个ISO吗不行CD/DVD光驱设备同一时间只能挂一个ISO但可以加多个光驱硬件SCSI 0:0、0:1、0:2...Workstation最多支持4个虚拟光驱你可以把不同的数据盘挂在不同光驱上互不干扰。同样的道理也适用于“把虚拟机的文件取出来”在虚拟机关机状态下用VMware自带的“磁盘映射”功能把虚拟磁盘挂载为主机的一个盘符。在VMware Workstation中这个操作入口在“虚拟机 - 设置 - 硬盘 - 工具 - 映射”。把vmdk虚拟磁盘映射到Windows盘符后它就像一个普通分区一样可以直接读写文件。这里必须做红色标注映射虚拟磁盘时一定要先关闭虚拟机。如果虚拟机处于运行或挂起状态映射会失败或导致磁盘文件锁死严重情况下会破坏整块虚拟磁盘的数据完整性。另外虚拟机磁盘映射只支持虚拟机的数据分区。如果系统分区用的是IDE控制器、且没有安装对应驱动Windows主机不一定能识别。遇到识别不了的分区格式比如Linux的ext4在Windows下看不到内容需要借助第三方工具比如Ext2Read或WSL里的mount命令来读。5. 一本书讲完的实操决策表文件传输方案怎么选网上一搜关于“主机文件传到虚拟机”的内容又多又杂有说拖放的、有说共享文件夹的、有说映射磁盘的、还有说用网盘中转的。真到了自己用反而不知道该选哪个。我的建议是不要按“哪种功能存在”选要按“场景约束”来选。场景推荐方案不推荐的方案Windows虚拟机VMware Tools已安装拖放文件小文件、共享文件夹大文件或持续协作网络传输浪费配置成本Windows虚拟机Tools无法安装共享文件夹如果VMware低版本或精简版支持、ISO挂载拖放/复制粘贴默认不可用Linux虚拟机无图形桌面SFTP/SCP全网最通用、HTTP临时服务一次性场景共享文件夹会因内核模块编译失败而抓狂虚拟机系统损坏或无法启动磁盘映射取数据、挂载ISO为PE修复盘所有系统内方法大批量、频繁双向同步文件共享文件夹或NFS/SMB虚拟机内映射盘符拖放会崩溃临时传个安装包HTTP临时服务或Python一行命令共享文件夹配置成本高这张表是我在实际项目中反复验证过的基本能覆盖90%以上“主机-虚拟机”文件交换需求。还有几个通用的小技巧和注意事项是从几十个项目里踩坑总结出来的大文件传输先压缩再传。尤其是当虚拟机磁盘空间紧张时一个未压缩的5GB数据库导出文件传过去占的就是5GB如果压缩成zip或tar.gz可能只有1GB多空间占用立刻降下来。传输之前先确认虚拟机的可用磁盘空间。比如虚拟机磁盘默认扩展到40GB但已用了38GB往里面拖4GB文件拖到一半提示磁盘满文件就废了整个过程又不能续传。不要在主机和虚拟机之间通过剪贴板传密码和密钥。剪贴板共享走的是Tools通道如果这台虚拟机的隔离选项被配置成允许复制粘贴任何在虚拟机里复制到系统剪贴板的内容主机侧的程序比如密码管理器之外的其他监听剪贴板的App都可能读到存在风险。敏感信息建议用键盘输入或用SSH密钥对认证。6. 一个容易忽视的路径问题vmdk磁盘满了怎么办排查到最后文件确实传到虚拟机了结果虚拟机提示“磁盘空间不足无法写入”。这种问题比传不进去更烦。主机磁盘还有很多空间但虚拟机系统盘满了拖进来的文件根本没法落地。这种情况下表面上是文件传输问题实际上卡在了虚拟磁盘扩容上。处理思路是虚拟机设置里调整硬盘大小注意这个操作必须在虚拟机关机状态下执行。把硬盘大小从40GB改到60GB新增的20GB会以未分配空间的形式出现在虚拟磁盘中。进入虚拟机系统给分区扩容Windows虚拟机需要打开“磁盘管理”找到新出现的未分配空间右键扩展到现有C盘或其他分区。Linux虚拟机则要划分区、扩容逻辑卷或直接调整根分区大小推荐使用growpart resize2fs组合。补充提醒一句如果你用到的是快照功能扩容前先确认所有快照的父盘不会因此损坏。带着快照扩容会遇到“Expand failed: The parent virtual disk cannot be opened”之类的报错。保险做法是删除旧快照或先给虚拟机做一个干净的完整性快照再扩容。这算是我踩过的一个很深的大坑别轻易试。还有一个坑有些精简置备的vmdk在虚拟机关机后虽然显示可用空间增加但主机侧的物理文件大小并没有立刻变大。这是因为VMware默认不会立即把扩容部分全部写进宿主机磁盘只有虚拟机内有新写入动作时才会增长。看着主机侧空间足够等虚拟机里写入大量数据跑上几小时后主机报警“磁盘空间不足”这种事不是没可能。所以扩容虚拟磁盘时务必确保主机磁盘有大于扩容额度两倍的空余空间别只看虚拟机的成长空间。7. 虚拟机和主机互通之后的进阶玩法端口转发与远端口直接访问文件传输只是第一步很多时候我们把文件传进虚拟机是为了让虚拟机能跑一个服务然后让主机或者局域网其他设备访问这个服务。这在NAT模式下就涉及端口转发配置。VMware的NAT模式下虚拟机拥有的是一个私有IP比如192.168.152.128它自己能上网但外部设备无法直接访问它。要让主机之外的其他设备也能访问虚拟机内的服务需要在VMware的虚拟网络编辑器中设置端口转发打开“编辑 - 虚拟网络编辑器”选中NAT模式对应的 VMnet8点击“NAT设置”在端口转发里添加一条规则以主机IP加一个端口比如8080转发到虚拟机的某个IP加服务端口比如80。这样配置之后局域网内的其他PC访问主机的8080端口就能跳到虚拟机的Web服务上。文件传输同理如果虚拟机里跑了FTP服务21端口也可以用这条端口转发规则让外部用户只访问主机IP的8021端口再到虚拟机内21端口。这样做的好处是外部实体看不到虚拟机的真实IP暴露面只控制在主机的一个特定端口上安全隔离做得更干净。不过端口转发也有它的坑端口冲突如果主机某个端口已被占用转发就不会生效。可以先用netstat -ano | findstr :8080确认再选用其他端口。必须保证虚拟机内服务绑定在0.0.0.0如果只绑定了127.0.0.1即使端口转发配置正确外部访问也会被拒。检查方法是虚拟机内ss -tlnp | grep 80。防火墙Windows虚拟机的防火墙默认会拦截来自物理网络适配器的入站请求。最省事的验证方法是临时关闭虚拟机的防火墙测试通了再放行端口规则。对Linux虚拟机则是sudo ufw allow 80/tcp或者按发行版放行firewalld。8. 主机到虚拟机的文件同步策略增量同步和自动化脚本如果一个文件传输场景是反复发生的比如你天天要把本地的代码同步到开发虚拟机里跑测试那手拖或重复SCP就太低效了。你应该上一个简单的自动化方案。Windows主机传Linux虚拟机最简单的是用scp配一个批处理脚本echo off set VUSERroot set VHOST192.168.152.128 set VDIR/opt/project scp -r D:\code\project %VUSER%%VHOST%:%VDIR%Linux主机传Linux虚拟机则用rsync增量同步对比scp它最大的优势是只传有变更的部分rsync -avz --delete /home/user/project/ root虚拟机IP:/opt/project/-a归档模式保留权限和时间戳-v输出详细日志-z传输时压缩--delete保持目标目录和源目录严格一致——我把--delete单独拿出来说是因为它会删除目标目录里源目录没有的文件。用对了是自动化利器用错了会导致虚拟机里的重要文件被自动删掉。首次配置脚本时不要加这个参数先跑几次看看效果再说。另外如果嫌ssh时不时询问密码麻烦可以配置SSH密钥免密登录。用ssh-keygen -t ed25519生成密钥然后ssh-copy-id user虚拟机IP把公钥装到虚拟机上。以后scp、rsync、sftp都不需要输密码脚本就能全自动跑。在配置免密的细节上容易出现这类问题Windows主机里生成的密钥路径是C:\Users\用户名\.ssh而登录虚拟机的用户可能是root或其他普通用户要把公钥追加到虚拟机上对应用户的~/.ssh/authorized_keys之后还要确认权限~/.ssh目录是700authorized_keys文件是600。很多刚配完免密失败的人一查全是权限太宽松被sshd拒绝。对整个自动化方案我的经验是先用明文密码测试一通流程确认虚拟机和主机路径都没问题再上SSH密钥免密。这样就算后面免密配失败了也知道问题大概率出在密钥或sshd配置上而不是路径写错。9. 最终排错清单与个人经验整理一下“主机文件传到虚拟机”路径中常遇到的高频问题给出一份可以直接对照处理的清单拖放文件显示禁止符号VMware Tools未安装或服务未启动。先重装Tools再检查服务状态最后查客户机隔离配置。复制粘贴文字失败把“启用拖放”和“启用复制粘贴”同时勾选重启虚拟机再试。共享文件夹里看不到内容确认虚拟机设置里共享文件夹已启用且勾选“映射为网络驱动器”如果是Linux用vmhgfs-fuse挂载前先mkdir -p挂载点。共享文件夹传文件特别慢考虑是Tools服务版本过旧重装VMware Workstation或更新open-vm-tools。另外某些杀毒软件会实时扫描虚拟机映射过来的文件也会拖慢速度。虚拟机访问主机共享文件夹提示没有权限关闭主机密码保护的共享给共享目录添加Everyone读写权限防火墙放行文件和打印机共享。SFTP连接被拒绝确认sshd服务运行、22端口监听、防火墙放行22端口以及PasswordAuthentication yes这一项在sshd_config里没有被注释掉。Windows虚拟机内映射网络驱动器总是掉线可能是主机休眠或网络适配器电源管理里勾了“允许计算机关闭此设备以节约电源”把它关掉。虚拟机无法访问主机HTTP服务确认主机防火墙放行了对应端口。在NAT模式下虚拟机访问主机用VMnet8的网关IP而不是192.168.x.1之外的其他IP。把文件传到虚拟机后虚拟机里显示乱码文件可能是文件名编码问题这种情况在Windows主机传文件到Linux虚拟机时经常出现。建议传到Linux后顺手执行convmv -f GBK -t UTF-8 --notest对文件名做转换或者干脆在生成文件时就统一使用UTF-8编码。传完大文件虚拟机卡顿甚至蓝屏多半是虚拟磁盘碎片太多或者内存不足。给虚拟机分配资源时别太抠门——尤其是现在很多模板虚拟机默认只给1GB内存跑文件索引或杀毒可能直接把系统拖垮。稳妥起见把虚拟机内存加到2GB以上并定期在虚拟机内做磁盘清理。我个人的习惯是主机与虚拟机之间传文件大文件优先共享文件夹或rsync小文件才用拖放。重要数据做完双向传输都会在目标机器里验证一遍文件哈希Windows下是certutil -hashfileLinux下是sha256sum确认源文件和目标文件的校验值一致。用普通方法传输虽然理论上不会有数据损坏但虚拟磁盘、快照、网络中断等环节都是变量校验一次的成本远小于事后发现文件损坏去重传的成本。文件传输这件事看上去是个不起眼的基础操作实际能把上面这些链路全部走通的人并不多。掌握了这套方法论不只是解决当下这一个问题——以后再遇到奇奇怪怪的环境比如无桌面Linux、精简Windows、老系统ISO交换数据你也有完整的应对体系而不是临时去搜“怎么传文件到虚拟机”。
返回列表