虚拟机里倒文件慢,多数时候不是虚拟化性能差,而是你走了最绕的那条路把虚拟磁盘挂来挂去,或者用拖拽搬大文件。换一条数据通路,同一台物理机、同一个千兆网口,速度从十几MB/s拉到接近线速是常见结果,下面按“先定位瓶颈、再选工具、最后调参数”的顺序讲,命令可以直接抄。
虚拟机文件传输慢怎么解决:先分清是磁盘卡还是协议卡
倒文件慢,常见就三类原因,混在一起看容易误判。
- 虚拟磁盘I/O瓶颈:qcow2格式有元数据开销,cache模式设成none又没配好,写入会被反复刷盘拖住。
- 协议开销:SCP走SSH加密,小文件多时握手和加密成本摊不开;SMB在大量小文件场景下元数据操作密集。
- 虚拟化层设备老旧:客户机还在用模拟的IDE控制器或e1000网卡,而不是virtio或VMXNET3。
判断顺序很简单,先测再换:
- 在虚拟机和宿主机之间跑
iperf3 -s/iperf3 -c <对端IP>,看纯网络能到多少,千兆环境正常在900Mbps上下。 - 在客户机内用
dd if=/dev/zero of=test.bin bs=1M count=1024 oflag=direct测裸盘写入。 - 用
top看传输时是CPU某个核跑满(加密或协议栈),还是iowait高(磁盘),还是都闲(对端慢)。
业内专家指出,虚拟机的I/O路径比物理机长,每一次读写都要经过虚拟化层转换,设备型号选错带来的损耗往往比网络本身更大。
| 传输方式 | 适合场景 | 速度量级 | 配置成本 | 断点续传 |
|---|---|---|---|---|
| 共享文件夹 | 几十MB以内、临时取放 | 中等 | 低 | 不支持 |
| SCP/SFTP | 跨机、单次大文件 | 受加密影响 | 低 | 不支持 |
| rsync | 批量、需增量同步 | 较高 | 中 | 支持 |
| SMB/NFS挂载 | 长期双向读写 | 接近线速 | 中 | 依赖应用 |
| nc + tar 管道 | 超大文件、内网直传 | 接近线速 | 中 | 不支持 |
本地电脑和虚拟机传文件的最快方法:按文件体积选通路
几十MB以内:共享文件夹和增强会话够用
VMware的共享文件夹、VirtualBox的共享目录、Hyper-V的增强会话驱动器重定向,配置都在图形界面里,几分钟搞定,缺点是底层仍要做协议转换,传大量小文件时开销明显,行业共识认为,共享文件夹适合“取个安装包、拷份日志”,不适合当日常数据通道。
上GB的大文件:优先rsync或nc管道
同一内网、追求速度,两个办法最实在:
- rsync增量同步:
rsync -avz --progress --partial --append-verify ./data/ user@192.168.1.50:/opt/data/。--partial保留中断的临时文件,--append-verify续传时校验已有部分,断了重跑不从头来。 - nc加tar直传:接收端
nc -l -p 9999 > big.tar,发送端tar cf - ./bigdir | nc 192.168.1.50 9999,没有加密开销,内网环境能跑满带宽,注意nc明文传输,只在可信网络用。
长期双向读写:挂SMB或NFS
Windows宿主机开共享,Linux客户机挂载:
mount -t cifs //192.168.1.10/share /mnt/share -o username=test,vers=3.0,uid=1000,gid=1000
Linux之间更推荐NFS,服务端 /etc/exports 写 /data 192.168.1.0/24(rw,sync,no_subtree_check),客户机 mount -t nfs 192.168.1.10:/data /mnt/data,挂载后就是本地目录,编辑器、编译工具都能直接用。
VMware和Hyper-V传文件哪个快?先看虚拟化平台的差异
VMware:靠open-vm-tools和HGFS
共享文件夹依赖HGFS协议,Linux客户机要装 open-vm-tools,挂载命令是 vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other,不装工具,共享文件夹直接不可见,磁盘控制器选VMware Paravirtual或PVSCSI,网卡选VMXNET3,这两项对吞吐影响最大。
Hyper-V:增强会话本质是RDP通道
增强会话模式下的剪贴板、驱动器重定向,走的是RDP虚拟通道,不是块设备直通,传大文件时它会绕一圈,速度不如直接在客户机里挂SMB,Hyper-V还有个被低估的工具:PowerShell Direct,宿主机执行 Copy-Item -ToSession $session 可以在不开网络的情况下把文件推进客户机,适合网络没配好的初始化阶段。
KVM/VirtualBox:virtiofs优于9p
KVM早期用9p共享目录,小文件性能一般,现在主流发行版已经支持virtiofs,配 virtiofsd 加 -device vhost-user-fs-pci,挂载 mount -t virtiofs myfs /mnt/share,吞吐和延迟都明显好于9p,VirtualBox的 vboxsf 依赖增强功能包,大文件场景建议直接改用桥接网卡加SFTP。
不装工具虚拟机共享文件夹怎么设置
有些生产环境不让装额外软件,纯手工也能配。
- VMware Workstation:虚拟机设置 → 选项 → 共享文件夹 → 总是启用,指定宿主机目录,Linux客户机若没装open-vm-tools,此路不通,可改用“物理磁盘映射”以外的方案,比如宿主机临时开个HTTP服务:
python3 -m http.server 8000,客户机wget拉取。 - VirtualBox:设备 → 共享文件夹,挂载
mount -t vboxsf share /mnt/share,需要在vboxsf用户组里。 - KVM 9p:启动参数加
-virtfs local,path=/host/share,mount_tag=hostshare,security_model=mapped-xattr,客户机执行mount -t 9p -o trans=virtio,version=9p2000.L hostshare /mnt/share。
权限问题最容易卡人,挂载后文件属主变成root或nobody,加 uid=、gid=、umask=0002 参数即可,宿主机目录本身也要给读权限,否则客户机看到的是空目录。
虚拟机传输大文件用什么工具好:参数和避坑
工具选对只是第一步,参数不对照样慢。
- 压缩要看文件类型。
rsync -z对文本、日志有效,对已压缩的镜像、视频几乎无用,反而多耗CPU,传ISO、qcow2这类文件,去掉-z。 - 限制带宽避免挤占业务。
rsync --bwlimit=50000表示限速约50MB/s,按需调整。 - 大文件分块并行,单条TCP流跑不满高延迟链路时,用
split -b 1G切块后多线程传输,再cat合并,比死磕单流有效。 - 虚拟磁盘格式影响整体体验,qcow2省空间但有写放大,raw格式顺序写更快,临时做大量数据搬运时可以先用
qemu-img convert -O raw转一份。 - 网卡和队列,virtio-net开多队列
queues=4,宿主机和客户机都开巨帧(MTU 9000)时,链路两端必须一致,否则会掉包重传。
据统计,在企业内网的文件搬运场景里,相当一部分耗时并不是卡在带宽,而是卡在小文件逐个打开关闭的元数据操作上,打成一个tar包再传,往往比逐个拷贝快出一个量级。
Q&A:虚拟机文件传输常见问题
虚拟机复制文件只有几MB每秒,是网络问题吗?
多数情况下不是,先用iperf3确认网络上限,如果iperf3能跑到几百Mbps而实际拷贝只有几MB/s,瓶颈在磁盘或协议,检查客户机磁盘控制器是否为virtio或PVSCSI,检查是否在用共享文件夹传大量小文件,再看CPU是否有单核跑满。
共享文件夹和SCP哪个更快?
小文件、少量文件,共享文件夹省事;上GB的单文件,SCP和rsync通常更快,因为少了一层文件系统协议转换,如果客户机装了open-vm-tools且传的是几十MB的零散文件,共享文件夹的体验优势更明显,判断标准是文件数量和总体积,不是工具本身新旧。
传输中途断了怎么续传?
rsync加 --partial --append-verify 可以从断点继续;SCP本身不支持续传,可用 rsync -e ssh 替代;nc管道断了只能重来,所以传超大文件前建议先切块并记录校验值,md5sum 比对后再合并。
选对通路、配对参数,虚拟机倒文件的速度上限就是物理链路的上限,剩下的只是把损耗一项项压下去。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/770685.html


