KVM 是什么
KVM(Kernel-based Virtual Machine)是 Linux 内核自带的全虚拟化模块:加载后,配合 Intel VT-x 或 AMD-V 硬件辅助能力,Linux 本身就成为 hypervisor。它向用户态暴露 /dev/kvm 接口,由 QEMU 等程序调用完成 CPU 与内存虚拟化,因此常被合称为 QEMU/KVM。
基本信息
| 形态 | 内核模块 kvm 加 kvm_intel 或 kvm_amd |
|---|---|
| 接口 | /dev/kvm 字符设备,供用户态程序创建虚拟机 |
| 依赖 | 需要 CPU 虚拟化扩展,通常还要在 BIOS 中开启 |
| 分工 | KVM 负责 CPU 与内存,QEMU 提供设备模型,libvirt 提供管理接口 |
| 权限 | 普通用户需加入 kvm 组或由 root 运行才能访问设备节点 |
| 嵌套虚拟化 | 可通过模块参数开启,供上层再次运行虚拟化环境 |
典型使用场景
- 自建虚拟化平台:在物理机上直接运行云平台或虚拟化管理软件
- 开发测试环境:本地起多台虚拟机验证集群与分布式部署
- 容器内跑虚拟机:CI 中需要完整内核或不同发行版时用虚机隔离
- 模拟异构环境:结合 QEMU 实现跨架构验证
检查与加载
检查与加载
grep -Eoc 'vmx|svm' /proc/cpuinfo # 大于 0 说明 CPU 支持虚拟化
grep -E '^flags' /proc/cpuinfo | grep -Eo 'vmx|svm' | head -1 # 确认虚拟化标志
sudo modprobe kvm_intel # AMD 平台换成 kvm_amd
lsmod | grep -E '^kvm' # 确认模块已加载
ls -l /dev/kvm # 确认设备节点存在及权限
groups | tr ' ' '\n' | grep -x kvm # 确认当前用户在 kvm 组内内核侧关键项读法
| 检查项 | 正常表现 | 异常表现 |
|---|---|---|
| CPU 标志 | flags 中出现 vmx 或 svm | 无标志说明 BIOS 未开启或 CPU 不支持 |
| 模块加载 | kvm、kvm_intel 或 kvm_amd 出现在模块列表 | 模块缺失可能是内核裁剪或与容器冲突 |
| 设备节点 | /dev/kvm 存在且属主为 root、属组为 kvm | 不存在说明模块未加载或未创建节点 |
| 嵌套参数 | 可读取嵌套虚拟化开关状态 | 默认关闭时上层虚拟机无法再开虚机 |
| 日志 | 内核日志中有 KVM 初始化信息 | 出现硬件不支持或已被其他 hypervisor 占用提示 |
KVM 只做 CPU 与内存虚拟化,网卡与磁盘由 QEMU 模拟或直通。排障时先分清问题在哪一侧:CPU 与内存类报错看内核与 KVM,设备识别与 IO 性能问题多半在 QEMU 设备配置上。
嵌套虚拟化需要显式开启:把模块参数写入配置文件并重新加载模块后才能生效。开启后性能会低于原生,适合测试与验证场景,不适合高负载生产。