关于操作系统虚拟化,我们在之前的文章中已有多次介绍。相关内容请参考:
无论是商业化成熟度极高的 VMware,还是面向桌面场景的开源工具 VirtualBox,无论运行在 Windows 还是 macOS 平台,它们都有一个共同特点:提供友好的图形化管理界面,易于上手使用。
而在 Linux 生态中,还有一款地位举足轻重、可与 VMware 同台对比的虚拟化方案 ——KVM。它作为 Linux 内核原生的虚拟化模块,本身并不自带图形界面,早期也多以命令行方式进行管理;但在成熟生态的支持下,如今同样拥有丰富的图形桌面工具与 Web 管理平台。
KVM(Kernel-based Virtual Machine,基于内核的虚拟机)是 Linux 内核内置的虚拟化模块,于 2007 年正式合并入 Linux 主线内核(2.6.20 版本)。它是目前全球部署最广泛的开源 Hypervisor 之一。
KVM 的核心思想很简单:把 Linux 内核本身变成一个 Hypervisor。
通过加载 kvm.ko 内核模块,Linux 内核获得了管理虚拟机的能力,并通过 /dev/kvm 字符设备接口将这一能力暴露给用户空间程序(如 QEMU)。每个虚拟机在宿主机上表现为一个普通的 Linux 进程,但实际上运行着完整独立的操作系统。
KVM 依赖现代 CPU 的硬件虚拟化扩展:
这些扩展引入了新的 CPU 运行模式:
┌─────────────────────────────────────────────────┐│ 宿主机(Host) ││ ┌──────────────────────────────────────────┐ ││ │ VMX Root Mode(特权模式) │ ││ │ Linux Kernel + KVM 模块在此运行 │ ││ └──────────────────────────────────────────┘ ││ ┌──────────────────────────────────────────┐ ││ │ VMX Non-Root Mode(非特权模式) │ ││ │ Guest OS(虚拟机操作系统)在此运行 │ ││ └──────────────────────────────────────────┘ │└─────────────────────────────────────────────────┘当 Guest OS 执行特权指令(如 I/O 操作、修改页表)时,CPU 会自动触发 VM Exit,将控制权交还给 KVM;KVM 处理完毕后执行 VM Entry 将控制权还给 Guest OS。这一切由硬件自动完成,极大降低了软件开销。
KVM 本身只负责 CPU 和内存的虚拟化,其他设备(磁盘、网卡、显卡等)的模拟则由 QEMU 完成:
┌─────────────────────────────────────────────────┐│ Guest OS ││ (认为自己在真实硬件上运行) │└──────────┬───────────────────────┬──────────────┘ │ CPU / 内存访问 │ I/O 设备访问 ▼ ▼┌──────────────────┐ ┌───────────────────────────┐│ KVM 内核模块 │ │ QEMU ││ /dev/kvm │ │ 模拟磁盘、网卡、USB 等设备 ││ 硬件加速虚拟化 │ │ 用户空间进程 │└──────────────────┘ └───────────────────────────┘ │ │ └───────────┬───────────┘ ▼ ┌───────────────────────┐ │ 物理硬件 │ │ CPU · 内存 · 存储 │ └───────────────────────┘二者合称 KVM/QEMU,是当前 Linux 虚拟化的标准组合。
KVM 使用以下技术实现内存虚拟化:
全模拟设备(如 e1000 网卡)性能较差。VirtIO 是专为虚拟化设计的半虚拟化 I/O 框架,Guest OS 知道自己在虚拟机内,使用专用驱动直接与 Hypervisor 通信:
virtio-net | |
virtio-blk | |
virtio-scsi | |
virtio-balloon | |
virtio-rng | |
virtio-gpu |
VirtIO 设备相比全模拟设备,网络和磁盘性能可提升 3~10 倍。
VFIO(Virtual Function I/O)允许将物理设备(如 GPU、NVMe SSD、RDMA 网卡)直接分配给虚拟机,绕过软件模拟层,实现接近裸机的 I/O 性能。典型应用:
SR-IOV(Single Root I/O Virtualization)允许一张物理网卡虚拟出多个 VF(Virtual Function),每个 VF 独立分配给一个虚拟机,实现硬件级的网络隔离和高性能。
KVM 支持在虚拟机内部再运行 KVM,即 L1 Guest 可以作为宿主机再启动 L2 Guest。常用于:
启用方法:
# Intel CPUecho "options kvm-intel nested=1" > /etc/modprobe.d/kvm.conf# AMD CPUecho "options kvm-amd nested=1" > /etc/modprobe.d/kvm.conf┌─────────────────────────────────────────────────┐│ 上层管理平台 ││ oVirt · Proxmox VE · OpenStack · CloudStack │├─────────────────────────────────────────────────┤│ 中层管理工具 ││ libvirt(API) · virsh · virt-manager │├─────────────────────────────────────────────────┤│ 底层运行时 ││ QEMU / KVM │├─────────────────────────────────────────────────┤│ Linux 内核 ││ kvm.ko / kvm-intel.ko │└─────────────────────────────────────────────────┘libvirt — 虚拟化管理的统一抽象层
libvirt 提供了一套与底层 Hypervisor 无关的 API,支持 KVM、Xen、VMware 等多种后端,是大多数管理工具的基础依赖。
virsh — 命令行管理工具
# 列出所有虚拟机virsh list --all# 启动虚拟机virsh start myvm# 优雅关闭virsh shutdown myvm# 强制关闭virsh destroy myvm# 查看虚拟机信息virsh dominfo myvm# 热添加 vCPUvirsh setvcpus myvm 4 --live# 创建快照virsh snapshot-create-as myvm snap1 "before upgrade"virt-install — 命令行创建虚拟机
virt-install \ --name ubuntu24 \ --ram 4096 \ --vcpus 4 \ --disk path=/var/lib/libvirt/images/ubuntu24.qcow2,size=50 \ --os-variant ubuntu24.04 \ --network bridge=virbr0,model=virtio \ --graphics vnc \ --cdrom /iso/ubuntu-24.04-server.isovirt-manager — 图形化管理界面,适合桌面环境快速创建和管理虚拟机。

