一、静态迁移(冷迁移)
对于静态迁移,你可以在宿主机上保存一个完整的客户机镜像快照,然后在宿主机中关闭或 者暂停该客户机,然后将该客户机的镜像文件复制到另一台宿主机中,使用在源主机中启动该客户机时的命令来启动复制过来的镜像。
二、动态迁移(热迁移)
如果源宿主机和目的宿主机共享存储系统,则只需要通过网络发送客户机的 vCPU 执行状 态、内存中的内容、虚机设备的状态到目的主机上。否则,还需要将客户机的磁盘存储发到目的主机上。共享存储系统指的是源和目的虚机的镜像文件目录是在一个共享的存储上的。
三、在基于共享存储系统时,KVM 动态迁移的具体过程为:
1、迁移开始时,客户机依然在宿主机上运行,与此同时,客户机的内存页被传输到目的主机上。
2、QEMU/KVM 会监控并记录下迁移过程中所有已被传输的内存页的任何修改,并在所有内存页都传 输完成后即开始传输在前面过程中内存页的更改内容。
3、QEMU/KVM 会估计迁移过程中的传输速度,当剩余的内存数据量能够在一个可以设定的时间周期 (默认 30 毫秒)内传输完成时,QEMU/KVM 会关闭源宿主机上的客户机,再将剩余的数据量传输 到目的主机上,最后传输过来的内存内容在目的宿主机上恢复客户机的运行状态。
4、至此,KVM 的动态迁移操作就完成了。迁移后的客户机尽可能与迁移前一致,除非目的主机上 缺少一些配置,比如网桥等。
注意,当客户机中内存使用率非常大而且修改频繁时,内存中数据不断被修改的速度大于KVM能够 传输的内存速度时,动态迁移的过程是完成不了的,这时候只能静态迁移。
关于实时迁移的效率,业界不少人提出了改进的建议,比如通过使用内存压缩技术,减少需要传输的内存的大小
四、迁移注意事项:
1、最好迁移的服务器cpu品牌一样
2、64位只能在64位宿主机间迁移,32位可以迁移32位和64位宿主机
3、宿主机名字不能冲突
4、目的宿主机和源宿主机软件配置尽可能的相同,如有相同的桥接网卡,资源池等。
5、两台迁移的主机 cat /proc/cpuinfo |grep nx 的设置是相同的
NX,全名为“No eXecute”,即“禁止运行”,是应用在CPU的一种技术,用作把存储器 区域分隔为只供存储处理器指令集,或只供数据使用。
任何使用NX技术的存储器,代表仅供数据使 用,因此处理器的指令集并不能在这些区域存储。这种技术可防止大多数的缓冲溢出攻击,即一些 恶意程序,把自身的恶意指令集放在其他程序的数据存储区并运行,从而把整台计算机控制。
五、静态迁移
1.安装虚拟化所需要的环境
yum install qemu qemu-img qemu-kvm libvirt libvirt-python libguestfs-tools virt-install 安装虚拟化程序(如果服务器存在虚拟化环境则不要安装)
grep -e vmx /proc/cpuinfo 检查是否能支持虚拟化
mkdir /kvm-vm/ 创建虚拟机磁盘文件目录
mkdir /kvm-vm/nspool
pool-define-as nfspool netfs --source-host 192.174.1.11 --source-path /mnt/nfs --target /kvm-vm/nspool/ 设置储存池
pool-build nfspool
pool-start nfspool
pool-autostart nfspool
2.拷贝镜像文件和虚拟机配置文件 (我是基于nfs做的 所以只需要拷贝虚拟机配置文件即可)
scp /etc/libvirt/qemu/test1.xml 192.174.1.5:/etc/libvirt/qemu/
3.重新定义此虚拟机
define /etc/libvirt/qemu/test1.xml
4.启动虚拟验证
六、动态迁移:
1.创建共享存储
2.两台机器挂载共享存储(手工挂载;使用资源池)
3.启动动态迁移
4.创建迁移后的虚拟机配置文件
5.重新定义虚拟机
案例实施步骤如下:‘
1、设置主机名、/etc/hosts 互相解析,保证网络连接
vim /etc/hosts
scp /etc/hosts 192.174.1.5:/etc/
2、两台主机的KVM连接NFS共享存储 (如果不会可以查看上篇文章 kvm储存池 或者查看静态迁移中有步骤)
3、在源主机的KVM中新建虚拟机并安装操作系统
4、连接KVM,并进行迁移。’
migrate test3 qemu+ssh://192.174.1.5/system --live --unsafe --verbose
5.查看验证
源主机 (迁移主机test关闭)
迁移主机
七、virsh migrate命令帮助
# virsh migrate --help
[--domain] <string> 域名,id 或 uuid
[--desturi] <string> 客户端(常规迁移)或者源(p2p 迁移)中看到到目的地主机连接 URI
--live 热迁移
--offline 离线迁移
--p2p 点对点迁移
--direct 直接迁移
--tunnelled 管道迁移
--persistent 目的地中的持久 VM
--undefinesource 在源中取消定义 VM
--suspend 部启用目的地主机中的域
--copy-storage-all 使用全磁盘复制的非共享存储进行迁移
--copy-storage-inc 使用增值复制(源和目的地共享同一基础映像)的非共享存储进行迁移
--change-protection 迁移结束前不得对域进行任何配置更改
--unsafe 即使不安全也要强制迁移
--verbose 显示迁移进程
--compressed 实时迁移过程中压缩重复的页
--auto-converge force convergence during live migration
--rdma-pin-all support memory pinning during RDMA live migration
--abort-on-error 在迁移过程中忽略软错误
--migrateuri <string> 迁移 URI, 通常可省略
--graphicsuri <string> 无空隙图形迁移中使用的图形 URI
--listen-address <string> listen address that destination should bind to for incoming migration
--dname <string> 在迁移过长中重新命名为一个新名称(如果支持)
--timeout <number> 如果 live 迁移超时(以秒计)则强制虚拟机挂起
--xml <string> 包含为目标更新的 XML 的文件名
--migrate-disks <string> comma separated list of disks to be migrated
八、 常见错误:
1、迁移时遇到的错误描述:
# virsh migrate centos live qemu+ssh://192.168.30.132/system
error: unable to connect to server at 'KVM2:49152': No route to host
原因:你的免密登录没有成功
解决方法:重新做免密登录即可
2、迁移时的存储错误:
# virsh migrate centos live qemu+ssh://192.168.30.132/system
error: Failed to open file '/mnt/CentOS6.8.qcow2': Input/output error
原因:存储没有挂载成功
解决方法:mount -o remount /dev/sdb /mnt
3、迁移时FQDN错误:
# virsh migrate centos live qemu+ssh://192.168.30.132/system
error: internal error hostname on destination resolved to localhost, but migration requires an FQDN
原因:两台宿主机无法解析主机名
解决方法:重新配置主机名和ip的解析
4.迁移时语法错误:
# virsh migrate centos live qemu+ssh://192.168.30.132:/system
error: internal error Unable to parse URI qemu+ssh://192.168.30.132:/system
原因:qemu+ssh语法写错了 解 决 方 法 :
正 确 的 应 该 是 : virsh migrate centos live qemu+ssh://192.168.30.132/system