目录
基本概念
一、核心原理
1. 架构分层
graph TB A[用户空间] -->|ioctl调用| B(内核空间/KVM模块) B -->|中断/异常| C[硬件层-VT-x/AMD-V] D[QEMU模拟设备] -->|虚拟I/O请求| B C -->|执行虚拟机指令| E[Guest OS]
- 用户空间(QEMU):负责硬件设备模拟(网卡、磁盘等),通过
/dev/kvm
接口与内核交互。 - 内核空间(KVM模块):
kvm.ko
:核心模块,将Linux内核转为Hypervisor。kvm-intel.ko
/kvm-amd.ko
:利用CPU硬件虚拟化扩展(Intel VT-x/AMD-V)。
- 硬件层:CPU直接执行虚拟机指令,避免软件模拟性能损耗。
2. 工作流程
- 虚拟机启动:QEMU通过
ioctl()
调用创建虚拟机实例和虚拟CPU(vCPU)。 - 指令执行:
- 普通指令由CPU硬件直接执行。
- 特权指令/设备访问触发 VM-Exit,陷入KVM处理。
- I/O模拟:KVM将I/O请求转发至用户空间QEMU,由QEMU模拟硬件响应。
二、关键特性
1. 高性能硬件辅助
- CPU虚拟化:通过VT-x/AMD-V实现指令级硬件加速,性能损失<5%。
- 内存虚拟化:支持EPT(Intel)/RVI(AMD),实现Guest物理地址到主机物理地址的直接映射。
- 设备直通:PCIe设备通过VFIO直接分配给虚拟机(如GPU、网卡)。
2. 资源管理优化
技术 | 作用 |
---|---|
KSM内核同页合并 | 合并相同内存页,降低冗余数据占用(如相同OS镜像) |
CPU超分 | 物理CPU核心动态分配给多个vCPU,提升资源利用率(最高1:8) |
热迁移 | 虚拟机运行时无缝迁移至其他主机(依赖共享存储) |
3. 安全与隔离
- SELinux集成:强制访问控制隔离虚拟机进程。
- 加密通信:支持TLS加密虚拟机管理通道。
- 硬件信任链:可选TPM模块实现启动完整性验证。
三、核心价值与意义
1. 推动云计算基础设施演进
- 开源云平台基石:OpenStack、oVirt 等均以KVM为默认虚拟化引擎。
- 混合云兼容性:支持跨公有云(如AWS、阿里云)和私有云统一架构。
2. 降本增效
场景 | 收益 |
---|---|
服务器整合 | 单物理机运行数十虚拟机,硬件利用率提升60%+ |
快速部署 | 模板克隆实现秒级虚拟机创建(对比物理机小时级) |
节能减耗 | 通过整合降低数据中心电力与冷却成本 |
3. 技术生态优势
- 无缝集成Linux工具链:
- 管理:
libvirt
+virsh
标准化操作接口。 - 监控:
perf
、sar
直接分析虚拟机性能。
- 管理:
- 全栈开源:避免厂商锁定,支持定制化开发(如国产化OS适配)。
四、典型应用场景
- 企业私有云:
- 运行ERP、数据库等关键业务系统,保障隔离性与SLA。
- 开发测试环境:
- 快速创建多版本OS沙盒,支持CI/CD流水线。
- 桌面虚拟化(VDI):
- 集中部署图形工作站,支持远程设计协作。
技术定位:KVM将Linux内核转化为通用Hypervisor,通过硬件辅助虚拟化与开源生态结合,成为现代数据中心的核心引擎。
基本部署
▍一、环境准备
1. 验证 CPU 虚拟化支持
egrep -o '(vmx|svm)' /proc/cpuinfo # 检查硬件虚拟化扩展:ml-citation{ref="1,2" data="citationList"}
- 命令解析:
egrep
:使用正则表达式匹配文本vmx
:Intel CPU 虚拟化标识svm
:AMD CPU 虚拟化标识- 输出要求:至少返回一行
vmx
或svm
(否则需 BIOS 开启 VT-x/AMD-V)
2. 关闭冲突服务
sudo setenforce 0 # 临时关闭 SELinux:ml-citation{ref="2" data="citationList"}
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永久关闭:ml-citation{ref="2" data="citationList"}
sudo systemctl disable --now firewalld # 关闭防火墙:ml-citation{ref="2,3" data="citationList"}
swapoff -a && sysctl -w vm.swappiness=0 # 禁用 swap 分区:ml-citation{ref="2" data="citationList"}
- 关键作用:
- 避免 SELinux 阻断虚拟化操作
- 防止防火墙拦截 KVM 网络流量
- 提升内存分配效率
▍二、KVM 核心安装
1. 安装软件包
sudo yum -y install qemu-kvm libvirt virt-install virt-manager bridge-utils # CentOS/RHEL:ml-citation{ref="1,3" data="citationList"}
sudo apt -y install qemu-kvm libvirt-daemon-system virtinst virt-manager bridge-utils # Ubuntu/Debian:ml-citation{ref="4,7" data="citationList"}
- 组件功能:
包名 作用 qemu-kvm
提供 CPU 虚拟化核心引擎 libvirt
虚拟机管理 API 守护进程 virt-install
命令行创建虚拟机的工具 virt-manager
图形化管理界面 bridge-utils
配置网络桥接
2. 启动服务
sudo systemctl enable --now libvirtd # 启动并设置开机自启:ml-citation{ref="1,3" data="citationList"}
sudo systemctl status libvirtd # 验证服务状态:ml-citation{ref="1" data="citationList"}
- 成功标志:显示
active (running)
且无报错
▍三、创建虚拟机
1. 命令行部署(无图形界面)
sudo virt-install \
--name=centos7 \ # 虚拟机名称:ml-citation{ref="3,8" data="citationList"}
--memory=4096 \ # 分配内存(MB):ml-citation{ref="3" data="citationList"}
--vcpus=2 \ # 虚拟CPU核心数:ml-citation{ref="3" data="citationList"}
--disk path=/var/lib/libvirt/images/centos7.qcow2,size=20 \ # 磁盘路径与大小(GB):ml-citation{ref="3,8" data="citationList"}
--os-type=linux \ # 操作系统类型:ml-citation{ref="8" data="citationList"}
--os-variant=centos7 \ # 系统发行版版本:ml-citation{ref="8" data="citationList"}
--location=/iso/CentOS-7-x86_64.iso \ # ISO 镜像路径:ml-citation{ref="3" data="citationList"}
--network bridge=br0 \ # 桥接到主机网卡:ml-citation{ref="3" data="citationList"}
--graphics none \ # 禁用图形控制台:ml-citation{ref="3" data="citationList"}
--console pty,target_type=serial \ # 启用串行控制台:ml-citation{ref="3" data="citationList"}
--extra-args="console=ttyS0" # 内核参数(文本安装):ml-citation{ref="3" data="citationList"}
- 网络桥接关键:
bridge=br0
需提前配置主机网桥(参考brctl addbr br0
)- 未配置桥接时默认使用 NAT 网络
2. 图形化部署(virt-manager)
sudo virt-manager # 启动图形管理界面:ml-citation{ref="7" data="citationList"}
操作流程:
- 点击「创建新虚拟机」
- 选择本地 ISO 安装源
- 分配 CPU/内存资源(建议内存≥2GB,CPU≥1核心)
- 设置虚拟磁盘(默认路径:
/var/lib/libvirt/images/
) - 配置网络为 Bridge 模式(性能最优)或 NAT
▍四、虚拟机管理命令
操作 | 命令 | 作用 |
---|---|---|
查看运行状态 | virsh list --all | 列出所有虚拟机 |
启动虚拟机 | virsh start centos7 | 启动指定名称的虚拟机 |
关闭虚拟机 | virsh shutdown centos7 | 安全关机 |
强制停止 | virsh destroy centos7 | 强制断电(相当于拔电源) |
删除虚拟机 | virsh undefine centos7 | 移除配置(不删除磁盘) |
进入控制台 | virsh console centos7 | 连接串行终端 |
▍五、故障排查
1. 虚拟化未启用
ERROR Host does not support virtualization: VT or SVM disabled
- 解决方案:
- BIOS 中启用 Intel VT-x / AMD-V
- VMware 虚拟机需勾选「虚拟化引擎」选项
2. 权限不足
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied
- 修复命令:
sudo usermod -aG libvirt $USER # 将当前用户加入 libvirt 组:ml-citation{ref="7" data="citationList"} newgrp libvirt # 刷新用户组权限:ml-citation{ref="7" data="citationList"}
部署原则:
① 生产环境优先使用 CLI 部署(资源消耗低)
② 虚拟机磁盘格式选择qcow2
(支持快照与动态扩容)
③ 关键服务虚拟机配置/etc/libvirt/qemu/
备份
命令解析
一、虚拟机生命周期管理
1. 创建虚拟机 (virt-install
)
virt-install \
--name=ubuntu22 \ # 虚拟机名称(唯一标识):ml-citation{ref="3,5" data="citationList"}
--ram=4096 \ # 分配内存大小(MB):ml-citation{ref="3" data="citationList"}
--vcpus=2,sockets=1,cores=2,threads=1 \# CPU拓扑:2核/1插槽/单线程:ml-citation{ref="5" data="citationList"}
--disk path=/var/lib/libvirt/images/ubuntu22.qcow2,size=30,format=qcow2 \ # 磁盘路径、大小(GB)、格式:ml-citation{ref="3,5" data="citationList"}
--os-variant=ubuntu22.04 \ # 优化虚拟硬件配置(需先执行`osinfo-query os`):ml-citation{ref="5" data="citationList"}
--network bridge=br0,model=virtio \ # 桥接网络,使用virtio网卡驱动:ml-citation{ref="4,5" data="citationList"}
--graphics spice,listen=0.0.0.0 \ # 启用SPICE远程桌面(端口自动分配):ml-citation{ref="5" data="citationList"}
--console pty,target_type=virtio \ # 配置串行控制台:ml-citation{ref="3" data="citationList"}
--cdrom /path/to/ubuntu-22.04.iso # 安装ISO路径:ml-citation{ref="3" data="citationList"}
- 关键参数:
format=qcow2
:支持快照、动态扩容(优于raw格式)model=virtio
:半虚拟化驱动,提升I/O性能
2. 克隆虚拟机 (virt-clone
)
virt-clone \
--original ubuntu22 \ # 源虚拟机名称:ml-citation{ref="5" data="citationList"}
--name ubuntu22-clone \ # 新虚拟机名称:ml-citation{ref="5" data="citationList"}
--file /var/lib/libvirt/images/ubuntu22-clone.qcow2 # 新磁盘路径:ml-citation{ref="5" data="citationList"}
--mac 52:54:00:XX:XX:XX # 指定新MAC地址(避免冲突):ml-citation{ref="4" data="citationList"}
二、虚拟机操作命令 (virsh
)
1. 基础控制
virsh start ubuntu22 # 启动虚拟机:ml-citation{ref="1,3" data="citationList"}
virsh shutdown ubuntu22 # 优雅关机(需Guest内ACPI支持):ml-citation{ref="1" data="citationList"}
virsh destroy ubuntu22 # 强制断电(相当于物理机拔电):ml-citation{ref="1" data="citationList"}
virsh reboot ubuntu22 # 重启虚拟机:ml-citation{ref="1" data="citationList"}
virsh suspend ubuntu22 # 暂停虚拟机(内存状态保留):ml-citation{ref="1" data="citationList"}
virsh resume ubuntu22 # 恢复暂停的虚拟机:ml-citation{ref="1" data="citationList"}
2. 配置管理
virsh edit ubuntu22 # 编辑XML配置文件(修改CPU/内存等):ml-citation{ref="1,5" data="citationList"}
virsh dumpxml ubuntu22 > vm.xml # 导出虚拟机配置:ml-citation{ref="1" data="citationList"}
virsh define vm.xml # 导入虚拟机配置:ml-citation{ref="1" data="citationList"}
virsh undefine ubuntu22 --remove-all-storage # 删除虚拟机及其磁盘:ml-citation{ref="1" data="citationList"}
3. 监控与调试
virsh dominfo ubuntu22 # 查看虚拟机基本信息:ml-citation{ref="1" data="citationList"}
virsh vcpuinfo ubuntu22 # 显示vCPU分配详情:ml-citation{ref="1" data="citationList"}
virsh domstats ubuntu22 # 实时统计(CPU/内存/磁盘使用率):ml-citation{ref="1,5" data="citationList"}
virsh console ubuntu22 # 连接串行控制台(需Guest配置ttyS0):ml-citation{ref="3" data="citationList"}
三、虚拟网络管理
1. 查看网络配置
virsh net-list --all # 列出所有虚拟网络:ml-citation{ref="4" data="citationList"}
virsh net-dumpxml default # 导出默认网络的XML配置:ml-citation{ref="4" data="citationList"}
2. 创建桥接网络
virsh net-define <<EOF # 定义新网络(桥接模式):ml-citation{ref="4" data="citationList"}
<network>
<name>br0</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
EOF
virsh net-start br0 # 启动网络:ml-citation{ref="4" data="citationList"}
virsh net-autostart br0 # 设置开机自启:ml-citation{ref="4" data="citationList"}
3. 端口转发(NAT模式)
virsh net-update default add-last ip-dhcp-range \ # 修改默认NAT网络的DHCP范围:ml-citation{ref="4" data="citationList"}
"<range start='192.168.122.100' end='192.168.122.200'/>" \
--live --config
四、高级性能调优
1. CPU绑定(减少调度开销)
virsh vcpupin ubuntu22 0 2 # 将vCPU 0绑定到物理CPU 2:ml-citation{ref="5,8" data="citationList"}
virsh emulatorpin ubuntu22 2-4 # QEMU进程绑定到CPU 2-4:ml-citation{ref="8" data="citationList"}
2. 内存大页(降低TLB缺失率)
echo 2048 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages # 分配大页:ml-citation{ref="8" data="citationList"}
virsh edit ubuntu22 # 在XML中添加:
<memoryBacking>
<hugepages/> # 启用大页支持:ml-citation{ref="8" data="citationList"}
</memoryBacking>
3. 磁盘缓存优化
virsh attach-disk ubuntu22 \ # 添加高性能磁盘:ml-citation{ref="5" data="citationList"}
/dev/nvme0n1 vdb \
--cache none --io native --persistent
- 缓存模式:
none
:直接写入物理设备(最高性能,需电池备份)writeback
:默认模式,平衡安全性与性能
五、故障排查命令
1. 日志分析
journalctl -u libvirtd -f # 实时查看libvirt日志:ml-citation{ref="3" data="citationList"}
cat /var/log/libvirt/qemu/ubuntu22.log # 特定虚拟机日志:ml-citation{ref="3" data="citationList"}
2. 硬件兼容性检查
virsh capabilities # 显示主机虚拟化能力(支持的CPU/特性):ml-citation{ref="5" data="citationList"}
virsh domcapabilities # 查看虚拟机支持的配置选项:ml-citation{ref="5" data="citationList"}
最佳实践:
- 生产环境优先使用
virtio
驱动(磁盘/网卡)提升性能- 关键操作前使用
virsh dumpxml
备份配置- 批量管理时结合
grep/awk
解析virsh list --name
输出