第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必须支持虚拟化扩展(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