第4章:KVM虚拟化入门:KVM架构概览、KVM内核模块加载、QEMU与KVM的关系、创建第一个虚拟机

4.1 先聊聊KVM到底是什么

KVM,全称Kernel-based Virtual Machine。说白了,它就是Linux内核里的一个模块。

我刚开始接触虚拟化时,总以为KVM是个独立的软件。后来才明白,它其实是把Linux内核变成了一个“超级管理程序”(Hypervisor)。你想想看,这设计多巧妙——不用额外装一个系统,直接用Linux内核来管虚拟机。

KVM的核心思想很简单:让CPU硬件帮你做虚拟化。Intel的VT-x和AMD的AMD-V技术,就是专门干这个的。KVM把这些硬件能力暴露出来,让虚拟机里的指令能直接跑在物理CPU上。

关键点:KVM只负责CPU和内存的虚拟化。I/O设备(网卡、磁盘等)的模拟,它不管。那谁管?QEMU。

4.2 KVM架构概览

KVM的架构其实不复杂。我画个图给你看,你就明白了。

KVM虚拟化架构图 物理硬件(CPU with VT-x/AMD-V, 内存, 设备) Linux 内核 KVM 内核模块 (kvm.ko) kvm-intel.ko / kvm-amd.ko 用户空间 QEMU 进程 (模拟I/O设备) 通过 /dev/kvm 与内核交互 虚拟机 1 Guest OS vCPU + 内存 虚拟机 2 Guest OS vCPU + 内存

从这张图你能看到,KVM分三层:

  • 硬件层:CPU必须支持虚拟化扩展(VT-x或AMD-V)
  • 内核层:KVM模块加载后,Linux内核就变成了Hypervisor
  • 用户空间层:QEMU进程负责创建和管理虚拟机

嗯,这里要注意:KVM本身不模拟任何设备。它只负责让虚拟机里的指令能直接跑在CPU上。那虚拟机怎么访问磁盘、网卡?全靠QEMU在用户空间模拟。

4.3 KVM内核模块加载

加载KVM模块,其实就两条命令的事。但我建议你先检查一下CPU支不支持虚拟化。

# 检查CPU是否支持虚拟化
grep -E "(vmx|svm)" /proc/cpuinfo

# 如果输出中有vmx(Intel)或svm(AMD),说明支持

我遇到过好几次,有人一上来就装KVM,结果发现CPU不支持。白忙活一场。所以第一步,先检查。

确认支持后,加载模块:

# 加载KVM核心模块
modprobe kvm

# 根据CPU类型加载对应模块
# Intel CPU:
modprobe kvm_intel

# AMD CPU:
modprobe kvm_amd

# 验证模块是否加载成功
lsmod | grep kvm

小技巧:你可以把modprobe命令加到/etc/modules-load.d/kvm.conf里,这样系统启动时自动加载。我个人习惯这么做,省得每次重启都要手动敲一遍。

加载成功后,你会看到/dev/kvm这个设备文件。这是QEMU和KVM内核模块通信的桥梁。

# 检查/dev/kvm是否存在
ls -l /dev/kvm

4.4 QEMU与KVM的关系

很多人搞不清QEMU和KVM的关系。我打个比方你就懂了。

KVM是引擎,QEMU是方向盘和仪表盘。

KVM负责让虚拟机里的代码直接跑在物理CPU上——这是核心性能来源。但KVM不负责模拟网卡、磁盘、USB这些设备。这些脏活累活,全交给QEMU。

QEMU本身是个全功能模拟器,可以纯软件模拟整个计算机。但那样性能太差。所以QEMU+KVM的组合,就是:

  • CPU和内存的虚拟化 → 交给KVM(硬件加速)
  • I/O设备的模拟 → 交给QEMU(软件模拟)

我曾经在一个项目中,只用了QEMU纯软件模拟跑Windows XP,那速度慢得让人抓狂。后来加上KVM加速,性能直接翻了好几倍。嗯,从那以后我再也不敢只用纯软件模拟了。

