KVM高级功能部署

这里写目录标题

KVM高级功能概述

KVM 虚拟机迁移

KVM 虚拟机迁移,是将某一虚拟机上的环境和软件完全复制到另一台物理机上继续运行。KVM 虚拟机迁移可以优化系统负载、重新规划 KVM 虚拟机布局并简化 KVM 虚拟机的管理维护工作

KVM 虚拟机迁移的主要应用场景如下所示

bash 复制代码
当一台 KVM 宿主机的负载比较高时,可将源KVM 宿主机上的部分虚拟机迁移到负载较低的 KVM 宿主机中,以保证服务质量

通过 KVM 虚拟机迁移将多台负载较低的KVM 宿主机上的 KVM 虚拟机集中迁移到某-台 KVM 宿主机上,从而达到节约资源的目的

在升级 KVM 宿主机硬件设备时,可以将 KVM 宿主机,上运行的 KVM 虚拟机迁移到其他KVM 宿主机上,以解决对硬件的依赖,从而实现业务不中断情况下对物理硬件设备的升级

跨地域迁移,实现 KVM 虚拟机的远程迁移

根据迁移方式的不同,可将迁移分为静态迁移(static magration)和动态迁移(livemigration)。二者的区别是:静态迁移时会有一段时间虚拟机中的服务是不可用的,而动态迁移则没有明显的服务暂停时间

静态迁移

静态迁移需要先关闭要迁移的 KVM 虚拟机,并拷贝它的磁盘文件和配置文件到目标KVM 宿主机,然后恢复启动,从而实现静态迁移。如果 KVM 虚拟机的磁盘文件存储在 KVM宿主机本地,在静态迁移时需要拷贝磁盘文件和配置文件;如果KVM 虚拟机的磁盘文件存储在共享存储上,在静态迁移时,只需要拷贝 KVM 虚拟机的配置文件,KVM 虚拟机的磁盘文件可通过挂载共享存储到本地目录的方式来获取。针对 KVM 虚拟机磁盘文件存储位置的不同,在静态迁移时需要做适当的调整

动态迁移

动态迁移是保证 KVM 虚拟机上运行的应用正常提供服务的同时,让KVM 虚拟机在不同的 KVM 宿主机之间进行迁移。动态迁移的过程仅有非常短暂的停机时间,甚至可以忽略不计,同时 KVM 虚拟机上已经打开的应用连接不会断开,依然保持不变。KVM 的动态迁移有两种方式:一种是基于共享存储的动态迁移,另一种是基于数据块的动态迁移

①:基于共享存储的动态迁移

基于共享存储的动态迁移是在 KVM 虚拟机迁移开始后,被迁移的 KVM 虚拟机依然保持在源 KVM 宿主机上运行。与此同时,KVM 虚拟机的内存页被传输到目标 KVM 宿主机之上。QEMUIKVM 会监控并记录迁移过程中所有已被传输的内存页的任何修改,并在所有内存页传输完成后再开始传输在前面传输过程中被更改的内存页内容。QEMUIKVM 也会评估迁移过程中的传输速度,当剩余的内存数据量能够在一个可设定的时间周期内完成传输,QEMU/KVM 将会关闭源宿主机上的 KVM 虚拟机,再将剩余的数据量传输到目标宿主机,最后通过传输过来的内存内容在目标宿主机上恢复 KVM 虚拟机的运行状态。如此即可完成KVM 基于共享存储的动态迁移。如果 KVM 虚拟机中内存使用量非常大且修改频繁,内存中数据被不断修改的速度大于KVM 能够传输的内存速度,该情况下无法使用动态迁移,只能使用静态迁移方法来进行 KVM 虚拟机迁移

②:基于数据块的动态迁移

如果对使用本地存储的KVM 虚拟机进行在线迁移,就要用到基于数据块的动态迁移。上述基于共享存储的动态迁移,为了实现动态迁移,源KVM 宿主机和目标宿主机需要连接共享存储服务,而基于数据块的动态迁移,共享存储不再是动态迁移的必要条件。在迁移过程中,KVM 虚拟机只使用本地存储,不再需要共享存储的支持,因此迁移环境比较简单,迁移的源宿主机和目标宿主机只需要保持以太网连接即可。因为少了共享存储,所以降低了动态迁移的难度

KSM 内核同页合并

KSM(KemelSamePage Merging)被称为内核同页合并。KSM 允许内核在两个或多个进程之间共享完全相同的内存页。KSM 让内核扫描正在运行中的程序并比较它们的内存,如果发现它们的内存区域或内存页是完全相同的,就将相同的内存合并为一个单一的内存页,并将其标识为"写时复制(copy-on-write)",这样可以起到节省系统内存使用量的作用。如果有进程试图去修改被合并且被标识为"写时复制"的内存页,就为该进程复制出一个新的内存页供其使用

