技术文章2026 年 4 月 2 日约 2.8 分钟

KVM 虚拟化入门:libvirt 与虚拟机生命周期

从 KVM、QEMU 和 libvirt 的关系入手,掌握虚拟机创建、查看、启动和销毁流程。

KVM、QEMU、libvirt 这三个词经常被混着用,但它们各管一段:KVM 是内核模块,提供 CPU 虚拟化能力;QEMU 是用户态程序,模拟设备、执行 IO;libvirt 是管理框架,把前两者封装成统一 API。这篇文章按这个分层,讲从零建一台虚拟机的完整过程。

#三者的关系

  • KVM(kvm_intel / kvm_amd):让 CPU 直接跑虚拟化指令,虚拟机里的大多数指令不经翻译直接执行,这是性能的根基。没有 KVM 的 QEMU 只能纯软件模拟(TCG),慢到没法用。
  • QEMU:模拟内存、磁盘、网卡等设备,负责 IO 路径。
  • libvirt:管理层。virsh、virt-manager、OpenStack 的 Nova 都通过它操作虚拟机。它把「定义、启动、停止、迁移」封装成一套稳定 API。

装好之后先验证 KVM 真的可用:

bash
grep -E -c '(vmx|svm)' /proc/cpuinfo    # 非 0 说明 CPU 支持虚拟化
ls -l /dev/kvm                          # 存在说明 KVM 模块已加载
sudo systemctl enable --now libvirtd
virsh version

常见问题:ls /dev/kvm 不存在,多半是 BIOS 里没开 VT-x/AMD-V,或者云主机没透传虚拟化(很多便宜 VPS 的 CPU 不带 vmx 标志)。

#用 virt-install 建第一台虚拟机

手写 XML 容易错,virt-install 是官方推荐的命令式建机方式:

bash
sudo virt-install \
  --name web01 \
  --memory 4096 --vcpus 4 \
  --disk path=/var/lib/libvirt/images/web01.qcow2,size=40,format=qcow2,bus=virtio \
  --os-variant rhel9 \
  --network network=default,model=virtio \
  --graphics none --location /data/iso/rhel-9.iso \
  --extra-args 'console=ttyS0'

关键参数的实际含义:

  • --disk ... size=40:创建一个 40G 的 qcow2 文件,是稀疏文件,初始只占几百 KB,用多少占多少。
  • --network network=default:接 libvirt 默认的 NAT 网络(虚拟机能上网,但外部访问不到它)。生产一般用 bridge 或 macvtap,下一篇细讲。
  • --graphics none:无图形界面,通过串口安装——服务器上装系统这是标准姿势,别指望 VNC。

#虚拟机生命周期:定义、启动、关机、销毁

bash
virsh list --all                    # 所有虚拟机(含关机)
virsh list --autostart              # 开机自启的
virsh start web01
virsh console web01                 # 连串口
virsh shutdown web01                # 发 ACPI 关机信号(优雅)
virsh destroy web01                 # 强制断电(慎用)
virsh undefine web01                # 删除定义(不删磁盘文件!)

几个容易混淆的点:

  • shutdown 是 ACPI 关机,虚拟机里装了 acpid 才会响应;没响应就只能 destroy,所以模板机一定要装 acpid 和 qemu-guest-agent。
  • undefine 只删定义不删磁盘,--remove-all-storage 才会连磁盘一起删。删之前先 virsh dumpxml web01 备份配置,这个 XML 是虚拟机唯一的「出生证明」。

#查看和调优

bash
virsh dominfo web01                  # 配置总览
virsh vcpuinfo web01                 # vCPU 拓扑
virsh domstats web01                 # CPU/内存/IO 统计
virsh setvcpus web01 8 --live --config   # 在线加 vCPU(需驱动支持)

在线调整有前提:virtio 驱动、CPU 热插拔配置等,不是所有机器都能加。生产变更前先查文档,别在业务机器上试。

#经验

我踩过最典型的坑是忘记 --os-variant:默认按最保守的配置走,导致网卡用 e1000 而不是 virtio,性能差 3-5 倍。装完 virsh dumpxml 看一眼 <driver name='qemu' type='virtio'/> 和 <model type='virtio'/>,确认走的是半虚拟化路径。

另外,备份永远是 virsh dumpxml + 磁盘文件,缺一不可。只备份 qcow2 没有 XML,恢复时设备配置全靠猜;只备份 XML 没有盘,等于什么都没存。

写于 2026 年 4 月 2 日

栏目
技术文章
约
2.8 分钟
字数
2K
阅读
177

本文为原创记录,转载请注明出处。如果这篇替你省了时间,欢迎留言说说你踩到的坑。

同题 · related

留言 · remarks

00 条

还没有留言,来说点什么吧。

KVM 虚拟化入门:libvirt 与虚拟机生命周期 · LXH·BLOG