一句话总结:QEMU提供管理接口和设备模拟,KVM提供硬件加速。两者缺一不可。

4.5 创建第一个虚拟机

好,理论说完了。咱们动手创建一个虚拟机。我选Ubuntu Server做演示,因为它的镜像好找,配置也简单。

4.5.1 安装必要软件

# Ubuntu/Debian系统
apt update
apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager

# CentOS/RHEL系统
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install

安装完后,把当前用户加到libvirt组里,不然没权限管理虚拟机。

usermod -aG libvirt $USER
# 重新登录使组生效

4.5.2 下载系统镜像

# 下载Ubuntu Server LTS镜像
wget https://releases.ubuntu.com/22.04/ubuntu-22.04-live-server-amd64.iso

# 创建磁盘镜像(20GB大小)
qemu-img create -f qcow2 ubuntu-vm.qcow2 20G

注意:qcow2格式支持写时复制(Copy-on-Write),比raw格式省空间。我建议你一直用qcow2,除非有特殊性能要求。

4.5.3 启动虚拟机安装

virt-install \
  --name ubuntu-vm \
  --ram 2048 \
  --vcpus 2 \
  --disk path=ubuntu-vm.qcow2,format=qcow2 \
  --cdrom ubuntu-22.04-live-server-amd64.iso \
  --os-variant ubuntu22.04 \
  --network bridge=virbr0 \
  --graphics vnc,listen=0.0.0.0 \
  --console pty,target_type=serial

这条命令的参数,我解释一下:

参数 说明
--name 虚拟机名字,后面管理时用
--ram 分配的内存大小(MB)
--vcpus 虚拟CPU核心数
--disk 磁盘镜像路径和格式
--cdrom 安装ISO镜像路径
--os-variant 操作系统类型,优化性能用的
--network 网络类型,virbr0是默认NAT网络
--graphics VNC远程桌面,0.0.0.0表示允许任何IP连接

执行后,你会看到VNC连接信息。用VNC客户端连上去,就能看到Ubuntu的安装界面了。

4.5.4 管理虚拟机

安装完成后,虚拟机管理就简单了:

# 查看所有虚拟机
virsh list --all

# 启动虚拟机
virsh start ubuntu-vm

# 关闭虚拟机
virsh shutdown ubuntu-vm

# 强制关机
virsh destroy ubuntu-vm

# 删除虚拟机(不删磁盘文件)
virsh undefine ubuntu-vm

避坑指南:我曾经用virsh destroy强制关机后,虚拟机里的文件系统损坏了。所以尽量用shutdown正常关机,除非虚拟机卡死了。

4.6 验证KVM是否生效

虚拟机跑起来后,怎么确认它真的用了KVM加速?

# 在宿主机上查看
virsh capabilities | grep kvm

# 或者在虚拟机里查看CPU信息
# 如果看到类似"Intel Core Processor"而不是"QEMU Virtual CPU",说明KVM生效了

还有一个更直接的方法:看性能。跑个CPU密集型的任务,如果速度跟物理机差不多,那KVM肯定在工作。如果慢得像蜗牛,那可能是纯软件模拟模式。

好了,第一个虚拟机已经创建成功。你想想看,从检查CPU到加载模块,再到用virt-install创建虚拟机,整个过程其实就十几分钟的事。KVM的魅力就在于——它把虚拟化变成了Linux系统管理的一部分,而不是一个独立的神秘技术。

后面我们会深入每个细节,比如网络配置、存储优化、性能调优。但今天,先享受一下成功创建第一个虚拟机的成就感吧。

核心要点回顾:

  • KVM是Linux内核模块,把内核变成Hypervisor
  • KVM只负责CPU/内存虚拟化,I/O设备由QEMU模拟
  • 加载模块:modprobe kvm + modprobe kvm_intel/kvm_amd
  • 创建虚拟机:virt-install命令一步到位
  • 管理虚拟机:virsh系列命令

公众号:蓝海资料掘金营,微信deep3321