KVM虚拟机迁移
迁移的应用场景
- 宿主机负载比较高时,可迁移走部分虚拟机
- 迁移虚拟机集合于一台,节约资源
- 升级宿主机硬件时,可先迁移走在进行升级
- 可实现跨地域的远程迁移
迁移的类型
- 静态迁移
- 动态迁移
- 基于共享存储的动态迁移
- 基于数据块的动态迁移
virt-install 安装命令各选项的具体作用如下所示:
- -n:指定虚拟机的名字。
- -r:指定内存大小。
- --vcpu:指定虚拟 CPU 个数。
- --disk:指定磁盘文件放置位置及大小。
- -w:制定所使用的网桥。
- --autostart:设置虚拟机在宿主机开机时启动。
- -c:指定镜像文件。
- --vncport:通过 vnc viewer连接的端口。
- --vnclisten:通过 vnc viewer 连接的 IP。
内核同页合并
KSM(Kernel SamePage Merging)被称为内核同页合并。KSM 允许内核在两个或多个进程之间共享完全相同的内存页。KSM 让内核扫描正在运行中的程序并比较它们的内存,如果发现它们的内存区域或内存页是完全相同的,就将相同的内存合并为一个单一的内存页,并将其标识为“写时复制(copy-on-write)”,这样可以起到节省系统内存使用量的作 用。如果有进程试图去修改被合并且被标识为“写时复制”的内存页,就为该进程复制出一个新的内存页供其使用。
- 相同内存页合并为单一内存页,并表示为“写时复制”
- KSM开启后,CPU使用量会有一定的提高
- 不同的虚拟机的相同类型操作系统或应用,有助于实现KSM
- 使用KSM要保证有足够的交换分区
案例环境
资源列表
操作系统 | IP | 主要软件 | 主机名 |
Centos7 | 192.168.10.51 | Qemu-kvm、libvirt | kvm01 |
Centos7 | 192.168.10.52 | Qemu-kvm、libvirt、qemu-kvm-ev | kvm02 |
Centos7 | 192.168.10.57 | nfs-utils | kvmnfs |
win10 | 192.168.10.58 | VNC |
在win10安装VNC方便管理
其中,“5901”是执行 virt-install安装命令时分配给对应虚拟机的端口,可以自己定义,通常都是以5901 开始逐个递增。
静态迁移
部署KVM(在kvm01和kvm02)
#可以参考上一篇文章
创建虚拟机的存储目录
mkdir -p /data/{store,iso}
#把CentOS-7-x86_64-DVD-2207-02.iso上传至/data/iso
可以通过文本方式创建test01 虚拟机了。具体操作命令如下所示。
virt-install \
--name test01 \
--ram 1024 \
--vcpus 1 \
--disk path=/data/store/test01.qcow2,size=10 \
--network bridge=br0 \
--virt-type kvm \
--accelerate \
--autostart \
--cdrom /data/iso/CentOS-7-x86_64-DVD-2207-02.iso \
--graphics vnc,port=5901,listen=0.0.0.0
忽略报错信息
WARNING 未检测到操作系统,虚拟机性能可能会受到影响。使用 --os-variant 选项指定操作系统以获得最佳性能。
WARNING 无法连接到图形控制台:没有安装 virt-viewer。请安装 'virt-viewer' 软件包。
WARNING 没有控制台用于启动客户机,默认为 --wait -1
开始安装......
正在分配 'test01.qcow2' | 10 GB 00:00:00
ERROR unsupported format character '奠(0xffffffe7) at index 47
域安装失败,您可以运行下列命令重启您的域:
'virsh start virsh --connect qemu:///system start test01'
否则请重新开始安装。
打开VNC进行连接
提取磁盘和配置文件
#查看虚拟机 test01 当前状态
virsh list --all
#关闭虚拟机
virsh shutdown test01
#导出虚拟机的xml文件为test01.xml
virsh dumpxml test01 > test01.xml
#定位虚拟机 test01 的磁盘文件
virsh domblklist test01
#拷贝配置文件和磁盘文件到目标宿主机kvm02 上
scp test01.xml 192.168.10.52:/etc/libvirt/qemu/
scp /data/store/test01.qcow2 192.168.10.52:/data/store/
配置和启动目标虚拟机
#查看被迁移过来的配置文件和磁盘文件
ls /etc/libvirt/qemu |grep test01
ls /data/store/ |grep test01
[root@kvm01 ~]# ls /etc/libvirt/qemu |grep test01
test01.xml
[root@kvm01 ~]# ls /data/store/ |grep test01
test01.qcow2
#重新定义虚拟机
virsh define /etc/libvirt/qemu/test01.xml
#查看虚拟机状态
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- test01 关闭
#取消定义的虚拟机
virsh undefine test01 --remove-all-storage
启动虚拟机test01
virsh start test01
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
1 test01 running
基于共享存储的动态迁移
配置NFS共享存储
在所有节点安装NFS 服务
yum -y install nfs-utils
配置共享目录(在KVMnfs节点)
mkdir /data
chmod 777 /data
echo '/data 192.168.10.0/24(rw,sync,no_root_squash)' >> /etc/exports
systemctl start nfs
systemctl start rpcbind
systemctl enable nfs
systemctl enable rpcbind
启动并查看NFS服务
systemctl enable nfs
systemctl enable rpcbind
systemctl start nfs
systemctl start rpcbind
showmount -e localhost
挂载NFS目录(在kvm01和kvm02操作)
先创建本地数据目录,之后再分别挂载 NFS 目录, 并设置开机自动挂载。
#查看NFS共享目录
showmount -e 192.168.10.53
mkdir /data/kgc
mount -t nfs 192.168.10.53:/data /data/store/
mount | grep 192.168.10.53
#把磁盘文件传输到共享目录
scp /data/store/test01.qcow2 root@192.168.10.53:/data/
设置永久挂载
echo '192.168.10.53:/data /data/kgc nfs defaults 0 0' >> /etc/fstab
取消定义test01(在kvm02操作)
virsh undefine test01 --remove-all-storage
进入虚拟机中配置一个静态IP
在kvmnfs执行ping命令来检查是否会中断
[root@kvmnfs ~]# ping 192.168.10.20
PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data.
64 bytes from 192.168.10.20: icmp_seq=1 ttl=64 time=1.26 ms
64 bytes from 192.168.10.20: icmp_seq=2 ttl=64 time=0.910 ms
64 bytes from 192.168.10.20: icmp_seq=3 ttl=64 time=0.874 ms
在kvm01上执行迁移命令
virsh migrate --live --verbose test01 qemu+ssh://192.168.10.52/system tcp://192.168.10.52 --unsafe
[root@kvm01 ~]# virsh migrate --live --verbose test01 qemu+ssh://192.168.10.52/system tcp://192.168.10.52 --unsafe
root@192.168.10.52's password:
迁移: [100 %]
查询迁移之后的虚拟机状态
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- test01 关闭
- test02 关闭
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
3 test02 running
- test01 关闭
生成配置文件
virsh dumpxml test01 > /etc/libvirt/qemu/test01.xml
[root@kvm02 ~]# ll /etc/libvirt/qemu
总用量 8
-rw------- 1 root root 3524 5月 31 16:00 test01.xml
-rw------- 1 root root 3842 5月 31 17:13 test02.xml
#定义test02的配置文件
virsh define /etc/libvirt/qemu/test01.xml