kvm迁移分为冷迁移和热迁移。
冷迁移:虚拟机在关机情况下从hostA迁移至hostB
热迁移:虚拟机在开机情况下从hostA迁移至hostB
本文以centos6.5为例,介绍冷/热迁移的方法。
1. 冷迁移
① 导出虚拟机xml文件(配置文件)
# virsh dumpxml vm-name > dump.xml
vm-name 为你的虚拟机名称
② 拷贝虚拟机磁盘和xml文件(从hostA -> hostB)
# scp /path-to-image/vm-image hostB:/root
# scp dump.xml hostB:/root
vm-image的默认路径为 /var/lib/libvirt/images/ (libvirt管理的虚拟机)
③ 登录hostB, 修改dump.xml
根据B的硬件环境,修改dump.xml的文件内容。
比如<interface>中bridge名称,<disk>中<source file>的路径。
④ 加载虚拟机
# virsh define dump.xml
切记不能用virsh create。否则虚拟机关闭后,该虚拟机从虚拟机列表删除。
如果你要再次使用该虚拟机的话:则必须重新进行create/define操作。
2. 热迁移
英文名称live-migrate,也叫在线迁移。即虚拟机在运行时进行无缝迁移。
本文以centos6为例(被迁移的虚拟机,hostA,hostB均为centos6)进行说明。
① hostA共享虚拟机磁盘目录给hostB
默认情况下,虚拟机磁盘目录为/var/lib/libvirt/image/centos6.img。
把此目录(/var/lib/libvirt/image)设置成nfs共享(这里不详细阐述如何设置nfs)。
hostB通过mount命令把hostA目录挂载至相同路径下(/var/lib/libvirt/image)。
这里有TX肯定会问,如果挂载至hostB的/var/lib/libvirt/image目录下,那么hostB
原目录下的虚拟机文件不就无法读取了?确实是这样的!一旦你挂载了,那么hostB
上原本的虚拟机就无法访问了。除非你自定义磁盘目录到其他路径下,否则无其他方法。
同理,如果你hostA的虚拟机修改了默认磁盘路径,那么你在hostB上必须也创建相同的路径,
用于挂载hostA上的虚拟机磁盘。
② 迁移虚拟机
在hostA上执行下列命令:
# virsh migrate --live vm-name qemu+ssh://hostB/system
然后会提示你输入hostB的root密码,输入完成后就开始迁移了。
这里记录几个live migrate过程中遇到的problem及其workaround
A. error: Unable to resolve address '***" service "**" : Name or service not know
B. error: Unable to resolve address '***" service "**" : Temporary failure in name resolution
这两个问题都是因为hostname没有设置的原因。
解决方法是 :1. hostA和hostB都设置hostname 2. 在/etc/hosts文件中配置对方hostname解析
C. error: unsupport configuration: Unable to find security driver for label selinux
这个问题是因为hostA和hostB的selinux状态不一样。可能hostA是permission/enforce而hostB是disabled。
这个问题修改方法如下:(假设hostA是permissive ,hostB是disabled)
1. 修改hostA的/etc/selinux/config, selinux改成disabled
2. 修改/etc/libvirt/qemu.conf文件,把selinux-dirver改成none
3. 重启hostA
4. virsh start vm --force-boot (必须加上force-boot参数,否则无法启动vm)
5. 执行迁移命令
关于这点我还有个想法:那就是把hostB的selinux开启,是不是也能解决问题。
这个我还没有试验,mark一下。欢迎试验过得TX留言补充~~