在 QEMU/KVM 中,一个KVM 虚拟机就是一个 QEMU 进程,所以使用 KSM 也可以实现多个 KVM 虚拟机之间相同内存合并。如果在同一 KVM 宿主机上的多个 KVM 虚拟机运行的是相同的操作系统或应用程序,则KVM 虚拟机之间的相同内存页数量就可能比较多,这种情况下使用KSM 的效果就会更加显著。在KVM 环境下使用KSM ,只有那些相同的内存页才是可以被共享合并的,并且KSM 只会识别并合并那些不会干扰客户机运行、不会影响 KVM 宿主机或 KVM 虚拟机的安全内存页。因此,在KVM 虚拟化环境中,KSM 能够提高内存的利用率

KSM 最初是为了在KVM 虚拟化中使用而开发的,不过它对非虚拟化系统依然非常有用。KSM 可以提高KVM 宿主机中内存的使用效率,所以一般建议开启KSM 功能。由于KSM 必须有一个或多个进程去检测和找出完全相同且可以用于合并的内存页,所以KSM虽然能够让内存使用量降低,但是 KVM 宿主机中的 CPU 使用量会有一定程度的升高,因此可能会带来隐蔽的性能问题。在实际生产环境中使用KSM需要进行适当配置,以便达到较好的平衡。KSM 节省内存的效果与KVM 虚拟机操作系统及KVM虚拟机中运行的应用程序有关,如果 KVM 虚拟机上的操作系统及其上运行的应用程序相同,节省内存的效果就会很显著,甚至有可能节省超过 50%的内存。反之,如果KVM 虚拟机操作系统不同,且运行的应用程序也都大不相同,KSM 节省内存的效果就不明显,节省的内存甚至可能达不到5%

在使用 KSM 时,为了防止内存过载,最好保证系统的交换分区(swapspace)足够大。虽然KSM 可以通过内存页合并而减少内存使用量,但是KVM 虚拟机在运行过程中可能会修改 KSM 合并的内存页。修改这些内存页采用的方式是将这些内存页先复制出来,再进行修改,这样就会占用内存空间,因此可能会导致系统内存不足,这时就需要足够的交换空间来保证系统的正常运行

案例

利用 VNC 安装 kvm 虚拟机

注意:填写的IP地址(192.168.10.101)是Linux宿主机的IP地址,开放的端口号5901映射到了test01虚拟机。连接成功后,就可以开始安装虚拟机了。

先将 CentOS-7-x86_64-Minimal-1810.iso 拷贝到/opt下

用virt-install 命令安装虚拟机并设置VNC Viewer连接端口

关闭防火墙和安全机制

bash 复制代码
[root@kvm01 ~]# systemctl stop firewalld
[root@kvm01 ~]# setenforce 0

创建虚拟机存储目录

bash 复制代码
[root@kvm01 ~]# mkdir -p /data_kvm/store

安装test01虚拟机

