目录
1.1案例分析
1.1.1案例概述
1.1.2案例前置知识点
1.kvm虚拟机迁移
2.ksm内核同页合并
1.1.3案例环境
1.本案路环境
2.案例需求
3.案例实现思路
2.2案例实施
2.2.1静态迁移
1.在源宿主机上准备虚拟机
2.提取磁盘和配置文件
3.配置和启动目标虚拟机
2.2.2基于共享存储的动态迁移
1.配置nfs共享存储
2.挂载nfs目录
3.创建动态迁移的虚拟机
4.动态迁移
5.生成配置文件
6.验证迁移结果
2.2.3基于数据块的动态迁移
1.依赖包安装
2.迁移钱准备工作
3.检查资源池
4.创建同名磁盘文件
5.执行迁移操作
6.验证迁移结果
2.2.4 KSM
1.KSM服务介绍
2.配置ksm优化内存
本案例旨在通过实际操作,全面展示 KVM 高级功能在企业虚拟化环境中的部署与应用。通过实现虚拟机的静态迁移、基于共享存储和数据块的动态迁移,以及配置 KSM 内核同页合并功能,帮助企业提升虚拟化资源管理效率,降低硬件成本,保障业务的高可用性和连续性。
KVM 虚拟机迁移是指将运行中的虚拟机从一台物理服务器迁移到另一台物理服务器的过程,主要分为静态迁移和动态迁移。静态迁移通常在虚拟机停机状态下进行,适用于对业务连续性要求不高的场景;动态迁移则可以在虚拟机运行过程中完成迁移,极大地保障了业务的连续性。动态迁移又可细分为基于共享存储的动态迁移和基于数据块的动态迁移,前者依赖于共享存储设备,后者则通过数据块传输实现迁移。
KSM(Kernel Samepage Merging)是 Linux 内核中的一项内存优化技术。它通过扫描系统中多个虚拟机的内存页面,识别并合并相同的内存页面,从而减少内存占用,提高内存资源的利用率。在多虚拟机环境中,许多虚拟机可能会加载相同的操作系统内核和应用程序代码,KSM 能够有效消除这些重复的内存页面,降低整体内存消耗。
本案例采用两台物理服务器作为 KVM 宿主机,分别命名为host1和host2,操作系统为 CentOS 8。此外,还需要一台 NFS 服务器用于提供共享存储,IP 地址为192.168.1.100。各服务器的具体配置如下:
服务器名称 |
IP 地址 |
角色 |
host1 |
192.168.1.101 |
KVM 宿主机(源宿主机) |
host2 |
192.168.1.102 |
KVM 宿主机(目标宿主机) |
nfs-server |
192.168.1.100 |
NFS 共享存储服务器 |
在host1上创建一个名为vm1的虚拟机,安装 CentOS 8 操作系统,并安装一些常用的应用程序,模拟实际业务环境。使用virt-manager图形界面或virt-install命令行工具均可创建虚拟机。以下是使用virt-install命令创建虚拟机的示例:
virt-install \
--name vm1 \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/vm1.qcow2,size=20 \
--os-type linux \
--os-variant rhel8 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://mirror.centos.org/centos/8/BaseOS/x86_64/os/' \
--extra-args 'console=ttyS0,115200n8 serial'
该命令创建了一个内存为 2GB、2 个 CPU 核心、磁盘大小为 20GB 的虚拟机,通过网络桥接连接到外部网络,并从 CentOS 8 的镜像源安装操作系统。
虚拟机创建完成并正常运行后,需要提取其磁盘文件和配置文件。磁盘文件通常位于/var/lib/libvirt/images/目录下,配置文件则位于/etc/libvirt/qemu/目录下。使用以下命令复制磁盘和配置文件到一个临时目录:
mkdir /tmp/vm1_backup
cp /var/lib/libvirt/images/vm1.qcow2 /tmp/vm1_backup/
cp /etc/libvirt/qemu/vm1.xml /tmp/vm1_backup/
将复制的磁盘和配置文件传输到host2上,可以使用scp命令:
scp -r /tmp/vm1_backup/* [email protected]:/tmp/
在host2上,使用以下命令定义虚拟机:
virsh define /tmp/vm1_backup/vm1.xml
然后启动虚拟机:
virsh start vm1
通过virsh list --all命令查看虚拟机状态,确认虚拟机在host2上成功启动,完成静态迁移。
在nfs-server上安装 NFS 服务:
yum install nfs-utils -y
创建一个共享目录,例如/var/nfs/share,并设置合适的权限:
mkdir -p /var/nfs/share
chmod -R 777 /var/nfs/share
编辑/etc/exports文件,添加共享配置:
/var/nfs/share 192.168.1.0/24(rw,sync,no_root_squash)
该配置允许192.168.1.0/24网段的主机以读写权限访问共享目录,且不限制 root 用户的权限。
重启 NFS 服务使配置生效:
systemctl start nfs-server
systemctl enable nfs-server
在host1和host2上安装 NFS 客户端:
yum install nfs-utils -y
创建挂载目录,例如/mnt/nfs_share:
mkdir -p /mnt/nfs_share
挂载 NFS 共享目录:
mount -t nfs 192.168.1.100:/var/nfs/share /mnt/nfs_share
将挂载命令添加到/etc/fstab文件中,实现开机自动挂载:
192.168.1.100:/var/nfs/share /mnt/nfs_share nfs defaults 0 0
在host1上创建一个新的虚拟机vm2,并将其磁盘文件存储在 NFS 共享目录中。使用virt-install命令创建虚拟机时,指定磁盘路径为 NFS 共享目录:
virt-install \
--name vm2 \
--ram 2048 \
--vcpus 2 \
--disk path=/mnt/nfs_share/vm2.qcow2,size=20 \
--os-type linux \
--os-variant rhel8 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://mirror.centos.org/centos/8/BaseOS/x86_64/os/' \
--extra-args 'console=ttyS0,115200n8 serial'
在host1上执行动态迁移命令,将vm2迁移到host2:
virsh migrate --live --verbose --persistent --undefinesource vm2 qemu+ssh://192.168.1.102/system
该命令表示进行实时(--live)动态迁移,迁移过程中显示详细信息(--verbose),迁移后在目标宿主机上保持虚拟机定义(--persistent),并在源宿主机上删除虚拟机定义(--undefinesource),通过 SSH 协议连接到目标宿主机192.168.1.102。
迁移完成后,在host2上使用virsh dumpxml vm2 > /etc/libvirt/qemu/vm2.xml命令生成虚拟机配置文件。
在host2上使用virsh list --all命令查看虚拟机状态,确认vm2已成功迁移并正在运行。同时,可以登录虚拟机,检查应用程序是否正常运行,验证业务的连续性。
在host1和host2上安装libguestfs-tools和libvirt-daemon-driver-nwfilter包,这些包是基于数据块动态迁移的依赖:
yum install libguestfs-tools libvirt-daemon-driver-nwfilter -y
在host1上,确保虚拟机vm3已正常运行。使用virsh shutdown vm3命令关闭虚拟机,然后使用qemu-img create -f qcow2 -b /var/lib/libvirt/images/vm3.qcow2 /var/lib/libvirt/images/vm3_migrate.qcow2命令创建一个基于原磁盘的差异磁盘文件,用于存储迁移过程中的数据变化。
在host1和host2上,使用virsh pool-list命令查看资源池状态,确保资源池正常可用。如果资源池不存在,需要先创建资源池。
在host2上创建与host1上虚拟机vm3同名的磁盘文件,路径和格式需与原磁盘一致:
qemu-img create -f qcow2 /var/lib/libvirt/images/vm3.qcow2 20G
在host1上执行基于数据块的动态迁移命令:
virsh migrate --live --verbose --persistent --undefinesource --copy-storage-all vm3 qemu+ssh://192.168.1.102/system
--copy-storage-all参数表示将磁盘数据全部复制到目标宿主机。
在host2上使用virsh list --all命令查看虚拟机状态,确认vm3已成功迁移并正在运行。检查虚拟机的磁盘空间、应用程序运行情况等,验证迁移是否成功。
KSM是在Linux2.6内核版本中被添加进去的,目前大多数?常用的、主流的Linux发行版都默认支持KSM技术,执行以下命令即可检查当前Linux系统是否支持KSM
[root@kvm02 ~]# egrep -i ksm /boot/config-3.10.0-514.el7.x86_64
CONFIG_KSM=y //结果为y则表示支持
KSM服务在CentOS7内是以ksmd作为守护进程的,针对该服务的一些配置文件,都在目录"/sys/kernel/mm/ksm"下。
[root@kvm02 ~]# ls -I /sys/kernel/mm/ksm/.
KSM的常用配置的作用分别如下所示。
> max_page_sharing:设置每个KSM页面允许的最大共享数量。这个配置设置了重复数据删除限制,以避免虚拟内存rmap列表变得太大。max_page_sharing最小值为2因为新创建的KSM页面至少有两个共享器。
> merge_across_nodes:指定是否可以合并来自不同numa节点的页面。当设置为0时,ksm只合并物理页面并驻留在同一numa节点的内存区域中,可以降低访问共享页面的延迟。
> pages_to_scan:在KSM进程休眠之前会去扫描的内存数量。
> run:控制ksmd进程是否运行,默认值为0。要激活ksm必须设置其值为1。如果
设置为0,表示停止运行ksmd,但会保留已经合并的内存页:如果设置为1,表示马上运行ksmd进程:设置为2表示停止运行ksmd,并分离已经合并的所有内存页但是保留已经注册为合并的内存区域给下一次使用。
> sleep_millisecs:设置ksmd进程休眠的时间(单位:毫秒),即为kxsmd进程两次运行之间的间隔。
> stable_node_chains_prune_millisecs:在stable_node"链"中链接的整个stable_node"dups"列表被周期性地扫描,以删除除旧的stable_nodes。该参数的值用于调节重复扫描的时间(单位:毫秒)。
(1)克隆虚拟机
在目标宿主机kvm02上,有test01和test02两台虚拟机。现在通过克隆的方式再创建两台新的虚拟机。然后开启这四台虚拟机,等四台虚拟机都启动后,观察内存使用情况。等内存使用量不再变化后,启动KSM服务,过5分钟,观察内存使用量的变化情况。克隆虚拟机
[root@kvm02 ~]# virt-clone -o test02-n test03 -f/data/store/tesst03.qcow2
(2)记录开启ksm之前内存使用情况
[root@kvm02 ~]# free -m //确保虚拟机都启动好后,内存不再变化
(3)启动ksm服务
在CentOS7系统中,通过ksm和ksmtuned两个服务来动态调节KSM的运行情况,要想保证两个服务的存在,需要qemu-kvm-common这个RPM包的支持。执行以下命令启动ksm和ksmtuned这两个服务。
[root@kvm02 ~]# systemctl start ksm
[root@kvm02 ~]# systemctl start ksmtuned
当ksm服务启动后,需要检查/sys/kernel/mm/ksm/run文件的值是否为1,若为0则KSM功能不会生效,需要将其置为1。
[root@kvm02 ~]# echo 1 >/sys/kernel/mm/ksm/run
在KSM服务启动之后,KSM能够最多共享系统物理内存一半的内存页。而ksmtuned服务一直保持循环执行,以调用ksm服务来运行。
(4)对比ksm开启之后的内存使用情况
[root@kvm02 ~]# free -m
对比KSM开启前后内存的使用情况,"used"从开始的22213M降到了1491M,说明节约了系统内存。
至此,KVM虚拟机的各种迁移及KSM内存优化已经介绍完成