概念:
虚拟机的迁移是指,在vmm上运行的虚拟机系统能够转移到其他物理机vmm上运行。进一步接触了硬件软件之间的耦合性,一般用于在不停机的情况下对业务组件进行调整,还可以调整负载,跨区域转移等。
静态迁移也叫做常规迁移,是在虚拟机关闭或者暂停的情况下从一台宿主机迁移到令一台宿主机。关闭虚拟机后,将配置文件和镜像移到另一台宿主机即可,如果需要保存虚拟机迁移之前的状态,可以暂停后把内存数据转储下来然后拷贝到目标主机上。
静态迁移都会有虚拟机停止运行的过程,会有业务中断的弊端。动态迁移不会影响业务,迁移过程最初是在原宿主机上运行,当迁移到一定阶段后,目标宿主机已经具备所有资源后,会有一个短暂的暂停,把控制权从原宿主机转移到目标宿主机。由于迁移过程非常端,对用户是透明的。适合对服务器可用性要求高的场合。
静态迁移
同一宿主机内迁移
比如我要把win2k3如/var移动到/vm
直接移动镜像
然后改一下配置
virsh edit win2k3
source这里改动,完成。
不同宿主机之间迁移
导入磁盘的方法
现在我主机win10上vmware有宿主机KVM1和KVM2,我要把KVM1里的win2k3拷到KVM2里去,首先记下kvm2的ip 192.168.160.136
然后回到KVM1,确保win2k3关闭状态,用rsync传到kvm2的/vm下
rsync -avSHP /vm/win2k3.qcow2 root@192.168.160.136:/vm/
然后把配置文件也传过去
重定向
virsh dumpxml win2k3 > /tmp/1.xml
rsync -avSHP /tmp/1.xml root@192.168.160.136:/tmp
切换到kvm2,用传过来的文件定义
virsh define /tmp/1.xml
启动时报错
关了kvm2,从vmware上设置
继续报错,再把virtio也弄过去
还有错,上次filter那个也得有
update-device把filter去了,启动成功
kvm1上win2k3的东西删掉,这就迁移完成了。
virsh migrate方法
virsh migrate只能迁移配置文件,磁盘镜像文件还要我们手工完成。
在kvm2上
virsh undefine win2k3 //只删除了配置文件
rm /vm/win2k3.qcow2 -i
切换到kvm1
virsh migrate --domain win2k3 --desturi qemu+ssh://root@192.168.160.136/system --offline --persistent
然后把win2k3的镜像拷过去
切换到kvm2
可以打开
动态迁移
基于共享存储的动态迁移
做一个实验规划
实验目标:kvm1上的centos7.0-2是存储再nfs上的,把它迁移到kvm2.
NFS服务器配置
双网卡
nfs-ens33:192.168.160.137 业务网
nfs-ens37:192.168.160.138 存储网
安装nfs,具体参照KVM学习(九) 配置export目录
mkdir /vm
vim /etc/exports
启动nfs首先启动rpc
systemctl start rpcbind
systemctl start nfs-server
systemctl enable rpcbind
systemctl enable nfs-server
把防火墙关了
systemctl disable firewalld.service
切换kvm1
安装nfs-utils
showmount -e 192.168.160.138
找到/vm则进行下一步
mkdir /vmdata
mount 192.168.160.138:/vm /vmdata
virsh edit centos7.0-2
路径换成nfs的
然后把qcow2传过去
mv /vm/centos7a.qcow2 /vmdata
此时由于SELinux启动着呢,centos7.0-2是打不开的Permission denied
临时禁用它(SELinux是特别有价值的一个安全组件,不建议disable)
setenforce 0
然后启动正常
为什么nfs启动不起来虚拟机呢?
不是所有的文件系统支持对单个的文件加label,例如NFS,NTFS,vFat等。所以,我们还需要通过setsebool来启用SElinux boolean。在所有的宿主机上执行。
关闭cents7.0-2
setenforce 1
setsebool -P virt_use_nfs 1
切换kvm2
做一样的操作
setsebool -P virt_use_nfs 1
安装nfs-utils
showmount -e 192.168.160.138
找到/vm则进行下一步
mkdir /vmdata
mount 192.168.160.138:/vm /vmdata
virsh edit centos7.0-2
通过virt-manager进行迁移
配置主机名解析
在kvm1和kvm2和nfs的/etc/hosts加上这些
192.168.160.132 kvm1
192.168.160.136 kvm2
192.168.160.135 kvm1-stor
192.168.160.139 kvm2-stor
配置防火墙
我嫌麻烦就把防火墙关了
给出正确操作
所有结点:
firewall-cmd --add-port=16509/tcp --permanent
firewall-cmd --add-port=49152-49215/tcp --permanent
firewall-cmd --reload
切换到kvm1
打开virt-manager左上角新建连接,
提示要安装openssh-askpass,输入yes,密码连接成功。
从kvm1上把kvm2的win2k3删掉,发现实际kvm2目录下文件并没有删掉。这个不知道为什么,手动去kvm2下删掉。
在centos7.0-2处于运行条件下,右键迁移
报错了cannot access storage file
从头检查,由于我隔天做的实验,kvm1及kvm2的mount /vm /vmdata不知道为什么重启后没了,重新mount,确保kvm1和kvm2都能看到nfs中的centos7a.qcow2.
迁移到了kvm2,随便vim一个配置文件,再迁移回去,发现确实还保留着文件的open
virsh migrate
必须参数,虚拟机 迁到哪
进入virsh
migrate centos7.0-2 qemu+ssh://root@kvm2/system --live --unsafe --persistent --undefinesource
如果管理的ip和迁移的ip不一样,还可以加参数
--migrateuri tcp://xxx.xxx.xxx.xxx
本地存储的动态迁移
无共享存储的必要条件
1、使用virsh的–copy-storage-all
2、virt-manager支持的不好
3、需要有实时存储迁移(块迁移)支持
标准的RHEL/CentOS7的qemu-kvm不支持
oVirt或RHEV支持CentOS7必须安装一下两个包
yum install centos-release-qemu-ev # from CentOS7 Extras
yum install qemu-kvm-ev
4、虚拟机要在存储池中
调整实验目标
把kvm1本地的centos7迁移到kvm2
切换到kvm1
先按共享存储的那种方法试试
报错cannot access storage file,其实这里并不是kvm1找不到这个iso文件,而是kvm2根据配置文件define虚拟机时没找到。
根据migrate --help可以找到–copy-storage-all是用来做这种没有共享存储的,加上后发现依然不行。因为这个版本的kvm对于–copy-storage-all是没有做动作的。
centos7基础版本是做不到动态迁移本地虚拟机的,我们需要给kvm1和kvm2做一个升级。
yum install -y centos-release-qemu-ev
yum install -y qemu-kvm-ev
由于qemu-kvm-ev安装时会把qemu-kvm删除,所以安完后重启一下。
再来
这次错误不一样了,提示no storage pool,这里依然是kvm2没有/vm的池
切换到kvm2
建池子三连
pool-define-as vm dir --target "/vm"
pool-start vm
pool-autostart vm
切换回kvm1
migrate centos7.0 qemu+ssh://root@kvm2/system --live --unsafe --persistent --undefinesource --copy-storage-all
又提示我kvm2存储空间不够了
因为我的centos7加了有40G的disk,不知道kvm2是不是也得要有40G的空间,所以换了一个没额外硬盘的erp,erp是第六节里创建的以centos7为后备差异镜像的10G硬盘虚拟机
给kvm2扩容到40G,挂载到/vm,重建个vm存储池
成功!踩了几乎所有坑。