KVM虚拟化

目录

基本概念

‌一、核心原理‌

‌1. 架构分层‌

‌2. 工作流程‌

‌二、关键特性‌

‌1. 高性能硬件辅助‌

‌2. 资源管理优化‌

‌3. 安全与隔离‌

‌三、核心价值与意义‌

‌1. 推动云计算基础设施演进‌

‌2. 降本增效‌

‌3. 技术生态优势‌

‌四、典型应用场景‌

基本部署

▍‌一、环境准备‌

‌1. 验证 CPU 虚拟化支持‌

‌2. 关闭冲突服务‌

▍‌二、KVM 核心安装‌

‌1. 安装软件包‌

‌2. 启动服务‌

▍‌三、创建虚拟机‌

‌1. 命令行部署(无图形界面)‌

‌2. 图形化部署(virt-manager)‌

▍‌四、虚拟机管理命令‌

▍‌五、故障排查‌

‌1. 虚拟化未启用‌

‌2. 权限不足‌

命令解析

‌一、虚拟机生命周期管理‌

‌1. 创建虚拟机 (virt-install)‌

‌2. 克隆虚拟机 (virt-clone)‌

‌二、虚拟机操作命令 (virsh)‌

‌1. 基础控制‌

‌2. 配置管理‌

‌3. 监控与调试‌

‌三、虚拟网络管理‌

‌1. 查看网络配置‌

‌2. 创建桥接网络‌

‌3. 端口转发(NAT模式)‌

‌四、高级性能调优‌

‌1. CPU绑定(减少调度开销)‌

‌2. 内存大页(降低TLB缺失率)‌

‌3. 磁盘缓存优化‌

‌五、故障排查命令‌

‌1. 日志分析‌

‌2. 硬件兼容性检查‌


基本概念

一、核心原理

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. 工作流程
  1. 虚拟机启动‌:QEMU通过 ioctl() 调用创建虚拟机实例和虚拟CPU(vCPU)。
  2. 指令执行‌:
    • 普通指令由CPU硬件直接执行。
    • 特权指令/设备访问触发 ‌VM-Exit‌,陷入KVM处理。
  3. 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 标准化操作接口。
    • 监控:perfsar 直接分析虚拟机性能。
  • 全栈开源‌:避免厂商锁定,支持定制化开发(如国产化OS适配)。

四、典型应用场景

  1. 企业私有云‌:
    • 运行ERP、数据库等关键业务系统,保障隔离性与SLA。
  2. 开发测试环境‌:
    • 快速创建多版本OS沙盒,支持CI/CD流水线。
  3. 桌面虚拟化(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"} 

操作流程‌:

  1. 点击「创建新虚拟机」
  2. 选择本地 ISO 安装源
  3. 分配 CPU/内存资源(建议内存≥2GB,CPU≥1核心)
  4. 设置虚拟磁盘(默认路径:/var/lib/libvirt/images/
  5. 配置网络为 ‌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 输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值