把虚拟机的文件拷贝到Linux服务器,最靠谱的方式是使用scp或rsync命令,单文件用scp,大目录或断点续传用rsync。服务器上配置好SSH服务后,这两条命令就能完成绝大多数场景的拷贝任务,下面按不同网络环境和文件大小,把实操过程拆开细说。
虚拟机怎么拷贝到linux服务器上?三种主流方式对比
很多朋友第一次做这件事时,容易在“图形界面拖拽”和“命令行传输”之间犹豫,实际工作里,命令行传输才是主流,因为稳定、可控、可脚本化,在对比之前,记住一个核心逻辑:虚拟机能把文件“推”给服务器,也能让服务器主动“拉”取,关键在于你从哪边发起连接。
- scp(Secure Copy):基于SSH协议,适合拷贝单个文件或小目录,命令简单,加密传输。
- rsync:增量同步工具,适合大目录、海量小文件,支持断点续传,还能保留权限和时间戳。
- 挂载镜像或磁盘直拷:虚拟机关机后,用mount命令挂载镜像文件,适合离线场景或云镜像迁移。
行业共识认为,rsync在100GB以上的数据迁移中具有不可替代的优势,因为中断后不需要从头开始,在实际运维中,我见过不少同事直接用scp传一个完整的虚拟机目录,传到一半断了又重来,浪费了大半天,这种教训现实中不少。
具体差异用一张表格说明:
| 方式 | 适用场景 | 速度感受 | 断点续传 | 上手难度 |
|---|---|---|---|---|
| scp | 单个文件、少量配置 | 快 | 不支持 | 极低 |
| rsync | 大目录、增量备份 | 中等到快 | 支持 | 中等 |
| 挂载拷贝 | 离线镜像、冷迁移 | 受磁盘IO限制 | 不支持 | 较高 |
准备工作:网络连通与SSH权限配置
不管用哪种命令行方式,前置条件都一样:虚拟机要能访问到Linux服务器的SSH端口,默认是22,这一步卡住的人不少,尤其是VMware虚拟机里的NAT网络模式,经常导致从虚拟机往外连服务器失败。
第一件事:测试网络通不通
在虚拟机终端里执行:
ping 服务器IP地址
如果ping不通,看虚拟机的网络模式,桥接模式下虚拟机相当于局域网内的一台独立主机,只要服务器IP可达就能通,NAT模式下,需要确认服务器防火墙还允许来自你当前网段的连接。
更直接的方法是用nc测试端口:
nc -vz 服务器IP 22
如果返回succeeded,说明SSH端口通着,可以继续,返回Connection refused,说明SSH服务没启动或防火墙拦了,先排查这两项。
第二件事:准备SSH账号和免密登录
每次拷贝都输密码不是不行,但遇到大文件传输中断后需要重新连接,密码输入会让人抓狂,建议先配置SSH密钥:
- 在虚拟机里生成密钥对:
ssh-keygen -t rsa -b 4096 - 查看公钥:
cat ~/.ssh/id_rsa.pub - 追加到服务器的
~/.ssh/authorized_keys里
这个动作完成后,scp和rsync都不再需要输入密码,脚本化运维也变得容易,需要注意的是,虚拟机里的公钥要确认是你当前用户的,不是root的,否则后续命令可能需要sudo配合。
内网虚拟机拷贝到linux服务器命令:scp与rsync实操
内网环境带宽高、延迟低,是最高效的传输环境,这里给出两个高频场景的命令模板,直接复制替换路径就能用。
scp:适合传递配置文件、镜像模板
从虚拟机拷贝单个文件到服务器:
scp /path/to/local/file 用户名@服务器IP:/目标路径/
比如把虚拟机里的nginx.conf推送到服务器:
scp /etc/nginx/nginx.conf root@192.168.1.100:/etc/nginx/
拷贝整个目录加-r参数:
scp -r /path/to/local/directory 用户名@服务器IP:/目标路径/
想让传输过程显示进度条,用-v参数,想限速防止占满虚拟机带宽,用-l参数,单位是Kbit/s,比如限速5MB/s:
scp -l 40960 /data/vm-images/ubuntu.qcow2 root@192.168.1.100:/data/
实际使用scp时,最容易被忽略的是端口变化,服务器如果改了SSH端口,scp要用大写-P指定,而rsync用小写-p,这个大小写区别坑过不少人。
rsync:适合虚拟机整体目录和增量备份
rsync的推荐参数组合是-avz --progress,含义分别是归档模式、压缩传输、显示进度,从虚拟机拷贝到服务器:
rsync -avz --progress /path/to/local/directory/ 用户名@服务器IP:/目标路径/
注意源路径结尾的斜杠,带了斜杠表示同步目录内容到目标路径中,不带斜杠会在目标路径里创建一个同名目录,这个细节很多人都栽过跟头,导致目标目录结构多套了一层。
大文件传输中断后,重新执行同一条命令,rsync会跳过已传输的部分,这叫断点续传,有一次我在传一个20GB的虚拟机磁盘镜像,中途办公楼断电,来电后重新跑命令,只花了10分钟就传完了剩余部分,这是scp做不到的。
虚拟机文件拷到linux服务器常见故障与解决方法
传输过程中弹出的报错各有原因,挑几个出现频率最高的说一下。
Permission denied(权限被拒绝)
业内专家指出,大多数拷贝失败源于服务器端目录权限配置遗漏,目标目录需要当前登录用户有写权限,如果没有,在服务器上执行chown修改属主,或chmod增加写权限。
Connection timed out(连接超时)
先ping服务器IP,通了再nc测端口,超时要考虑服务器端防火墙、安全组规则、路由表三个层面,国内云服务商通常需要额外在控制台的安全组里放行源IP,这一步经常被忘记,局域网内传输超时,多数是中间交换机做了端口隔离,跨VLAN拷贝要先确认归属。
rsync错误码12
这个错误通常是因为目标磁盘空间不足,传输前先用df -h查看服务器剩余空间,很多情况下,rsync检查空间用的还是逻辑卷的快照,和实际可用空间有误差,最好预留10%的余量。
断点续传的边界问题
rsync处理中断没有问题,但SMB或NFS挂载拷贝时,中断后看不到进度,容易焦虑,此时用ctrl+c停掉,重新挂载后先ls -lh对比文件大小,如果一致才能放心用,否则要重新拷一遍。
不同场景的特殊处理:磁盘直拷与格式转换
有些场景不能简单用scp或rsync,比如Windows虚拟机里的文件,或者需要把整个虚拟磁盘迁移到Linux服务器上。
虚拟机直接挂载到宿主机
VMware的vmdk文件无法直接在Linux服务器上正常识别成普通分区,需要先转换格式,用qemu-img工具转换:
qemu-img convert -f vmdk -O qcow2 source.vmdk target.qcow2
转换完成后,把qcow2镜像上传到服务器,这种方法适合冷迁移,虚拟机必须关机。
如果只是Windows虚拟机里的几个文件需要拷贝到服务器,思路就简单得多:先启动Windows虚拟机,在里面装WinSCP或直接用PowerShell的scp命令推送到服务器,Windows 10以上系统自带OpenSSH客户端:
scp C:pathtofile 用户名@服务器IP:/目标路径/
通过反向隧道穿透外网
虚拟机在外网、服务器在内网,或者两者都不在同一局域网时,可以从服务器发起ssh反向隧道,在服务器上执行:
ssh -R 2222:localhost:22 虚拟机用户@虚拟机IP
然后从服务器往虚拟机的22端口连,就能从服务器主动拉取文件了,这种方式比配置端口转发更简洁,适合临时使用。
带价格因素的选择方式
不少人在选择拷贝方式时,会考虑虚拟机拷贝到linux服务器价格问题,内网传输零成本,公网传输费用主要由云服务商的带宽费决定,如果虚拟机是本地软件创建的,完全没有硬件采购成本,时间成本和运维复杂度才是你想得最多的因素,决定了是直接scp还是搭建rsync增量任务。
给虚拟机镜像瘦身:降低传输时间的前提
镜像文件太大时,再怎么优化传输参数也没用,先瘦身再传是更实际的思路。
清理虚拟机里的缓存和临时文件:Linux虚拟机执行sudo apt clean或yum clean all;Windows虚拟机用自带的磁盘清理工具,清理后,把磁性磁盘的剩余空间置零,这样压缩后体积会小很多。
如果虚拟机用的是qcow2格式,还可以在关闭虚拟机后执行:
virt-sparsify --in-place /var/lib/libvirt/images/vm.qcow2
这会把镜像里未使用的空间释放掉,文件体积明显缩小,传输时间随之大幅缩短。
镜像瘦身做完后,再综合判断选哪种方式,数据量小于5GB,scp能搞定;数据量更大且未来还要定期同步,rsync是长期更合适的选择,所有这些操作都有一个前提:目标目录有充足的磁盘空间,以及SSH服务状态正常。
Q:虚拟机里的文件能不能直接拷贝到linux服务器?
能,最快的方式是虚拟机里执行scp命令往外推,前提是服务器开了SSH并给了你有写权限的目录,如果文件在Windows虚拟机里,用WinSCP图形界面拖拽也是成熟方案,服务器端无需额外安装客户端软件,整个过程只依赖SSH协议,和虚拟化平台无关。
Q:虚拟机拷贝到linux服务器时速度很慢怎么办?
先确认两端处于同一个内网,跨公网传输速度慢是物理限制,可以压缩再传,或用rsync -z启用传输压缩,还慢就检查服务器端CPU是否有加密指令集负载,SSH的加密算法也可以换成更快的aes128-ctr,在服务器SSH配置中修改Ciphers项后重启sshd。
Q:拷贝完成后虚拟机是否可以直接在服务器上运行?
不行,直接拷贝的文件只能作为数据备份,要让它在服务器上跑,需要把虚拟机磁盘镜像转换格式后导入到KVM或Xen等虚拟化平台,转换工具用qemu-img,然后修改虚拟机的XML配置文件和磁盘路径,整个流程相当于冷迁移,虚拟机和宿主机都必须保持关机状态。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/708340.html





