一.KVM原理简介
广义的KVM实际上包含两部分,一部分是基于Linux内核支持的KVM内核模块,另一部分就是经过简化和修改的Qemuo
KVM内核模块是模拟处理器和内存以支持虚拟机的运行,Qemu主要处理丨℃以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合、相辅相成,构成了一个完整的虚拟化平台。
需要注意的是,Qemu本身并不是KVM的一部分,Qemu是一套完整的虚拟化解决方案,是纯软件实现虚拟化,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟出来的,所以Qemu的性能比较低。
二.KVM运行时的三种模式
客户模式:执行非I/O的客户代码,虚拟机运行在这个模式下
用户模式:用户执行I/O代码,QEMU运行在这个模式下
内核模式:CPU调度和内存管理相关
客户模式(Guest Mode):可以理解为虚拟机在操作系统中运行的模式。客户模式又分为内核模式和用户模式。内核模式模拟CPU以及内存,实现客户模式的切换,处理从客户模式的退出。KVM内核模块运行在这个模式下,模拟CPU以及内存,实现客户模式的切换,处理从客户模式的退出。
用户模式(User Mode):在这种模式下,运行QEMU,实现IO模拟与虚拟机管理。QEMU运行在这个模式下,为用户提供虚拟机管理的用户空间工具以及代表用户执行I/O操作。
内核模式(Kernel Mode):这是KVM虚拟化的核心模式,运行KVM内核模块。在这个模式下,KVM为虚拟机创建虚拟CPU和虚拟内存,然后执行VMLAUNCH指令进入客户模式,装载Guest OS并运行。如果Guest OS运行过程中发生异常,KVM会暂停Guest OS的运行,保存当前状态,并退出到内核模式来处理这些异常。内核模式还负责处理需要I/O的情况,处理完成后重新进入客户模式。
三.KVM工作原理
KVM(Kernel-based Virtual Machine)是基于Linux内核的虚拟机技术,其工作原理核心是利用硬件虚拟化扩展(如Intel VT-x/AMD-V)将物理CPU、内存和I/O设备虚拟化为多个虚拟机资源,具体如下:
核心组件
• KVM模块:作为Linux内核模块,负责创建和管理虚拟机(VM),并通过硬件虚拟化功能实现CPU和内存的虚拟化。
• QEMU:模拟I/O设备(如网卡、硬盘),与KVM结合后,通过KVM模块接管CPU和内存,自身专注于I/O模拟,提升性能。
工作流程
1. 初始化:KVM模块加载后,通过/dev/kvm接口为每个虚拟机创建虚拟CPU(vCPU),每个vCPU对应一个Linux进程。
2. CPU虚拟化:利用硬件虚拟化技术(如Intel VT-x的VMX模式),将vCPU调度到物理CPU上运行,实现指令集的隔离和特权级转换。
3. 内存虚拟化:通过KVM的内存管理组件(如影子页表或EPT/NPT技术),将虚拟机的虚拟地址映射到物理地址,确保各VM内存独立。
4. I/O虚拟化:QEMU通过软件模拟或硬件直通(如PCIe设备直通),让VM访问外设,硬件直通可提升I/O性能。
5. 资源调度:Linux内核的调度器负责分配物理CPU时间片给各个vCPU,内存和I/O资源也由KVM和QEMU协同管理。
关键技术
• 硬件辅助虚拟化:依赖CPU提供的虚拟化指令,避免纯软件模拟的性能损耗。
• 半虚拟化驱动(virtio):VM通过virtio接口与宿主机通信,优化网络、磁盘等I/O性能。
• 实时迁移:利用KVM的状态保存和恢复机制,可在物理主机间迁移运行中的VM,不中断服务。
KVM通过与Linux内核深度整合,实现了高效的服务器虚拟化,广泛应用于云计算和企业服务器集群。
- Qemu:快速仿真器
- Libkvm: libkvm 通过 ioctl 系统调用进入内核模式
- Ioctl:ioctl是设备驱动程序中对设备的I/O通道进行管理的函数
- fd:用fd 通过ioctl 向设备驱动来发送创建,运行虚拟机命令,设备驱动/dev/kvm 就会来解析命令
- /dev/kvm:Linux字符集设备 /dev/kvm,是kvm的内核模块
QEMU(Quick EMUlator)是一个开源的通用模拟器和虚拟化软件,由Fabrice Bellard创建。 它允许在一个平台上运行一个或多个操作系统,这些操作系统与宿主机(运行QEMU的机器)的原生操作系统完全隔离。QEMU具有以下主要功能:
- 系统模拟:可以模拟多种不同的计算机类型和架构,如x86, x86-64 (AMD64/Intel 64), ARM, PowerPC, SPARC等。这意味着可以在一个架构上运行为另一架构编译的操作系统和程序。
- 用户模式模拟:支持用户模式模拟,允许单个程序以不同的操作系统用户空间在主机上运行,这对于开发和测试跨平台应用程序非常有用。
- 虚拟化:当在支持硬件虚拟化的处理器上运行时,QEMU可以利用KVM(Kernel-based Virtual Machine)模块提供快速虚拟化,使虚拟机以接近物理硬件的速度运行,同时提供隔离和资源控制的优点。
- 网络和设备模拟:支持复杂的网络模拟功能,允许虚拟机通过不同的网络拓扑配置相互通信或访问互联网。同时能够模拟各种硬件设备,如硬盘、网络接口卡、图形适配器、USB设备等。
QEMU可以独立使用,也经常与其他虚拟化和模拟工具一起使用,如VirtualBox或VMware的用户界面,或者与libvirt这样的虚拟化管理库配合使用,以简化虚拟机的管理和操作。这使得QEMU在软件开发、测试、系统管理、教育和研究等领域有广泛应用
四.实验步骤
实验环境
主机 | . 操作系统 | IP地址 | 主要软件 |
kvm01 | CentOS 7.9 x86_64 | 192.168.10.108 | KVM 虚拟机 |
kvm02 | CentOS 7.9 x86_64 | 192.168.10.109 |
1.搭建KVM虚拟化平台
1.2准备KVM虚拟化环境
(1)YUM 安装 KVM
yum -y install qemu-kvm
yum -y install qemu-img
yum -y install bridge-utils
yum -y install qemu-kvm-tools
yum -y install virt-install
yum -y install libvirt
yum -y install virt-manager
yum -y install libguestfs-tools
备注:
qemu-kvm : kvm核心包–虚拟操作系统模拟器加速模块
qemu-img :是QEMU的磁盘管理工具
bridge-utils:虚拟机与外界通信的命令管理工具
qemu-kvm-tools :qemu-kvm的工具包
virt-install:虚拟机安装工具
libvirt:必须要装的核心工具
virt-manager:虚拟机图形管理工具(宿主机有桌面环境时可以考虑安装,命令操作或者远程控制则不需要)
libguestfs-tools:用于访问虚拟机的磁盘映像文件提供的一组命令
QEMU是“Quick Emulator”的缩写,是一个用C语言编写的开源虚拟化软件。
QEMU(Quick Emulator)快速仿真器
(2)关机,设置CPU支持虚拟化,然后开机
(3)开机后验证
hostnamectl set-hostname kvm01
bash
vim /etc/hosts
192.168.10.201 kvm01
192.168.10.202 kvm02
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
cat /proc/cpuinfo | grep vmx
lsmod | grep kvm
(4)开启libvirtd服务
安装完成后还需要开启 libvirtd 服务,以开启相关支持。
systemctl start libvirtd
systemctl enable libvirtd
2.设置KVM网络
这里以 Bridge(桥接)为例进行操作演示
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-br0
vi ifcfg-ens160
BRIDGE=br0
vi ifcfg-br0
TYPE=bridge
NAME=br0
DEVICE=br0
systemctl restart network
ifconfig
3.KVM管理
virt-manager
(1)创建存储池
存储池的名称为:kgc
存储池的目录为:/data_kvm/store
(2)创建存储卷
在kgc的存储池中添加存储卷
存储卷名称为:test01
卷最大容量10G
(3)将Linux系统的ISO文件拷贝到/opt目录下,并关闭存储设置
(4)在kvm01的主机上新建虚拟机,名称为test01
5.使用KVM命令集管理虚拟机
virsh -h //查看命令帮助
ls /etc/libvirt/qemu/ //查看KVM的配置文件存放目录
virsh list --all //查看虚拟机状态
virsh shutdown test01 //虚拟机关机
virsh start test01 //虚拟机开机
virsh destroy test01 //强制实例系统关闭电源
virsh create /etc/libvirt/qemu/test01.xml //通过配置文件启动虚拟机系统实例
virsh suspend test01 //挂起虚拟机
virsh resume test01 //恢复虚拟机
virsh autostart test01 //配置虚拟机实例伴随宿主机自动启动
virsh dumpxml test01 > /etc/libvirt/qemu/test02.xml //导出虚拟机配置
virsh shutdown test01
virsh undefine test01 //虚拟机的删除与添加
查看删除结果,test01 的配置文件被删除,但是磁盘文件不会被删除。
ls /etc/libvirt/qemu/
通过 virsh list --all 查看不到 test01 的信息,说明此虚拟机被删除
通过备份的配置文件重新定义虚拟机:
cd /etc/libvirt/qemu
mv test02.xml test01.xml
重新定义虚拟机:
virsh define test01.xml
修改虚拟机配置信息
vim命令:vim /etc/libvirt/qemu/test01.xml
virsh命令: virsh edit test01
6.KVM文件管理
(1)查看当前磁盘格式
qemu-img info /data_kvm/store/test01.qcow2
备注:
如果虚拟机磁盘文件不是 qcow2 格式,可以通过 qemu-img 命令转换磁盘文件格式,
如执行以下操作可以将 test01 虚拟机 raw 格式磁盘转换至 qcow2 格式。
[root@kvm01 ~]# virsh shutdown test01
[root@kvm01 ~]# qemu-img convert -f raw -O qcow2 /data_kvm/store/test01.img /data_kvm/store/test01.qcow2
执行转换磁盘格式的命令后还需要修改 test01 的 xml 配置文件中磁盘的类型与磁盘文件名。
[root@kvm01 ~]# virsh edit test01
…… //省略部分内容
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none'/>
<source file='/data_KVM/store/test01.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
(2)virt-cat 命令,类似于 cat 命令
使用这个命令需要安装 libguestfs-tools-c 工具包。
virt-cat -a /data_kvm/store/test01.qcow2 /etc/sysconfig/grub
(3)virt-edit 命令
virt-edit 命令,用于编辑文件,用法与 vim 基本一致。
virt-edit -a /data_kvm/store/test01.qcow2 /etc/resolv.conf
(4)virt-df 命令
virt-df 命令用于查看虚拟机磁盘信息。
virt-df -h test01
7.虚拟机克隆
(1)查看虚拟机状态
virsh list --all
(2)从 test01 克隆 test02
virt-clone -o test01 -n test02 -f /data_kvm/store/test02.qcow2
(3)查看虚拟机状态
virsh list --all
(4)启动虚拟机
virsh start test02
8.虚拟机快照
KVM 虚拟机要使用镜像功能,磁盘格式必须为 qcow2。
(1)对 test01 创建快照
virsh snapshot-create test01
已生成域快照 1503494464
(2)查看虚拟机快照版本信息
virsh snapshot-current test01
(3)查看快照信息
virsh snapshot-list test01
(4)创建新快照
virsh snapshot-create test01
(5)查看快照信息
virsh snapshot-list test01
(6)恢复虚拟机状态
virsh snapshot-revert test01 1503494464
(7)查看虚拟机快照版本信息
virsh snapshot-current test01
(8)删除快照
virsh snapshot-delete test01 1503494464