3. KVM环境搭建

KVM 并不是一个可以单独运行的“软件”,而是 Linux 内核提供的虚拟化能力。要让一台物理机成为合格的 KVM 宿主机,需要同时满足三个条件:CPU 支持硬件虚拟化并已在 BIOS/UEFI 中开启、内核加载了正确的虚拟化模块、用户态工具链(QEMU、libvirt、virt-manager)完整可用。本节围绕“检查—选型—安装—验证”这条主线,给出可落地的环境搭建方法。

一、核心原理:KVM 的分层结构

理解安装对象之前,先要看清各组件在系统中的位置。KVM 是内核模块,负责利用 CPU 的 VT-x/AMD-V 指令完成特权级切换;QEMU 是用户态的硬件模拟器,负责设备模型与 I/O;libvirt 是管理抽象层,统一管理 QEMU/KVM、存储、网络;virt-manager 则是基于 libvirt 的图形化管理前端。四者缺一不可,但职责边界清晰。

KVM 宿主机软件栈与硬件依赖 物理硬件层 CPU(Intel VT-x / AMD-V) · 内存 · 磁盘 · 网卡 · BIOS/UEFI 虚拟化开关 Linux 内核层 kvm.ko / kvm_intel.ko / kvm_amd.ko · vhost-net · /dev/kvm 字符设备 QEMU(设备模拟) qemu-kvm / qemu-system-x86_64 CPU 模型、磁盘、网卡、显示设备 libvirt(管理抽象) libvirtd 守护进程 · virsh 命令行 存储池、虚拟网络、XML 域定义 virt-manager / virt-install / cockpit-machines 图形化与命令行管理前端,通过 libvirt API 操作 检查入口 lscpu / lsmod 验证入口 virsh / virt-host-validate

二、硬件虚拟化检查

第一步是确认 CPU 是否支持虚拟化扩展,以及内核是否已加载对应模块。Intel 平台对应 vmx 标志与 kvm_intel 模块,AMD 平台对应 svm 标志与 kvm_amd 模块。

# 1. 查看 CPU 是否支持硬件虚拟化
grep -Eoc '(vmx|svm)' /proc/cpuinfo
# 返回值大于 0 表示支持

# 2. 查看虚拟化相关内核模块
lsmod | grep kvm
# 期望看到 kvm_intel 或 kvm_amd 以及 kvm

# 3. 确认 /dev/kvm 设备存在
ls -l /dev/kvm
# crw-rw----+ 1 root kvm ... /dev/kvm

# 4. 若模块未加载,手动加载
sudo modprobe kvm_intel      # Intel
sudo modprobe kvm_amd        # AMD
若 /proc/cpuinfo 中完全没有 vmx 或 svm,通常不是系统问题,而是 BIOS/UEFI 中的 Intel Virtualization Technology、SVM Mode 等选项未开启。虚拟机中嵌套 KVM 时,还需在宿主层开启“虚拟化 Intel VT-x/EPT”或“虚拟化 AMD-V/RVI”透传。

三、Linux 发行版选择

KVM 已进入 Linux 主线内核,理论上任何现代发行版都能运行。但作为宿主机,发行版的软件包完整度、内核版本、libvirt 版本与长期支持周期会直接影响稳定性。选择时可参考下表。

发行版 虚拟化工具包 内核特点 适用场景
RHEL / Rocky / AlmaLinux qemu-kvm、libvirt、virt-install、virt-manager 长期支持,企业级补丁 生产环境、企业私有云
Ubuntu LTS / Debian qemu-system-x86、libvirt-daemon-system、virt-manager 内核较新,社区活跃 开发测试、云镜像实验
openSUSE Leap qemu、libvirt、yast2-vm 稳定,YaST 图形配置 中小规模部署
Fedora / Arch qemu、libvirt、virt-manager 内核最新,特性前沿 尝鲜、驱动验证
生产宿主机优先选择有长期支持(LTS)的发行版,并保持内核与 libvirt 版本一致;不要为了追求新特性而在生产环境使用滚动发行版。若使用云主机,需确认实例类型支持嵌套虚拟化。

四、安装 KVM/QEMU/libvirt/virt-manager

不同发行版的包名略有差异,但安装目标一致:内核模块、QEMU、libvirt 守护进程、管理工具。以下给出两类主流发行版的安装命令。

# Debian / Ubuntu
sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients \
                    bridge-utils virtinst virt-manager
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt,kvm $USER

# RHEL / Rocky / AlmaLinux
sudo dnf install -y qemu-kvm libvirt libvirt-daemon-kvm \
                    virt-install virt-manager
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $USER

安装完成后,建议启用默认 NAT 网络,使虚拟机可以访问外网:

sudo virsh net-list --all
sudo virsh net-start default
sudo virsh net-autostart default

五、安装后验证

验证要覆盖“内核能力、服务状态、管理通道、实际创建”四个层次,避免只看安装是否成功。

  1. 内核能力验证:执行 virt-host-validate,检查 CPU、内存、IOMMU、cgroup 等是否满足要求。
  2. 服务状态验证:执行 systemctl status libvirtd,确认守护进程处于 active (running)。
  3. 管理通道验证:执行 virsh list --all 与 virsh nodeinfo,确认能连接默认 URI。
  4. 实际创建验证:用 virt-install 或 virt-manager 创建一台最小虚拟机,确认能启动并进入安装界面。
# 综合验证示例
virt-host-validate
virsh version
virsh nodeinfo
virsh net-list --all
virsh list --all

# 快速创建一台测试虚拟机(需准备 ISO)
virt-install --name test-vm --memory 2048 --vcpus 2 \
  --disk size=20 --cdrom /var/lib/libvirt/images/CentOS.iso \
  --network network=default --graphics spice

六、常见误区与复盘

  • 只装 virt-manager 就以为装好了 KVM:virt-manager 只是前端,缺少 libvirtd 或 /dev/kvm 时无法创建虚拟机。
  • 忽略用户组权限:未加入 libvirt 或 kvm 组时,普通用户无法连接 qemu:///system,只能使用会话模式。
  • BIOS 未开启虚拟化:安装全部成功但 virsh capabilities 中 domain 类型缺失 kvm,实际退化为纯 QEMU 模拟,性能极低。
  • 嵌套虚拟化未透传:在云主机或 VMware 中搭建 KVM,需在宿主层开启嵌套虚拟化,否则 /dev/kvm 不存在。
  • 默认网络未启动:虚拟机创建后无网络,通常是 default 网络未 start 或未 autostart。
环境搭建的验收标准可以概括为一句话:lscpu 有 vmx/svm、lsmod 有 kvm、/dev/kvm 存在、libvirtd 运行、virsh list 可执行、能成功创建并启动一台虚拟机。六项全部通过,才说明 KVM 宿主机真正可用。