前面步骤,后面操作日志
在KVM环境下进行冷迁移(虚拟机关机状态迁移)的步骤如下,整个过程需确保虚拟机处于完全关闭状态:
详细步骤
_1. 关闭虚拟机(源宿主机操作)
# 检查虚拟机状态
virsh list --all
# 关闭虚拟机(若未关机)
virsh shutdown <虚拟机名称> # 优雅关机
# 或强制关机(如果shutdown无效)
virsh destroy <虚拟机名称> # 强制断电
_2. 备份虚拟机配置文件(源宿主机操作)
# 导出虚拟机XML配置
virsh dumpxml <虚拟机名称> > /path/to/backup/<虚拟机名称>.xml
_3. 复制虚拟机磁盘文件到目标宿主机
确认磁盘路径(从XML配置或以下命令获取):
virsh domblklist <虚拟机名称>
使用scp或rsync复制磁盘文件(以rsync为例,保留权限):
# 源宿主机执行(复制到目标宿主机的存储目录)
rsync -avP /var/lib/libvirt/images/<虚拟机磁盘>.qcow2 user@目标主机IP:/var/lib/libvirt/images/
注意:替换/var/lib/libvirt/images/为实际存储路径(如LVM卷、NFS等)。
_4. 复制配置文件到目标宿主机
scp /path/to/backup/<虚拟机名称>.xml user@目标主机IP:~/
_5. 在目标宿主机上注册虚拟机
bash
# 定义虚拟机
virsh define ~/<虚拟机名称>.xml
# 验证是否添加成功
virsh list --all
_6. 调整配置文件(如有必要)
修改磁盘路径(如果目标主机存储路径不同):
bash
virsh edit <虚拟机名称>
找到<disk>段,修正source file路径:
xml
<disk type='file' device='disk'>
<source file='/correct/path/to/<虚拟机磁盘>.qcow2'/>
...
</disk>
检查网络配置(如网桥名称不同):
修改<interface>段中的source bridge值(例如从br0改为br1)。
_7. 启动虚拟机(目标宿主机操作)
virsh start <虚拟机名称>
_8. 验证迁移
检查虚拟机状态:
virsh console <虚拟机名称> # 连接控制台
验证网络、服务是否正常。
_9. 清理源宿主机(迁移成功后)
# 注销虚拟机(保留磁盘文件则跳过删除)
virsh undefine <虚拟机名称> # 移除配置
# 删除磁盘文件(确认迁移成功后再执行)
rm /var/lib/libvirt/images/<虚拟机磁盘>.qcow2
关键注意事项
磁盘路径一致性
确保目标宿主机的存储路径与XML配置中的路径一致(或修改XML),否则启动失败。
网络配置
若源/目标宿主机使用不同名称的网桥,需在XML中更新<interface>配置。
存储类型兼容性
共享存储(如NFS):无需复制磁盘文件,直接修改XML指向共享路径。
本地存储:必须复制磁盘文件(如上述步骤)。
虚拟机名称冲突
目标宿主机上不能存在同名虚拟机,否则define会失败。
权限问题
确保目标宿主机的libvirt用户(通常为qemu或libvirt-qemu)有权访问磁盘文件:
chown root:libvirt-qemu /var/lib/libvirt/images/<磁盘文件>.qcow2
[root@cloud42 ~]# virsh list --all
Id Name State
---------------------------------------------
- worker3.prod.opencloud.com shut off
[root@cloud42 ~]# cd /
[root@cloud42 /]# ls
bin boot dev etc home iso lib lib64 media mnt opt proc root run sbin software srv sys tmp usr var work work-20250220.tar
[root@cloud42 /]# cd work
[root@cloud42 work]# mkdir temp
[root@cloud42 work]# cd temp/
[root@cloud42 temp]# ls
[root@cloud42 temp]# virsh dumpxml worker3.prod.opencloud.com /work/temp/worker3.xml
error: unexpected data '/work/temp/worker3.xml'
[root@cloud42 temp]# virsh dumpxml worker3.prod.opencloud.com > /work/temp/worker3.xml
[root@cloud42 temp]# ls
worker3.xml
[root@cloud42 temp]# virsh domblklist worker3.prod.opencloud.com
Target Source
--------------------------------------------------------------------
vda /var/lib/libvirt/images/worker3.prod.opencloud.com.qcow2
sda /software/rhcos-4.17.0-x86_64-live.x86_64.iso
[root@cloud42 temp]# ls
worker3.xml
[root@cloud42 temp]# rm -f worker3.xml
[root@cloud42 temp]# ls
[root@cloud42 temp]# virsh dumpxml worker3.prod.opencloud.com > /work/temp/worker3.xml
[root@cloud42 temp]# ls
worker3.xml
[root@cloud42 temp]# virsh domblklist worker3.prod.opencloud.com
Target Source
--------------------------------------------------------------------
vda /var/lib/libvirt/images/worker3.prod.opencloud.com.qcow2
[root@cloud42 temp]# rsync -avP /var/lib/libvirt/images/worker3.prod.opencloud.com.qcow2 root@10.11.13.51:/var/lib/libvirt/images
root@10.11.13.51's password:
sending incremental file list
worker3.prod.opencloud.com.qcow2
643,304,587,264 100% 111.85MB/s 1:31:25 (xfr#1, to-chk=0/1)
sent 643,461,644,161 bytes received 35 bytes 116,961,127.73 bytes/sec
total size is 643,304,587,264 speedup is 1.00
[root@cloud42 temp]# pwd
/work/temp
[root@cloud42 temp]# scp /work/temp/worker3.xml root@10.11.13.51:~/
root@10.11.13.51's password:
worker3.xml 100% 5539 645.0KB/s 00:00
[root@cloud42 temp]#
在目标机器上的操作
[root@cloud51 5.1.2]# cd /root
[root@cloud51 ~]# ls
anaconda-ks.cfg worker3.xml
[root@cloud51 ~]# virsh define ~/worker3.xml
Domain 'worker3.prod.opencloud.com' defined from /root/worker3.xml
[root@cloud51 ~]# virsh list --all
Id Name State
----------------------------------------------
- worker3.prod.opencloud.com shut off
[root@cloud51 ~]#
打开web console,可以看到迁移的虚拟机。