Linux虚拟机完整移植的核心思路是把虚拟机看成“磁盘文件 + 配置描述”的组合,完整迁移等于同时搬走这两样东西,移植前统一磁盘格式、移植后修一次网络和引导,成功率就非常高。
先搞清楚:你要的是“冷迁移”还是“热迁移”
很多朋友问linux虚拟机怎么迁移到另一台服务器,其实没有统一答案,取决于你能否接受停机。冷迁移是关机后拷贝磁盘镜像,简单可靠,99%的场景推荐。热迁移依赖KVM或VMware的高级特性,要求源和目标主机共享存储、CPU型号一致,普通用户基本用不上。
本文主要讲冷迁移的完整流程,这也是百度搜索上问得最多、最实操的部分,无论你的虚拟机跑在VirtualBox、VMware还是KVM上,底层逻辑都一样:导出虚拟机规格 → 复制磁盘文件 → 在目标平台重建并修配置。
移植前准备:这步做不好,后面全白搭
先确认磁盘格式,再谈迁移
不同虚拟化平台的磁盘格式不通用,VMware默认用vmdk,VirtualBox默认也是vmdk,KVM/QEMU用qcow2或raw,Hyper-V用vhdx,你需要先qemu-img info /路径/磁盘文件看一眼格式,记下磁盘大小和格式,如果格式不匹配,后面用qemu-img convert统一转换。
快照是个大坑,务必提前处理
如果你的虚拟机打了多个快照,磁盘文件不是单一体,而是“当前盘 + 多个增量链”,直接拷贝这种磁盘到新机器,大概率起不来或数据缺失,行业共识是:先把所有快照合并到当前状态,再执行迁移,在VirtualBox里用VBoxManage snapshot discard,在KVM里用virsh blockcommit,VMware直接在界面里“删除快照(合并)”即可。
关键点:备份先于一切
不要嫌啰嗦,迁移前至少拷贝一份原始磁盘文件到外部存储,磁盘文件损坏是迁移失败排名第一的原因,尤其跨文件系统拷贝时容易丢数据,一个几分钟的备份动作,能救回一整天的辛苦。
linux虚拟机怎么迁移到另一台服务器:三条实用路径
OVF/OVA模板迁移(最推荐,适合跨平台)
OVF是开放的虚拟机封装格式,主流的VirtualBox、VMware、XenServer都支持,它的好处是把虚拟机的CPU核数、内存大小、网卡配置、磁盘控制器类型全部打包在一个描述文件里,目标平台能自动重建硬件配置。
步骤如下:
- 在源机器上关机虚拟机
- 选择文件 → 导出OVF(VirtualBox叫“导出虚拟电脑”,VMware叫“导出为OVF”)
- 把导出的文件夹(含.ovf和.vmdk)拷贝到目标机器
- 在目标平台选择导入,注意核对虚拟机的内存和CPU设置
- 启动前先不要改任何配置,用“仅启动”模式测试能否开机
这种方式的坑在于:不同版本的OVF兼容性不完全一致,老版本平台导出的包在新平台一般没问题,反过来则可能报“不支持的文件版本”,遇到这种情况,直接用下面的路径二。
纯磁盘镜像拷贝(最通用,适合同平台)
如果你从一台KVM主机迁到另一台KVM主机,根本不需要导出OVF,直接拷贝qcow2文件更省事。
# 源机器上查看磁盘路径 virsh domblklist 虚拟机名 # 拷贝到目标主机 scp /var/lib/libvirt/images/linux-node.qcow2 root@目标IP:/var/lib/libvirt/images/ # 目标主机上定义虚拟机 virsh define /etc/libvirt/qemu/linux-node.xml
注意:/etc/libvirt/qemu/linux-node.xml里的磁盘路径要改成目标机器的实际路径,启动前建议用virsh edit linux-node核对磁盘类型和总线类型,比如原来用SATA,迁移后目标机器默认IDE,容易发生开机找不到磁盘。
块设备级迁移(适合大磁盘、无快照)
如果磁盘文件特别大(超过几百GB),用dd或rsync做块级别拷贝比复制镜像更快也更稳,前提是目标磁盘容量不小于源磁盘,命令参考:
dd if=/dev/vg01/lv-src of=/mnt/usb/linux-disk.img bs=4M status=progress
这个方法适合折腾老手,新手容易搞混源和目标,不建议首选。
linux虚拟机迁移后网络配置:这是一个必踩的坑
迁移过程里最让人头疼的不是磁盘,而是网络,很多人的经历是:虚拟机在目标平台能开机,但就是ping不通,其实就是网卡名称或配置文件漂移了。
网卡名称变了怎么办
现代Linux发行版用netplan或NetworkManager管理网络,网卡名通常叫ens33、eth0、enp1s0这类,迁移到新平台后,目标机器的PCI总线顺序可能不同,网卡名就从ens33变成了ens34或enx0c123456,解决办法是:
- 登录虚拟机(通过控制台),输入
ip addr确认新网卡名 - 编辑网络配置文件,把旧网卡名改成新名字
- 或者更彻底:删除70-persistent-net.rules等网卡绑定规则文件,让系统重新识别
# 以Ubuntu/Debian系为例 cat /etc/netplan/00-installer-config.yaml # 修改eth0为ens34后执行 netplan apply
IP地址冲突与路由修复
目标环境的IP网段很可能和源环境不一致,如果你原来配置的是静态IP,迁移后要按新网段修改IP、网关、DNS,如果是DHCP,把网卡配置改成dhcp: true就行,另外检查一下/etc/resolv.conf
,有时候它被NetworkManager覆盖成旧的DNS,需要重新设置。
防火墙规则别漏了
如果你源虚拟机启用了firewalld或ufw,迁移后这些规则会原样带过去,如果目标环境的安全组或物理防火墙策略变了,规则可能会误伤,建议迁移后第一时间systemctl disable firewalld临时关闭,确认网络正常再按需放行端口。
驱动与引导修复:让虚拟机在新硬件上活过来
virtio驱动:性能与兼容性的分水岭
在KVM环境下,如果目标宿主机开启了virtio磁盘和virtio网卡,而虚拟机内缺少对应驱动,轻则性能骤降,重则直接在开机阶段死机,解决办法:迁移后先用IDE磁盘和e1000网卡启动,进入系统,安装virtio驱动,再关机切换回virtio模式,多数Linux发行版的内核自带virtio驱动,但老版本内核(如CentOS 6)需要手动加载。
GRUB引导修复:报错“找不到磁盘”的根源
迁移后启动到GRUB阶段报错,通常是因为引导配置里的磁盘路径和实际不符,最常见的是/boot/grub2/grub.cfg里的root=UUID=...指向旧磁盘的UUID,新环境下磁盘UUID变了,需要进入救援模式执行:
grub2-mkconfig -o /boot/grub2/grub.cfg # 或者重装grub到目标磁盘 grub2-install /dev/vda
磁盘UUID导致的挂载失败
除了内核引导,/etc/fstab里也写死了根分区或数据分区的UUID,迁移后找不到对应UUID,系统会进入emergency模式,查看lsblk -f确认新UUID,然后改fstab,这条经验适用于所有Linux虚拟机跨平台迁移方案。
企业场景下的迁移成本与时间规划
很多做运维的朋友会对比哪种方式便宜,实际上核心成本在停机窗口,一个应用级虚拟机(10GB磁盘、4G内存),冷迁移整个流程熟练工大约花费30分钟到1小时,其中拷贝文件占大头,配置修复占小头,如果磁盘超过100GB,用内网千兆传输也至少要20分钟以上,算上修复时间,建议预留半天停机窗口。
在选型上,KVM到KVM用磁盘拷贝,VMware到KVM用OVF再转qcow2,VirtualBox到VMware用OVF最省事,每种组合的坑不太一样,但核心思路没变:格式先统一,快照先合并,网卡先改名。
移植后的功能验证清单
别急着把源虚拟机删了,至少验证以下几点:
- 开机能否正常进入登录界面或服务状态
- 网络通不通,外网和内网分离的路径都测一遍
- 文件系统挂载是否完整,尤其数据盘要单独确认
- 应用服务能否正常监听端口,数据库能否正常读写
- 计划任务crontab是否正常触发,很多迁移后问题出现在定时任务上
常见疑难杂症排查思路
迁移后时间漂移严重
多数情况下是因为虚拟机的时钟源从TSC变成了Hyper-V时钟或KVM-clock,导致时间跳变,检查hwclock和系统日志,必要时修改内核启动参数clocksource=kvm-clock。
鼠标键盘失灵(图形界面机器)
如果你迁移的是带GUI的虚拟机,突然发现鼠标键盘没反应,多半是USB控制器类型变了,把虚拟机设置中的USB控制器从2.0改成3.0,或者换一下USB兼容模式。
qemu-img convert的深水区:跨格式迁移的正确姿势
这是很多教程藏着掖着的点,VMware的vmdk迁移到KVM,直接用OVF导入有时候网络配置会乱,不如手动convert干净:
qemu-img convert -f vmdk -O qcow2 vm-disk.vmdk linux-qcow2.img
转换时建议加-p参数看进度,转换完成后,用qemu-img info确认虚拟大小和实际大小,再进行后续的virtio切换,反过来,KVM迁VMware则执行反向命令,输出-O vmdk。
这一步比较吃CPU,转换大镜像时机器会卡,建议在晚上业务低峰期操作。
物联网和边缘计算场景的特殊注意
如果你把虚拟机迁到一台只有ARM架构的边缘主机(比如华为鲲鹏或树莓派上跑QEMU),就要注意CPU架构完全不同,上面的所有方法全部失效,这种场景必须用兼容层(比如qemu-system-aarch64模拟x86)或者把应用重新部署到ARM容器里,本地化改造的工程量不亚于重新部署,业内专家指出,这类跨架构迁移目前没有一键方案,几乎全是人工适配工作。
Q&A:关于linux虚拟机迁移的疑难解答
迁移后虚拟机的IP地址必须变吗?
不一定,如果你的目标环境可以配置和源环境相同的网段,直接沿用旧IP可以最小化配置改动,只要改一下网卡名匹配和路由表,服务就能起来,但建议先确认目标环境的DHCP地址池是否包含这个IP,避免冲突。
为什么迁移后应用连不上数据库?
先排查网卡名和防火墙,这两项是最高频原因,如果网络都正常,再看数据库配置文件里的监听地址是否绑定在旧IP上,MySQL的bind-address和PostgreSQL的listen_addresses里如果写死了旧IP,就要同步改成新IP,整个流程就是逐层排查。
有没有不需要拷贝磁盘的工具?
有,比如使用rsync做增量同步的“准在线迁移”方案,但本质上还是先把磁盘拷过去,差别在于源虚拟机可以不停机,先把大部分数据同步过去,再短暂停机做最终增量同步,这种方式能大幅压缩停机时间,但实施复杂度高,建议只在服务不能长停的场合使用。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/622250.html