bash 复制代码
[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-Minimal-1810.iso --vnc --vncport=5901 --vnclisten=0.0.0.0
bash 复制代码
-n:指定虚拟机的名字
-r:指定内存大小
-vcpu:指定虚拟 CPU 个数
-disk:指定磁盘文件放置位置及大小 
-w:制定所使用的网桥
打开VNC Viewer,新建一个连接,连接上后,安装虚拟机

创建虚拟机 test01的方法既可以参考之前章节使用 vrt-manager 图形界面创建虛拟机,也可以在文本格式下使用 virt-instal 命令来创建虚拟机。本章使用 virt-instal 命令在源宿主机 kvm01 上面创建虚拟机 test01。在执行 vint-install 命令之前,需要提前准备 VNC Vewel软件,其主要作用是在本地 Windows 上来连接 KVM 虚拟机,方便管理。VNC Vewer 软件如图所示

单击上图菜单栏的"File",选择"New connection",新建到虚拟机的连接。"VNC Server和"Name"填写宿主机的 |P 地址,如下图所示。其中,"5901"是执行 virt-instal 安装命令时分配给对应虚拟机的端口,可以自己定义,通常都是以5901开始逐个递增

点击"OK"确认之后,会生成对应的连接




安装后查看并启动
bash 复制代码
[root@kvm01 ~]# virsh list --all
[root@kvm01 ~]# virsh start test01

静态迁移

查看虚拟机 test01 当前状态
bash 复制代码
[root@kvm01 ~]# virsh list --all
关闭虚拟机 test01
bash 复制代码
[root@kvm01 ~]# virsh shutdown test01
[root@kvm01 ~]# virsh list --all
 Id   名称     状态
---------------------
 -    test01   关闭
导出虚拟机 test01 的 xml 配置文件
bash 复制代码
[root@kvm01 ~]# virsh dumpxml test01 > test01.xml 
定位虚拟机 test01 的磁盘文件
bash 复制代码
[root@kvm01 ~]# virsh domblklist test01
拷贝配置文件和磁盘文件到目标宿主机 kvm02 上

现在kvm02上创建目录

bash 复制代码
[root@kvm02 ~]# mkdir -p /data_kvm/store

到kvm01上拷贝文件到kvm02上

bash 复制代码
[root@kvm01 ~]# scp test01.xml 192.168.10.102:/etc/libvirt/qemu/
[root@kvm01 ~]# scp /data_kvm/store/test01.qcow2 192.168.10.102:/data_kvm/store/
查看被迁移的配置文件和磁盘文件
bash 复制代码
[root@kvm02 ~]# ls -l /etc/libvirt/qemu
[root@kvm02 ~]# ls -l /data_kvm/store/
重新定义虚拟机 test02
bash 复制代码
[root@kvm02 ~]# virsh define /etc/libvirt/qemu/test01.xml
启动虚拟机
bash 复制代码
[root@kvm02 ~]# virsh start test01

基于共享存储的动态迁移

打开一个新的服务器kvmnfs ,在 kvmnfs 服务器上面安装 NFS 服务
bash 复制代码
[root@localhost ~]# hostnamectl set-hostname kvmnfs
[root@localhost ~]# bash
[root@kvmnfs ~]# systemctl stop firewalld
[root@kvmnfs ~]# setenforce 0
[root@kvmnfs ~]# dnf -y install nfs-utils
配置共享目录
bash 复制代码
[root@kvmnfs ~]# mkdir /data
[root@kvmnfs ~]# chmod -R 777 /data/
[root@kvmnfs ~]# ls -ld /data/
drwxrwxrwx. 2 root root 4096  5月22日 13:47 /data/
[root@kvmnfs ~]# vim /etc/exports
/data 192.168.10.0/24(rw,sync,no_root_squash)
启动并查看 NFS 服务[root@kvmnfs ~]# systemctl start rpcbind
bash 复制代码
[root@kvmnfs ~]# systemctl enable rpcbind
[root@kvmnfs ~]# systemctl start nfs
[root@kvmnfs ~]# systemctl enable nfs
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
在kvm01和kvm02主机查看NFS共享目录
bash 复制代码
[root@kvm01 ~]# showmount -e 192.168.10.103
Export list for 192.168.10.103:
/data 192.168.10.0/24
[root@kvm02 ~]# showmount -e 192.168.10.103
Export list for 192.168.10.103:
/data 192.168.10.0/24
在kvm01和kvm02上创建kgc
bash 复制代码
[root@kvm01 ~]# mkdir /data_kvm/kgc
[root@kvm02 ~]# mkdir /data_kvm/kgc
在 kvm01 和kvm02上都挂载共享目录
bash 复制代码
[root@kvm01 ~]# mount -t nfs 192.168.10.103:/data /data_kvm/kgc/
[root@kvm02 ~]# mount -t nfs 192.168.10.103:/data /data_kvm/kgc
通过现有的磁盘文件生成虚拟机

拷贝qcow2磁盘文件

bash 复制代码
[root@kvm01 ~]# cp /opt/CentOS-7-x86_64-GenericCloud-2009.qcow2 /data_kvm/kgc/test02.qcow2

部署虚拟机

备注:

该工具提供了virt的高级命令,其中有一个virt-customize命令,可以为系统镜像设置密码

bash 复制代码
[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 --osinfo detect=on,require=off

查看虚拟机

bash 复制代码
[root@kvm01 ~]# virsh list --all
 Id   名称     状态
---------------------
 2    test02   运行
 -    test01   运行

在kvm01主机的test01迁移到kvm02主机

bash 复制代码
[root@kvm01 ~]# virsh migrate --live --verbose test02 qemu+ssh://192.168.10.102/system tcp://192.168.10.102

查看迁移后虚拟机的状态

迁移之后源宿主机 kvm01 上虚拟机 test02 被关闭,目标宿主机 kvm02 上虚拟机 test02处于启动状态

生成配置文件

bash 复制代码
--disk:指定存储设备及其属性
--device:设备类型,如cdrom、disk或floppy等,默认为disk
--bus:磁盘总线类型,其值可以为ide、scsi、usb、virtio或xen
--virt-type:使用的hypervisor(虚拟机监视器),如kvm、qemu、xen等
--boot cdrom,hd,network:指定引导次序
相关推荐
再见晴天*_*21 分钟前
logback 日志不打印
java·服务器·logback
myskybeyond1 小时前
时序数据库TDEngine安装和使用
服务器·时序数据库·tdengine
chanalbert1 小时前
CentOS系统新手指导手册
linux·运维·centos
星宸追风2 小时前
Ubuntu更换Home目录所在硬盘的过程
linux·运维·ubuntu
热爱生活的猴子2 小时前
Poetry 在 Linux 和 Windows 系统中的安装步骤
linux·运维·windows
myloveasuka2 小时前
[Linux]内核如何对信号进行捕捉
linux·运维·服务器
渲吧-云渲染2 小时前
云渲染时,电脑能关机吗?关键阶段操作指南
运维·服务器·电脑
BD_Marathon2 小时前
Ubuntu下的Tomcat服务器部署
服务器·ubuntu·tomcat
m0_694845572 小时前
服务器需要备案吗?在哪些地区需要备案?
linux·运维·服务器·云计算
myloveasuka3 小时前
[Linux]内核态与用户态详解
linux