KVM虚拟机迁移
-
KVM虚拟机迁移,是将某一虚拟机上的环境和软件完全复制到另一台物理机上继续运行。KVM虚拟机迁移可以优化系统负载、重新规划KVM虚拟机布局并简化KVM虚拟机的管理维护工作。
-
KVM虚拟机迁移的主要应用场景如下所示。
-
当一台KVM宿主机的负载比较高时,可将源KVM宿主机上的部分虚拟机迁移到负载较低的KVM宿主机中,以保证服务质量。
-
\通过KVM虚拟机迁移将多台负载较低的KVM宿主机上的KVM虚拟机集中迁移到某一台KVM宿主机上,从而达到节约资源的目的。
-
在升级KVM宿主机硬件设备时,可以将KVM宿主机上运行的KVM虚拟机迁移到其他KVM宿主机上,以解决对硬件的依赖,从而实现业务不中断情况下对物理硬件设备的升级。
-
跨地域迁移,实现KVM虚拟机的远程迁移。
-
-
迁移方式可分为两种如下所示:
-
静态迁移(Offline Migration)
对于静态迁移,你可以在宿主机上保存一个完整的客户机镜像快照,然后在宿主机中关闭或者暂停该客户机,然后将该客户机的镜像文件复制到另一台宿主机中,使用在源主机中启动该客户机时的命令来启动复制过来的镜像。
-
动态迁移(Live Migration)(Online Migration)
动态迁移是保证KVM虚拟机上运行的应用正常提供服务的同时,让KVM虚拟机在不同的KVM宿主机之间进行迁移。动态迁移的过程仅有非常短暂的停机时间,甚至可以忽略不计,同时KVM虚拟机上已经打开的应用连接不会断开,依然保持不变。KVM的动态迁移有两种方式:一种是基于共享存储的动态迁移,另一种是基于数据块的动态迁移。
- 基于共享存储的动态迁移
- 基于数据块的动态迁移
-
利用VNC安装KVM虚拟机
#使用virt-install 命令安装虚拟机并设置VNC Viewer连接端口
[root@kvm01 ~]# systemctl stop firewalld
[root@kvm01 ~]# systemctl disable firewalld
#创建磁盘文件目录
[root@kvm1 ~]# mkdir -p /data_kvm/store
[root@kvm01 ~]# virt-install -n test01 -r 1024 --vcpus=1 --disk path=/data_kvm/store/test01.qcow2,size=10 -w bridge:br0 --virt-type=kvm --accelerate --autostart -c /opt/CentOS-7-x86_64-DVD-2009.iso --vnc --vncport=5901 --vnclisten=0.0.0.0
- -n:指定虚拟机的名字。
- -r:指定内存大小。
- –vcpu:指定虚拟 CPU 个数。
- –disk:指定磁盘文件放置位置及大小。
- -w:制定所使用的网桥。
- –autostart:设置虚拟机在宿主机开机时启动。
- -c:指定镜像文件。
- –vncport:通过 vnc viewer 连接的端口。
- –vnclisten:通过 vnc
- –accelerate:当安装qemu客户机时,如果支持可用kvm或kqemu内核加速能力,KVM加速器
打开VNC Viewer
新建一个连接以安装虚拟机
#查看是否安装成功
[root@kvm01 ~]# virsh list --all
#启动虚拟机
[root@kvm01 ~]# virsh start test01
#再次连接test01虚拟机,并登录系统
静态迁移
- 静态迁移需要在虚拟机关闭的情况下执行
#查看test01虚拟机当前状态‘
[root@kvm01 ~]# virsh list --all
#如果为开启状态则关闭
[root@kvm01 ~]# virsh shutdown test01
[root@kvm01 ~]# virsh list --all
#导出虚拟机 test01 的 xml 配置文件
[root@kvm01 ~]# virsh dumpxml test01 > test01.xml
[root@kvm01 ~]# ls
#定位虚拟机 test01 的磁盘文件
[root@kvm01 ~]# virsh domblklist test01
#拷贝配置文件与磁盘文件到迁移主机上 先在迁移主机上创建目录
[root@kvm2 ~]# mkdir -p /data_kvm/store
#将kvm01拷贝到kvm02上
[root@kvm01 ~]# scp test01.xml 192.168.10.105:/etc/libvirt/qemu/
[root@kvm01 ~]# scp /data_kvm/store/test01.qcow2 192.168.10.105:/data_kvm/store/
-
在kvm02上配置和启动目标虚拟机
#查看被迁移过来的配置文件和磁盘文件 [root@kvm02 ~]# ls -l /etc/libvirt/qemu [root@kvm02 ~]# ls -l /data_kvm/store/ #重新定义虚拟机 test01 [root@kvm02 ~]# virsh define /etc/libvirt/qemu/test01.xml [root@kvm02 ~]# virsh list --all #启动虚拟机 test01 [root@kvm02 ~]# virsh start test01 [root@kvm02 ~]# virsh list --all #打开虚拟机管理器,查看虚拟机的运行 [root@kvm02 ~]# virt-manager
动态迁移
#打开新的服务器配置NFS服务
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# hostnamectl set-hostname kvmnfs
[root@localhost ~]# bash
[root@kvmnfs ~]# yum -y install nfs-utils
#配置共享目录 创建共享目录
[root@kvmnfs ~]# mkdir /data
[root@kvmnfs ~]# chown -R 777 /data/
[root@kvmnfs ~]# vim /etc/exports
/data 192.168.10.0/24(rw,sync,no_root_squash)
#启动并检查 NFS 服务
[root@kvmnfs ~]# systemctl start nfs
[root@kvmnfs ~]# systemctl start rpcbind
[root@kvmnfs ~]# showmount -e localhost
挂载NFS目录
#主机 kvm01和kvm02上创建 kgc 目录
[root@kvm01 ~]# mkdir /data_kvm/kgc
[root@kvm02 ~]# mkdir /data_kvm/kgc
#挂载共享目录
[root@kvm01 ~]# mount -t nfs 192.168.10.101:/data /data_kvm/kgc
[root@kvm01 ~]# df
[root@kvm02 ~]# mount -t nfs 192.168.10.101:/data /data_kvm/kgc
[root@kvm02 ~]# df
#设置自动挂载
[root@kvm01 ~]# vim /etc/fstab
192.168.10.101:/data /data_kvm/kgc nfs defaults 0 0、
通过现有的磁盘文件生成虚拟机
#拷贝qcow2磁盘文件
[root@kvm01 ~]# cp /opt/CentOS-7-x86_64-GenericCloud-2009.qcow2 /data_kvm/store/test02.qcow2
#部署虚拟机 设置root用户密码
[root@kvm01 ~]# virt-customize -a /data_kvm/kgc/test02.qcow2 --root-password password:aptech
#安装询价
[root@kvm01 ~]# virt-install
--name=test02 -r 1024 --vcpus=1 --disk device=disk,bus=virtio,path='/data_kvm/kgc/test02.qcow2',size=10 \-w bridge:br0 --virt-type=kvm --boot hd
动态迁移
#查看 kvm01 和 kvm02主机上虚拟机的运行状态
[root@kvm01 ~]# virsh list --all
[root@kvm02 ~]# virsh list --all
#更改kvm01文件
[root@kvm01 ~]# virsh shutdown test02
[root@kvm01 ~]# virsh edit test02
#找到<driver name='qemu' type='qcow2'/> 该行
#添加以下内容
cache='none'
#启动test02
[root@kvm01 ~]# virsh start test02
[root@kvm01 ~]# virsh list --all
#迁移虚拟到kvm02
[root@kvm01 ~]# virsh migrate --live --verbose test02 qemu+ssh://192.168.10.105/system tcp://192.168.10.105
migrate :迁移
--verbose :显示迁移的进度
--live:实时迁移
#创建虚拟机 test02 配置文件
[root@kvm02 ~]# ls -l /etc/libvirt/qemu
[root@kvm02 ~]# virsh dumpxml test02 > /etc/libvirt/qemu/test02.xml
[root@kvm02 ~]# cd /etc/libvirt/qemu/
[root@kvm02 qemu]# ll
#定义虚拟机 test02 配置文件
[root@kvm02 qemu]# virsh define /etc/libvirt/qemu/test02.xml
[root@kvm02 ~]# yum -y install centos-release-qemu-ev
[root@kvm02 ~]# vim /etc/yum.repos.d/CentOS-QEMU-EV.repo
#更改以下内容使用国内的源
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=virt-kvm-common
[root@kvm02 ~]# yum -y install qemu-kvm-ev
[root@kvm02 ~]# reboot
迁移前准备工作
[root@kvm01 ~]# vim /etc/hosts
192.168.10.201 kvm01
192.168.10.202 kvm02[root@kvm01 ~]# virsh list --all
[root@kvm01 ~]# virsh shutdown test01[root@kvm01 ~]# virt-clone -o test01 -n test03 -f /data_kvm/store/test03.qcow2
kvm02 上的操作
[root@kvm02 ~]# vim /etc/hosts
192.168.10.201 kvm01
192.168.10.202 kvm02
[root@kvm02 store]# virsh pool-list --all
[root@kvm02 ~]# mkdir -p /data_kvm/store
[root@kvm02 store]# qemu-img create -f qcow2 /data_kvm/store/test03.qcow2 10G
在kvm01主机上执行迁移操作
[root@kvm01 ~]# virsh start test03
[root@kvm01 ~]# virsh migrate test03 qemu+ssh://192.168.10.202/system --live --persistent --undefinesource --copy-storage-all --verbose
--persistent :将域保留为目标主机物理机器的持久性状态
--undefinesource:删除源主机物理机器上的客户机虚拟机
--copy-storage-all :使用全磁盘复制的非共享存储进行迁移
#验证是否迁移成功
[root@kvm01 ~]# virsh list --all
[root@kvm02 ~]# virsh list --all
KVM服务
KSM服务介绍
- Linux内核特性称为Kernel Shared Memory(基于内核的共享内存)或Kernel Samepage Merging。
- KSMD作为守护进程,能够合并内存页面来增加并发虚拟机的数量。KSM 适用于宿主机过载的情况下。
- KSM 通过减少每个虚拟机实际占用的内存数,可以让多个虚拟机分配的内存数量之和大于物理内存数量。
- 而对于相同类型的虚拟机,在物理内存量不变的情况下,可以在一个宿主机中创建更多虚拟机,从而提高虚拟化部署的密度,同时也可以提高物理资源的利用效率。
检查当前 Linux 系统是否支持 KSM
[root@kvm02 ~]# egrep -i ksm /boot/config-3.10.0-1160.el7.x86_64
#看到该行则支持
CONFIG_KSM=y
配置KSM内存优化
#先将虚拟机test01克隆出三份 克隆前先关闭
[root@kvm02 ~]# virt-clone -o test01 -n test02 -f /data_kvm/store/test02.qcow2
[root@kvm02 ~]# virt-clone -o test01 -n test03 -f /data_kvm/store/test03.qcow2
[root@kvm02 ~]# virt-clone -o test01 -n test04 -f /data_kvm/store/test04.qcow2
#开启所有的虚拟机
[root@kvm02 ~]# virsh start test01
[root@kvm02 ~]# virsh start test02
[root@kvm02 ~]# virsh start test03
[root@kvm02 ~]# virsh start test04
#查看Linux宿主机的内存使用情况
[root@kvm02 ~]# free
[root@kvm02 ~]# systemctl start ksm
[root@kvm02 ~]# systemctl start ksmtuned
[root@kvm02 ~]# echo 1 > /sys/kernel/mm/ksm/run
#再次查看Linux宿主机的内存使用情况
[root@kvm02 ~]# free
tart test03
[root@kvm02 ~]# virsh start test04
#查看Linux宿主机的内存使用情况
[root@kvm02 ~]# free
[root@kvm02 ~]# systemctl start ksm
[root@kvm02 ~]# systemctl start ksmtuned
[root@kvm02 ~]# echo 1 > /sys/kernel/mm/ksm/run
#再次查看Linux宿主机的内存使用情况
[root@kvm02 ~]# free