Proxmox VE(PVE)— 开源企业级虚拟化(对标 VMware ESXi),KVM + WebUI + 集群 + 存储 + 备份 一体化平台。

oVirt—— 企业级开源(红帽 RHEV 开源版,对标VMware vCenter),大规模集群、HA、热迁移、存储 / 网络虚拟化。

KVM 支持多种磁盘镜像格式,最常用的是 qcow2:
qcow2 | ||
raw | ||
vmdk | ||
vhd/vhdx |
常用 qcow2 操作:
# 创建 50GB qcow2 镜像qemu-img create -f qcow2 myvm.qcow2 50G# 查看镜像信息qemu-img info myvm.qcow2# 在线扩容(先扩镜像,再扩分区)qemu-img resize myvm.qcow2 +20G# 压缩镜像qemu-img convert -O qcow2 -c myvm.qcow2 myvm-compressed.qcow2虚拟机通过宿主机 NAT 访问外网,外网无法直接访问虚拟机。适合桌面开发测试环境。
虚拟机直接接入宿主机所在的物理网络,获得独立 IP,与宿主机处于同一子网。适合服务器生产环境。
# 创建网桥(以 Ubuntu 为例)nmcli connection add type bridge ifname br0nmcli connection add type bridge-slave ifname eth0 master br0nmcli connection up bridge-br0高性能场景下,通过 MacVTap 或 SR-IOV 直接将物理网卡的虚拟功能分配给虚拟机,绕过软件网桥,大幅降低网络延迟。
# 查看支持的 CPU 型号virsh cpu-models x86_64# 推荐使用 host-passthrough(将宿主机 CPU 特性完整透传)<cpu mode='host-passthrough' check='none'/># CPU 亲和性绑定(将 vCPU 绑定到指定物理核心)virsh vcpupin myvm 0 2virsh vcpupin myvm 1 3<!-- 开启大页内存(减少 TLB Miss) --><memoryBacking> <hugepages/></memoryBacking><!-- 使用 virtio-scsi + writeback 缓存策略 --><disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='writeback' io='native'/> <target dev='vda' bus='virtio'/></disk>KVM 是主流公有云和私有云的底层支柱:
| 阿里云 ECS | |
| 腾讯云 CVM | |
| AWS EC2 | |
| OpenStack | |
| Proxmox VE | |
| oVirt |
AWS 的 Nitro Hypervisor 尤其值得关注:它是基于 KVM 深度定制的轻量 Hypervisor,将大量 I/O 虚拟化卸载到专用硬件芯片,使 EC2 实例能获得接近裸机的网络和存储性能。
# 检查 CPU 是否支持虚拟化egrep -c '(vmx|svm)' /proc/cpuinfo# 输出 > 0 表示支持# 检查 KVM 模块是否已加载lsmod | grep kvm# Ubuntu / Debiansudo apt install -y qemu-kvm libvirt-daemon-system \ virtinst virt-manager bridge-utils# CentOS / RHEL / Rocky Linuxsudo dnf install -y qemu-kvm libvirt virt-install \ virt-manager bridge-utils# 启动 libvirtd 服务sudo systemctl enable --now libvirtd# 将当前用户加入 libvirt 组sudo usermod -aG libvirt $USERvirt-install \ --name myserver \ --ram 2048 \ --vcpus 2 \ --disk path=/var/lib/libvirt/images/myserver.qcow2,size=20,format=qcow2 \ --os-variant ubuntu22.04 \ --network network=default,model=virtio \ --graphics none \ --console pty,target_type=serial \ --location /tmp/ubuntu-22.04-server.iso \ --extra-args 'console=ttyS0,115200n8'virsh list --all # 查看所有虚拟机virsh start myserver # 启动 myserver 这台虚拟机virsh console myserver # 连接控制台virsh shutdown myserver # 关机virsh snapshot-create-as myserver snap-init # 创建快照KVM 凭借其与 Linux 内核的原生集成、优秀的性能表现和丰富的开源生态,已成为企业虚拟化和云计算基础设施的首选方案。无论是搭建个人实验室、部署私有云,还是理解公有云底层机制,掌握 KVM 都是每一位 Linux 用户的必修课。
相关资源列表:
未完待续,敬请期待~
💬 欢迎在评论区留下你的真知灼见~
