一、案例背景与目标
1.1 案例背景
在企业 IT 环境中,常常面临 Linux 服务器硬件资源利用率不高的问题。为了充分利用这些闲置资源,部署 KVM 虚拟化平台成为一种高效的解决方案。通过 KVM,可以在单一物理服务器上运行多个业务系统,实现资源的最大化利用。例如,在运行 Nginx 服务的服务器上部署 KVM,然后在 KVM 虚拟机上运行 Tomcat 等其他服务,从而提高硬件资源的利用率,降低企业 IT 成本。
1.2 技能目标5
本案例旨在帮助读者掌握以下技能:
- 深入理解 KVM 虚拟化原理
- 熟练掌握 KVM 虚拟化架构的部署方法
- 能够独立创建和管理 KVM 虚拟机实例
二、KVM 虚拟化原理详解
2.1 KVM 的组成结构
广义的 KVM 虚拟化技术主要由两部分组成:
- KVM 内核模块:基于 Linux 内核开发,主要负责模拟处理器和内存资源,为虚拟机的运行提供底层支持
- Qemu:经过简化和修改的 Qemu 组件,主要处理 I/O 操作,并为用户提供虚拟机管理的用户空间工具
这两部分相互协作,共同构成了一个完整的虚拟化平台。需要注意的是,Qemu 本身是一套独立的虚拟化解决方案,纯软件实现所有虚拟化功能,但性能较低。而 KVM 通过与 Linux 内核的深度整合,在性能、安全性、兼容性和稳定性方面都有出色表现。
2.2 KVM 运6789行时的三种模式
KVM 的引入为 Linux 系统增加了一种新的运行模式 —— 客户模式,从而形成了三种运行模式:
2.2.1 客户模式
客户模式是客户机操作系统运行的模式,它又分为两个子模式:
- 用户模式:为用户提供虚拟机管理的用户空间工具,并代表用户执行 I/O 操作,Qemu 就运行在这个模式下
- 内核模式:负责模拟 CPU 和内存,实现客户模式的切换,并处理从客户模式的退出,KVM 内核模块运行在此模式
2.2.2 原有Linux 模式
- 内核模式:Linux 主机操作系统的内核运行模式
- 用户模式:Linux 主机操作系统的用户空间运行模式
三种模式的层次关系如图 1.2 所示,用户空间的 Qemu 通过 IOCTL 系统调用与内核模式的 KVM 驱动进行交互,实现对虚拟机的管理和控制。
2.3 KVM 工作原理
KVM 的工作流程如下:
- 用户模式的 Qemu 利用 libkvm 接口,通过 ioctl 系统调用进入内核模式
- KVM 驱动为虚拟机创建虚拟 CPU 和虚拟内存
- 执行 VMLAUNCH 指令进入客户模式,装载并运行 Guest OS
- 在 Guest OS 运行过程中,如果发生中断或影子缺页等异常情况,将暂停 Guest OS 的运行,保存当前上下文并退出到内核模式处理异常
- 在内核模式处理异常时,如果不需要 I/O 操作,处理完成后重新进入客户模式;如果需要 I/O 操作,则进入用户模式,由 Qemu 处理 I/O
- I/O 处理完成后,依次进入内核模式和客户模式,继续运行 Guest OS
三、案例环境准备
3.1 实验环境配置
本案例使用的实验环境如下表所示:
主机名 | 操作系统 | IP 地址 | 主要软件 |
---|---|---|---|
bdqn | CentOS 7.9 x86_64 | 192.168.10.108 | KVM 虚拟机 |
test01 | CentOS 7.9 x86_64 | 192.168.10.109 | - |
3.2 案例需求
本案例需要完成以下任务:
- 在 bdqn 主机上安装 KVM 虚拟化平台
- 完成 KVM 的基本操作管理,包括虚拟机的创建、启动、停止等
- 掌握 KVM 命令行操作虚拟机的方法
3.3 实现思路
本案例的实现思路分为以下几个步骤:
- 准备 KVM 安装环境
- 安装 KVM 虚拟化软件
- 配置 KVM 桥接网络
- 创建 KVM 存储池并安装虚拟机
- 使用命令行操作虚拟机
四、KVM 虚拟化平台搭建
4.1 准备 KVM 虚拟化环境
4.1.1 YUM 安装 KVM 相关软件
在 CentOS 系统中,可以通过 YUM 方便地安装 KVM 所需的软件包。首先需要部署基于光盘镜像的本地 YUM 源,然后执行以下命令安装相关软件:
# 安装GNOME桌面环境
yum groupinstall -y "GNOME Desktop"
# 安装KVM模块
yum -y install qemu-kvm
# 安装KVM调试工具(可选)
yum -y install qemu-kvm-tools
# 安装构建虚拟机的命令行工具
yum -y install virt-install
# 安装qemu组件,用于创建磁盘和启动虚拟机
yum -y install qemu-img
# 安装网络支持工具
yum -y install bridge-utils
# 安装虚拟机管理工具
yum -y install libvirt
# 安装图形界面管理虚拟机工具
yum -y install virt-manager
安装完成后,需要将系统的默认运行目标更改为图形化界面,否则重启时可能会报错:
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
4.1.2 验证36373839CPU 虚拟化支持
重启系统后,需要验证 CPU 是否支持虚拟化技术:
使用以下命令检查 KVM 模块是否正确安装:
lsmod | grep kvm
如果输出结果中包含kvm_intel
或kvm_amd
,则说明 KVM 模块已成功加载
4.1.4 开42启 libvirtd 服务
安装完成后,需要启动 libvirtd 服务以提供相关支持:
# 启动libvirtd服务
systemctl start libvirtd
# 设置libvirtd服务开机自启
systemctl enable libvirtd
4.2 设置 KVM43网络(桥接模式)
4.2.1 网络模式介绍
在 libvirt 中运行 KVM 网络有两种模式:
- NAT 模式:默认网络模式,数据包通过 NAT 方式经主机网卡接口传送,虚拟机可以访问外网,但外部主机无法访问虚拟机内部网络
- 桥接模式:允许虚拟机像独立主机一样拥有网络,外部机器可以直接访问虚拟机内部,但需要网卡支持(一般有线网卡都支持)
本案例以桥接模式为例进行配置,宿主机 IP 地址为 192.168.10.1。首先编辑物理网卡配置文件:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
添加以下内容
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=58b0765c-572c-4f63-89a7-1bf720b1fab0
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
然后编辑桥接网卡配置文件:
vim /etc/sysconfig/network-scripts/ifcfg-br0
添加以下内容:
TYPE=Bridge
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.10.1
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
4.2.3 重启网络服务
配置完成后,重启网络服务使配置生效:
/etc/init.d/network restart
4.2.4 验证桥接配置
使用 ifconfig 命令查看网络配置,确认桥接网卡 br0 已正确配置 IP 地址:
ifconfig
如果看到 br0 的相关信息,说明网卡桥接成功。
4.3 使用 virt-manager 管理 KVM
4.3.1 启动 virt-manager
在命令行中输入以下命令启动图形化虚拟机管理工具 virt-manager
virt-manager
4.3.2 创建存储池
- 在 virt-manager 界面中,双击 QEMU/KVM,选择 "存储" 选项卡
- 单击 "+" 按钮新建存储池
- 在弹出的对话框中,输入存储池名称(如 bdqn),选择类型为 "dir. 文件系统目录"
- 浏览或输入存储目录(如 /data_kvm/store)
- 单击 "完成" 按钮创建存储池
4.3.3 创建镜像存储池
以同样的方式创建镜像存储池:
- 单击 "+" 按钮
- 输入名称(如 bdqn_iso)
- 设置目录为 /data_kvm/iso
- 单击 "完成" 按钮
在安装操作系统时,需要将 ISO 镜像上传到该目录。
4.3.4 创建存储卷
- 单击刚创建的存储池(如 bdqn)
- 单击对话框中 "卷" 右边的 "+" 按钮
- 输入存储卷名称(如 bdqn_kvm.qcow2)
- 选择格式为 qcow2
- 设置最大容量(如 10.0GB)
- 单击 "完成" 按钮创建存储卷
4.3.5 新建虚拟机
- 右击 "QEMU/KVM",选择 "新建" 选项
- 在弹出的对话框中选择 "本地安装介质",单击 "前进"
- 单击 "浏览" 按钮选择 ISO 镜像文件
- 选择操作系统类型及版本,单击 "前进"
- 分配内存和 CPU 资源(如 1 核 CPU、1GB 内存),单击 "前进"
- 点选 "选择或创建自定义存储",单击 "管理" 按钮选择存储卷文件,单击 "前进"
- 命名虚拟机(如 CentOS 7.3),勾选 "在安装前自定义配置",单击 "完成"
- 在 "引导选项" 视图中勾选 "主机引导时启动虚拟机",单击 "应用"
- 最后单击 "开始安装" 按钮,按照提示完成操作系统安装
五、KVM 命令行管理77787980虚拟机
5.1 虚拟机基本操作
5.1.1 查看命令帮助
virsh -h
5.1.2 查看配置文件目录
ls /etc/libvirt/qemu/
5.1.3 查看虚拟机状态
virsh list --all
5.1.4 控制虚拟机启动与关闭
# 启动虚拟机
virsh start test01
# 正常关闭虚拟机
virsh shutdown test01
# 强制关闭虚拟机
virsh destroy test01
5.1.5 挂起与恢复虚拟机
# 挂起虚拟机
virsh suspend test01
# 恢复虚拟机
virsh resume test01
5.1虚拟机自启动与配置管理
5.2.1 设置虚拟机自启动
virsh autostart test01
此命令将在 /etc/libvirt/qemu/autostart/ 目录下创建开机自动启动的配置文件。
5.2.2 导出与导入虚拟机配置
# 导出虚拟机配置到文件
virsh dumpxml test01 > /etc/libvirt/qemu/test02.xml
# 通过配置文件临时启动虚拟机
virsh create /etc/libvirt/qemu/test01.xml
# 永久定义虚拟机配置
virsh define /etc/libvirt/qemu/test01.xml
5.2.3 虚拟机删除与恢复
# 关闭并删除虚拟机定义
virsh shutdown test01
virsh undefine test01
# 恢复虚拟机(需提前备份配置文件)
mv test02.xml test01.xml
virsh define test01.xml
5.2.4 修改虚拟机配置
# 直接编辑XML配置文件
vim /etc/libvirt/qemu/test01.xml
# 使用virsh交互编辑
virsh edit test01
5.3 磁盘与文件管理
5.3.1 磁盘格式操作
# 查看磁盘详细信息
qemu-img info /data_kvm/store/test01.qcow2
# 转换磁盘格式(raw转qcow2)
virsh shutdown test01
qemu-img convert -f raw -o qcow2 source.img target.qcow2
# 修改XML配置文件中的磁盘路径
virsh edit test01
5.3.2 虚拟机文件操作
# 安装文件操作工具
yum -y install libguestfs-tools-c
# 查看虚拟机文件内容
virt-cat -a /data_kvm/store/test01.qcow2 /etc/hosts
# 编辑虚拟机文件
virt-edit -a /data_kvm/store/test01.qcow2 /etc/resolv.conf
# 查看虚拟机磁盘使用情况
virt-df -h test01
5.4 虚拟机克隆与快照
5.4.1 虚拟机克隆
# 查看源虚拟机状态(需关闭)
virsh list --all
# 克隆虚拟机
virt-clone -o test01 -n test02 -f /data_kvm/store/test02.qcow2
# 启动克隆的虚拟机
virsh start test02
5.4.2 虚拟机快照管理
# 创建快照(需磁盘为qcow2格式)
virsh snapshot-create test01
# 查看所有快照
virsh snapshot-list test01
# 查看当前快照
virsh snapshot-current test01
# 恢复到指定快照
virsh snapshot-revert test01 1503494464
# 删除快照
virsh snapshot-delete test01 1503494464
六、KVM 高级管理技巧
6.1 虚拟机资源调整
6.1.1 动态调整内存
# 查看当前内存配置
virsh dommemstat test01
# 动态增加内存(不重启虚拟机)
virsh setmaxmem test01 2048M --config
virsh setmem test01 2048M
# 永久修改内存配置
virsh edit test01
6.1.2 调整 CPU 资源
# 查看当前CPU配置
virsh vcpucount test01
# 动态增加CPU核心数(需虚拟机支持)
virsh setvcpus test01 2 --config --live
# 永久修改CPU配置
virsh edit test01
6.2 网络高级配置
6.2.1 创建虚拟网络
# 创建NAT模式虚拟网络
virsh net-create /usr/share/libvirt/networks/default.xml
# 查看虚拟网络列表
virsh net-list
# 启动/停止虚拟网络
virsh net-start default
virsh net-stop default
6.2.2 配置端口转发
# 编辑虚拟网络配置
virsh net-edit default
# 添加端口转发规则(示例:转发主机8080到虚拟机80)
<forward mode='nat'><port start='8080' end='8080' protocol='tcp'><guest port='80'/></port>
</forward>
# 重启网络使配置生效
virsh net-destroy default
virsh net-create /etc/libvirt/qemu/networks/default.xml
6.3 存储池高级管理
6.3.1 扩展存储池
# 查看存储池信息
virsh pool-info bdqn
# 扩展存储池空间(需先增加物理磁盘空间)
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mkdir -p /data_kvm/store_ext
mount /dev/sdb1 /data_kvm/store_ext
# 扩展逻辑卷(如果使用LVM)
vgextend vg_kvm /dev/sdb1
lvextend -L +10G /dev/vg_kvm/lv_store
# 重新扫描存储池
virsh pool-scan bdqn
6.3.2 迁移存储池
# 停止存储池
virsh pool-stop bdqn
# 复制存储池到新位置
rsync -avz /data_kvm/store/ /new_storage/store/
# 修改存储池路径
virsh pool-edit bdqn
# 重新定义存储池
virsh pool-define /etc/libvirt/pools/bdqn.xml
# 启动存储池
virsh pool-start bdqn
七、常见问题与解决方案
7.1 安装与配置问题
7.1.1 CPU 虚拟化支持未开启
- 现象:执行
cat /proc/cpuinfo | grep vmx
无输出 - 解决方案:
- 重启服务器进入 BIOS
- 在 CPU 配置中启用 Intel VT-x 或 AMD-V 虚拟化技术
- 保存设置并重启系统
7.1.2 桥接网络配置失败
- 现象:重启网络后 br0 接口未生成 IP 地址
- 解决方案:
- 检查物理网卡配置文件是否正确设置
BRIDGE=br0
- 确认桥接网卡配置文件中 IP 地址、网关设置正确
- 尝试手动创建桥接接口:
brctl addbr br0; brctl addif br0 ens33; ifconfig br0 up
- 检查物理网卡配置文件是否正确设置
7.2 虚拟机运行问题
7.2.1 虚拟机无法启动
- 现象:执行
virsh start test01
后虚拟机状态仍为关闭 - 解决方案:
- 检查虚拟机日志:
tail -f /var/log/libvirt/qemu/test01.log
- 确认存储卷路径正确:
virsh edit test01
查看<source file>
字段 - 检查磁盘空间是否充足:
df -h /data_kvm/store
- 检查虚拟机日志:
7.2.2 虚拟机网络不通
- 现象:虚拟机无法访问外部网络或被外部访问
- 解决方案:
- 检查虚拟机网络配置是否正确(IP、子网掩码、网关)
- 确认桥接网络配置正确,物理网卡已加入桥接
- 检查宿主机防火墙设置:
iptables -L -n
确保允许相关流量
7.3 性能优化问题
7.3.1 虚拟机性能低下
- 解决方案:
- 启用 CPU 全虚拟化:在虚拟机配置中添加
<cpu mode='host-passthrough'>
- 使用 virtio 驱动:安装
qemu-guest-agent
和virtio驱动
- 调整内存分配:确保虚拟机有足够内存,避免频繁 swap
- 优化存储:使用 SSD 存储或配置 RAID 提高磁盘性能
- 启用 CPU 全虚拟化:在虚拟机配置中添加
7.3.2 I/O 性能瓶颈
- 解决方案:
- 使用本地存储而非网络存储
- 配置磁盘缓存:在虚拟机配置中设置
<driver cache='writeback'>
- 启用多队列网卡:在支持的硬件上配置
num_queues=4
八、KVM 最佳实践
8.1 资源规划与分配
- CPU 分配:单物理 CPU 核心建议最多分配给 2-3 个虚拟机
- 内存分配:预留 20% 物理内存给宿主机系统
- 存储规划:
- 系统盘使用 qcow2 格式并启用精简配置
- 数据盘使用 raw 格式获得最佳性能
- 重要数据建议配置存储池备份策略
8.2 安全与备份策略
-
安全措施:
- 启用 SELinux 增强安全性:
setenforce 1
- 限制 libvirtd 服务访问:
tcpwrappers
配置/etc/hosts.allow
- 虚拟机内部部署防火墙和杀毒软件
- 启用 SELinux 增强安全性:
-
备份策略:
- 定期对虚拟机配置文件和磁盘文件进行备份
- 使用快照功能保存重要状态点
- 重要数据建议实时同步到异地存储