目录
一、KVM 虚拟化
1. KVM 概述
KVM(Kernel-based Virtual Machine) 是基于 Linux 内核的开源虚拟化技术,通过将 Linux 内核转变为虚拟机监控器(Hypervisor),允许多个隔离的虚拟机(VM)直接访问物理硬件资源。
核心特点:
集成于内核:作为内核模块(
kvm.ko
)实现,无需额外安装 Hypervisor。硬件辅助虚拟化:依赖 CPU 的虚拟化扩展(Intel VT-x / AMD-V)。
开源生态:与 QEMU 结合提供完整的虚拟化解决方案(设备模拟、I/O 处理等)。
高性能:接近原生性能,适用于生产环境(如云计算平台 OpenStack)。
2. KVM 原理简介
KVM 的本质是 Linux 内核的一个模块
核心原理如下:
内核角色转换:
加载 KVM 模块后,Linux 内核直接作为 Hypervisor 运行。
硬件虚拟化支持:
通过 CPU 的 VT-x/AMD-V 技术,在硬件层面创建 VMX 模式(虚拟机扩展模式),实现指令截获和特权级隔离。
用户空间组件:
QEMU 负责模拟虚拟设备(网卡、磁盘等),并管理虚拟机的生命周期(启动、暂停等)。
工作流程:
用户通过工具(如
libvirt
)创建虚拟机 → QEMU 调用 KVM 内核模块 → KVM 利用 CPU 虚拟化扩展创建 vCPU,并调度物理 CPU 资源。
3. KVM 运行时的三种模式
- 客户模式:是虚拟机在操作系统中的运行模式,分为内核模式和用户模式,主要由 KVM 内核模块模拟 CPU 和内存,实现模式切换及退出处理。
- 用户模式:运行 QEMU,用于 IO 模拟与虚拟机管理,为用户提供管理工具并执行 I/O 操作。
- 内核模式:是 KVM 虚拟化核心,运行 KVM 内核模块,负责创建虚拟 CPU 和内存,通过 VMLAUNCH 指令进入客户模式运行 Guest OS,还会处理 Guest OS 运行中的异常及 I/O 需求。
模式 | 执行者 | 权限与职责 |
---|---|---|
内核模式 | KVM 内核模块 | 处理 vCPU 的敏感指令(如 I/O 操作),通过硬件虚拟化截获并交由 Hypervisor 处理。 |
用户模式 | QEMU 进程 | 模拟虚拟硬件设备(磁盘、网卡),处理非特权操作(如虚拟机启动/配置)。 |
客户模式 | 虚拟机操作系统 | 运行未经修改的 Guest OS,执行普通指令;敏感指令被硬件截获并陷入内核模式。 |
4. KVM工作流程
-
启动虚拟机:
-
用户通过
virt-manager
或virsh
启动虚拟机 →libvirt
调用 QEMU 进程。
-
-
创建虚拟化环境:
-
QEMU 调用 KVM 内核模块,创建虚拟的 CPU(vCPU)、内存等资源。
-
-
vCPU 调度:
-
每个 vCPU 对应一个 Linux 线程,由宿主机的调度器(如 CFS)管理。
-
KVM 通过
ioctl(KVM_RUN)
启动 vCPU 运行。
-
-
内存虚拟化:
-
影子页表 或 EPT/NPT(Intel/AMD 硬件辅助)映射 Guest 物理地址到宿主机物理地址。
-
-
I/O 虚拟化:
-
模拟模式:QEMU 完全模拟设备(如 IDE 磁盘),性能较低。
-
半虚拟化(virtio):Guest 安装 virtio 驱动,直接与宿主机通信,减少模拟开销。
-
设备直通(VFIO):将物理设备(如 GPU)直接分配给虚拟机,近乎原生性能。
-
-
中断处理:
-
物理中断由宿主机处理 → KVM 注入虚拟中断到目标虚拟机。
-
5. 组件构成
组件层级 | 核心组件 | 关键作用 | 通俗理解 |
---|---|---|---|
内核层 | kvm.ko | 直接管理 CPU 和内存虚拟化 | 虚拟化引擎(指挥硬件资源) |
kvm-intel.ko kvm-amd.ko | 调用 Intel/AMD 的 CPU 虚拟化指令 | 硬件翻译官 | |
用户层 | QEMU | 模拟磁盘、网卡等虚拟设备 | 设备模拟器(造虚拟硬件) |
virtio驱动 | 高性能半虚拟化设备(磁盘/网卡/内存管理) | 加速芯片(提升 I/O 性能) | |
管理层 | libvirt | 统一管理虚拟机(创建/启动/迁移) | 管理员控制台 |
virsh | 命令行操作虚拟机 | 终端遥控器 | |
virt-manager | 图形化界面管理虚拟机 | 可视化操作面板 |
核心组件详解:
QEMU(硬件模拟器)
干什么:造出虚拟CPU、磁盘、网卡等硬件
关键能力:
跨平台运行不同架构系统(如x86主机跑ARM虚拟机)
与KVM协同实现高速虚拟化(不用KVM时性能差10倍+)
/dev/kvm(内核接口)
是什么:Linux内核暴露的字符设备文件
核心作用:用户空间(QEMU)操作KVM内核模块的唯一入口
ioctl(控制命令)
干什么:通过文件描述符(fd)向设备发送指令
关键操作:
KVM_CREATE_VM
(创建虚拟机)
KVM_RUN
(启动vCPU执行)fd(操作手柄)
本质:QEMU打开
/dev/kvm
后获得的文件描述符作用:所有ioctl命令必须通过fd操作
KVM内核模块(虚拟化引擎)
核心任务:
接管CPU的虚拟化功能(Intel VT-x/AMD-V)
直接管理物理内存映射(硬件加速EPT/NPT)
截获虚拟机敏感指令
二、部署KVM
案例实验环境
主机 | . 操作系统 | IP地址 | 主要软件 |
kvm01 | CentOS 7.9 x86_64 | 192.168.10.101 | KVM 虚拟机 |
kvm02 | CentOS 7.9 x86_64 | 192.168.10.102 |
搭建 KVM 虚拟化平台
101、102(配置一样)
#基础环境
--改主机名
101:
hostnamectl set-hostname kvm01
102:
hostnamectl set-hostname kvm02
--生效
bash
--主机映射
vim /etc/hosts
192.168.10.101 kvm01
192.168.10.102 kvm02
--关闭防火墙和setenforce
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
--安装
dnf -y install gnome-shell gnome-session gdm gnome-terminal
#设置默认的登录环境
systemctl set-default graphical.target
poweroff(关机配置虚拟机)
#虚拟机配置
处理器——》虚拟化引擎——》虚拟化Inter
(开机后就可以看到界面,可以使用伪终端,若要使用更多功能,可以再安装)
#安装KVM模块的一组包
dnf -y install qemu-kvm qemu-img bridge-utils virt-manager libguestfs-tools virt-install libvirt
#查看硬件和系统支不支持虚拟化
cat /proc/cpuinfo
lsmod | grep kvm
#启动
systemctl start libvirtd
systemctl enable libvirtd
#添加网络接口(自己设置虚拟网卡,为桥接网卡)
nmcli connection add type bridge con-name br0 ifname br0
语法格式:nmcli connection add type 网卡类型 网卡名字 ifname 网卡
#查看一下
cat /etc/sysconfig/network-scripts/ifcfg-br0
#虚拟与物理网卡绑定生成第三个网卡(为以太网网卡)
nmcli connection add type ethernet con-name br0-slave-ens33 ifname ens33 master br0
(实际网卡是来桥接虚拟与外部的网卡,类似交换机因此不需要地址)
#IP地址迁移到其他(br0)网卡
101:
nmcli connection modify br0 ipv4.method manual ipv4.address 192.168.10.101/24 ipv4.gateway 192.168.10.254 ipv4.dns 8.8.8.8
102:
nmcli connection modify br0 ipv4.method manual ipv4.address 192.168.10.102/24 ipv4.gateway 192.168.10.254 ipv4.dns 8.8.8.8
#查看(未转移到br0)
ifconfig
#关闭ens33网卡(让IP迁移生效)
nmcli con down ens33
#开启br0和br0-slave-ens33
nmcli con up br0
nmcli con up br0-slave-ens33
#查看验证(成功转移)
ifconfig
桌面环境管理
活动——》点虚拟系统管理器
(可以直接创建虚拟机)
存储池:放在哪个目录下这个目录就是存储池。创建的是目录
镜像存储池:
存储卷:
新建虚拟机
拉取iso镜像,放在/opt 下(用xhell)
步骤:
1.点添加
2.本地安装
3.选择iso镜像文件(opt下的)
4.设置内存和CPU
5.选择硬盘(选择下面的自定义,使用自定义的卷)
6.保持默认,桥接模式
7.安装
8.IP设置要与KVM主机保持在一个子网里(因为是桥接模式。NAT则不用)
管理KVM
#查看所有虚拟机和运行状态
virsh list --all
#关闭虚拟机
virsh shutdown 虚拟机名
#开启虚拟机
virsh start 虚拟机名
#强制关机
virsh destroy 虚拟机名
#利用运行配置文件去加载,开启虚拟机
virsh create /etc/libvirt/qemu/虚拟机名
#挂起虚拟机
virsh suspend 虚拟机名
#恢复虚拟机
virsh resume 虚拟机名
#配置虚拟机实例伴随宿主机自动启动
virsh autostart 虚拟机
#导出虚拟机配置文件(备份)
virsh dumpxml 虚拟机名 > /etc/libvirt/qemu/虚拟机m.xml
#虚拟机的删除与添加
virsh shutdown 虚拟机名 //先关闭
virsh undefine 虚拟机名 //再删除
#重定义(恢复)
virsh define 备份名
#通过备份的配置文件重新定义虚拟机
cd /etc/libvirt/qemu
mv 备份文件.xml 原名.xml
virsh list --all #查看虚拟机信息
virsh start 虚拟机名 #启动
#修改虚拟机配置信息
(用来修改系统内存大小、磁盘文件等信息)
直接通过 vim 命令修改。
[root@kvm01 ~]# vim /etc/libvirt/qemu/test01.xml
通过 virsh 命令修改。
[root@kvm01 ~]# virsh edit test01
文件管理
文件管理,通过磁盘文件查看信息
关闭虚拟机
1.virt-cat 命令,类似cat
格式要求是qcow2
(需要安装 libguestfs-tools-c、 guestfs-tools工具包)
virt-cat -a /data_kvm/store/test01.qcow2 /etc/hosts
2.virt-edit 命令
用于编辑文件,用法与 vim 基本一致。
virt-edit -a /data_kvm/store/test01.qcow2 /etc/resolv.conf
3.virt-df 命令
用于查看虚拟机磁盘信息。
virt-df -h test01
#虚拟机克隆(记得关闭虚拟机)
(1)查看虚拟机状态
[root@kvm01 ~]# virsh list --all
(2)从 test01 克隆 test02
[root@kvm01 ~]# virt-clone -o test01 -n test02 -f /data_kvm/store/test02.qcow2
(3)查看虚拟机状态
[root@kvm01 ~]# virsh list --all
(4)启动虚拟机
[root@kvm01 ~]# virsh start test02
#虚拟机快照(磁盘格式必须为 qcow2)
如:
(1)对 test01 创建快照
[root@kvm01 ~]# virsh snapshot-create test01
已生成域快照 1503494464
(2)查看虚拟机快照版本信息
[root@kvm01 ~]# virsh snapshot-current test01
(3)查看快照信息
[root@kvm01 ~]# virsh snapshot-list test01
(4)创建新快照
[root@kvm01 ~]# virsh snapshot-create test01
(5)查看快照信息
[root@kvm01 ~]# virsh snapshot-list test01
(6)恢复虚拟机状态
[root@kvm01 ~]# virsh snapshot-revert test01 1503494464
(7)查看虚拟机快照版本信息
[root@kvm01 ~]# virsh snapshot-current test01
(8)删除快照
[root@kvm01 ~]# virsh snapshot-delete test01 1503494464