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的情况,处理完成后重新进入客户模式。
- 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在软件开发、测试、系统管理、教育和研究等领域有广泛应用
1.1.3 案例环境
1. 本案例实验环境
|-------|-------------------|----------------|---------|
| 主机 | . 操作系统 | IP 地址 | 主要软件 |
| kvm01 | CentOS 7.9 x86_64 | 192.168.10.108 | KVM 虚拟机 |
| kvm02 | CentOS 7.9 x86_64 | 192.168.10.109 | KVM 虚拟机 |
2. 案例需求
(1)安装 KVM。
(2)完成基本的 KVM 操作管理(创建、启动、停止等)。
(3)完成 KVM 命令行操作虚拟机。
3. 案例实现思路
(1)准备 KVM 装环境。
(2)安装 KVM。
(3)配置 KVM 桥接网络。
(4)创建 KVM 存储池并安装虚拟机。
(5)命令行操作虚拟机。
1.2 搭建 KVM 虚拟化平台
1.2.1 准备 kvm 虚拟化环境
1 .安装
(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)开机后验证
root@localhost \~\]# hostnamectl set-hostname kvm01
\[root@localhost \~\]# bash
\[root@kvm01 \~\]# vim /etc/hosts
192.168.10.201 kvm01
192.168.10.202 kvm02
\[root@kvm01 \~\]# systemctl stop firewalld
\[root@kvm01 \~\]# systemctl disable firewalld
\[root@kvm01 \~\]# setenforce 0
\[root@kvm01 \~\]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
\[root@kvm01 \~\]# ****cat /proc/cpuinfo \| grep vmx****
\[root@kvm01 \~\]# ****lsmod \| grep kvm****
##### (4)开启 libvirtd 服务
安装完成后还需要开启 libvirtd 服务,以开启相关支持。
\[root@kvm01 \~\]# ****systemctl start libvirtd****
\[root@kvm01 \~\]# ****systemctl enable libvirtd****
#### ****2**** ****.设置**** ****KVM**** ****网络****
这里以 Bridge(桥接)为例进行操作演示
****\[root@kvm01 \~\]# cd /etc/sysconfig/network-scripts/****
****\[root@kvm01 network-scripts\]# cp ifcfg-ens33 ifcfg-br0****
\[root@kvm01 \~\]# ****vim ifcfg-ens33****
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.10.108
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
DNS1=223.6.6.6
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
\[root@kvm01 \~\]# ****vim ifcfg-br0****
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.10.108
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
DNS1=223.6.6.6
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
DEVICE=br0
ONBOOT=yes
\[root@kvm01 \~\]# systemctl restart network
\[root@kvm01 \~\]# ****ifconfig****
****将分辨率修改为1024\*768****
****备注:****
****在此处做个快照,为后面章节做好实验环境****
****在另一台kvm主机上重复以上操作,最后也做个快照****
#### ****3**** ****.**** ****KVM**** ****管理****
\[root@kvm01 \~\]# ****virt-manager****
##### (1)创建存储池
存储池的名称为:kgc
存储池的目录为:/data_kvm/store
##### (2)创建存储卷
在kgc的存储池中添加存储卷
存储卷名称为:test01
卷最大容量10G
##### (3)将Linux系统的ISO文件拷贝到/opt目录下,并关闭存储设置
##### (4)在kvm01的主机上新建虚拟机,名称为test01
## ****1.2.2**** ****使用**** ****KVM**** ****命令集管理虚拟机****
### 1:****KVM**** ****基本功能管理****
#### (1)查看命令帮助
\[root@kvm01 \~\]# ****virsh -h****
#### (2)查看 KVM 的配置文件存放目录
\[root@kvm01 \~\]# ****ls /etc/libvirt/qemu/****
#### (3)查看虚拟机状态
\[root@kvm01 \~\]# ****virsh list --all****
#### (4)虚拟机关机与开机
\[root@kvm01 \~\]# ****virsh shutdown test01****
\[root@kvm01 \~\]# ****virsh start test01****
#### (5)强制实例系统关闭电源
\[root@kvm01 \~\]# ****virsh destroy test01****
#### (6)通过配置文件启动虚拟机系统实例
\[root@kvm01 \~\]# ****virsh create /etc/libvirt/qemu/test01.xml****
\[root@kvm01 \~\]# ****virsh list --all****
#### (7)挂起虚拟机
\[root@kvm01 \~\]# ****virsh suspend test01****
\[root@kvm01 \~\]# ****virsh list --all****
#### (8)恢复虚拟机
\[root@kvm01 \~\]# ****virsh resume test01****
\[root@kvm01 \~\]# ****virsh list --all****
#### (9)配置虚拟机实例伴随宿主机自动启动
\[root@kvm01 \~\]# ****virsh autostart test01****
#### (10)导出虚拟机配置
\[root@kvm01 \~\]# ****virsh dumpxml test01 \> /etc/libvirt/qemu/test02.xml****
#### (11)虚拟机的删除与添加
删除虚拟机。
\[root@kvm01 \~\]# ****virsh shutdown test01****
\[root@kvm01 \~\]# ****virsh undefine test01****
查看删除结果,test01 的配置文件被删除,但是磁盘文件不会被删除。
\[root@kvm01 \~\]# ****ls /etc/libvirt/qemu/****
通过 virsh list --all 查看不到 test01 的信息,说明此虚拟机被删除。
\[root@kvm01 \~\]# ****virsh list --all****
通过备份的配置文件重新定义虚拟机。
\[root@kvm01 \~\]# ****cd /etc/libvirt/qemu****
\[root@bdqn qemu\]# ****mv test02.xml test01.xml****
重新定义虚拟机。
\[root@bdqn qemu\]# ****virsh define test01.xml****
查看虚拟机信息。
\[root@bdqn qemu\]# ****virsh list --all****
#### (12)修改虚拟机配置信息(用来修改系统内存大小、磁盘文件等信息)
直接通过 vim 命令修改。
\[root@kvm01 \~\]# ****vim /etc/libvirt/qemu/test01.xml****
通过 virsh 命令修改。
\[root@kvm01 \~\]# ****virsh edit test01****
### ****3. KVM**** ****文件管理****
#### (1)查看当前磁盘格式
\[root@kvm01 \~\]# ****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****
...... //省略部分内容
\