QEMU 虚拟化完全指南 / 08 - libvirt 集成
08 - libvirt 集成
掌握使用 libvirt/virsh/virt-manager 管理 QEMU 虚拟机,包括 XML 定义、存储池和网络池配置。
8.1 libvirt 概述
libvirt 是一个开源的虚拟化管理工具包,提供统一的 API 来管理多种虚拟化平台,包括 QEMU/KVM、Xen、VMware 等。
libvirt 架构:
┌─────────────────────────────────────────────────┐
│ 用户工具 │
│ virsh · virt-manager · virt-install · oVirt │
├─────────────────────────────────────────────────┤
│ libvirt API (C/Python/Go/Ruby/Java) │
├─────────────────────────────────────────────────┤
│ libvirtd (守护进程) │
├─────────────────────────────────────────────────┤
│ QEMU driver │ Xen driver │ LXC driver │ ... │
├─────────────────────────────────────────────────┤
│ QEMU/KVM · Xen · LXC · 其他 Hypervisor │
└─────────────────────────────────────────────────┘
libvirt 核心功能
| 功能 | 说明 |
|---|---|
| 虚拟机管理 | 创建、启动、停止、删除、迁移虚拟机 |
| 存储管理 | 存储池、卷管理、磁盘镜像管理 |
| 网络管理 | 虚拟网络、桥接、NAT、路由 |
| 快照管理 | 内部快照、外部快照 |
| 设备管理 | 热插拔 CPU、内存、磁盘、网卡 |
| 安全管理 | SELinux、AppArmor、cgroup 资源限制 |
| 远程管理 | 通过 SSH/TLS 远程管理虚拟机 |
8.2 安装与配置 libvirt
# Debian/Ubuntu
sudo apt install -y libvirt-daemon-system libvirt-clients virt-manager
# Fedora/RHEL
sudo dnf install -y libvirt virt-install virt-manager
# Arch Linux
sudo pacman -S libvirt virt-install virt-manager
# 启动并启用 libvirtd
sudo systemctl enable --now libvirtd
# 将用户加入 libvirt 组
sudo usermod -aG libvirt $(whoami)
newgrp libvirt
# 验证安装
virsh version
virsh nodeinfo
连接到 libvirt
# 本地连接(系统级,需要 root)
virsh connect qemu:///system
# 本地连接(用户级)
virsh connect qemu:///session
# 远程连接(SSH)
virsh connect qemu+ssh://root@remote-host/system
# 远程连接(TLS)
virsh connect qemu+tls://remote-host/system
8.3 virsh 命令大全
虚拟机生命周期管理
# 列出所有虚拟机
virsh list --all
# 定义虚拟机(从 XML)
virsh define vm.xml
# 创建并启动(一次性)
virsh create vm.xml
# 启动
virsh start ubuntu-vm
# 关机(优雅关机)
virsh shutdown ubuntu-vm
# 强制关机
virsh destroy ubuntu-vm
# 暂停/恢复
virsh suspend ubuntu-vm
virsh resume ubuntu-vm
# 重启
virsh reboot ubuntu-vm
# 重命名
virsh domrename ubuntu-vm new-name
# 删除虚拟机
virsh undefine ubuntu-vm
virsh undefine ubuntu-vm --remove-all-storage # 同时删除磁盘
虚拟机信息查看
# 虚拟机信息
virsh dominfo ubuntu-vm
# CPU 信息
virsh vcpuinfo ubuntu-vm
# 内存信息
virsh dommemstat ubuntu-vm
# 网络信息
virsh domifaddr ubuntu-vm
# 块设备信息
virsh domblklist ubuntu-vm
# 查看 XML 定义
virsh dumpxml ubuntu-vm
# 查看运行状态
virsh domstate ubuntu-vm
# 查看控制台
virsh console ubuntu-vm
# 截图
virsh screenshot ubuntu-vm /tmp/vm-screenshot.ppm
动态资源调整
# 调整内存(运行中)
virsh setmem ubuntu-vm 8G --config # 下次启动生效
virsh setmem ubuntu-vm 8G --live # 立即生效
# 调整 CPU 数量(运行中)
virsh setvcpus ubuntu-vm 8 --config --maximum
virsh setvcpus ubuntu-vm 8 --live
# 添加 CPU(热插拔)
virsh setvcpus ubuntu-vm 4 --live --config
# 调整 CPU 权重
virsh schedinfo ubuntu-vm cpu_shares=2048
网络管理
# 列出所有虚拟网络
virsh net-list --all
# 启动/停止网络
virsh net-start default
virsh net-destroy default
# 自动启动网络
virsh net-autostart default
# 查看网络信息
virsh net-info default
virsh net-dumpxml default
# 查看网络中的 DHCP 租约
virsh net-dhcp-leases default
存储管理
# 列出存储池
virsh pool-list --all
# 启动/停止存储池
virsh pool-start default
virsh pool-destroy default
# 列出存储卷
virsh vol-list default
# 创建存储卷
virsh vol-create-as default new-disk.qcow2 40G --format qcow2
# 删除存储卷
virsh vol-delete default new-disk.qcow2
# 克隆存储卷
virsh vol-clone default/base.qcow2 default/clone.qcow2
快照管理
# 创建快照
virsh snapshot-create-as ubuntu-vm snap1 --description "Before update"
# 列出快照
virsh snapshot-list ubuntu-vm
# 查看快照信息
virsh snapshot-info ubuntu-vm snap1
# 恢复快照
virsh snapshot-revert ubuntu-vm snap1
# 删除快照
virsh snapshot-delete ubuntu-vm snap1
8.4 XML 虚拟机定义
基本 XML 结构
<domain type='kvm'>
<name>ubuntu-vm</name>
<uuid>550e8400-e29b-41d4-a716-446655440000</uuid>
<metadata/>
<memory unit='GiB'>4</memory>
<currentMemory unit='GiB'>4</currentMemory>
<vcpu placement='static'>4</vcpu>
<os>
<type arch='x86_64' machine='q35'>hvm</type>
<boot dev='hd'/>
<boot dev='cdrom'/>
</os>
<features>
<acpi/>
<apic/>
<vmport state='off'/>
</features>
<cpu mode='host-passthrough' check='none'/>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback' io='io_uring'/>
<source file='/var/lib/libvirt/images/ubuntu-vm.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='network'>
<mac address='52:54:00:12:34:56'/>
<source network='default'/>
<model type='virtio'/>
</interface>
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'/>
<console type='pty'/>
</devices>
</domain>
常用 XML 元素
| 元素 | 说明 | 示例 |
|---|---|---|
<name> | 虚拟机名称 | <name>vm1</name> |
<memory> | 最大内存 | <memory unit='GiB'>4</memory> |
<vcpu> | CPU 数量 | <vcpu>4</vcpu> |
<cpu> | CPU 模式 | <cpu mode='host-passthrough'/> |
<disk> | 磁盘设备 | 见下方 |
<interface> | 网卡设备 | 见下方 |
<graphics> | 显示设备 | <graphics type='vnc'/> |
<console> | 串口控制台 | <console type='pty'/> |
磁盘定义
<!-- qcow2 磁盘 -->
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback' io='io_uring'/>
<source file='/var/lib/libvirt/images/disk.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<!-- CDROM -->
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/path/to/install.iso'/>
<target dev='sda' bus='sata'/>
<readonly/>
</disk>
<!-- 共享磁盘(多虚拟机使用) -->
<disk type='block' device='disk'>
<driver name='qemu' type='raw'/>
<source dev='/dev/sdb'/>
<target dev='vdb' bus='virtio'/>
<shareable/>
</disk>
网络定义
<!-- NAT 网络 -->
<interface type='network'>
<mac address='52:54:00:12:34:56'/>
<source network='default'/>
<model type='virtio'/>
</interface>
<!-- 桥接网络 -->
<interface type='bridge'>
<mac address='52:54:00:12:34:57'/>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
<!-- 直通网卡 -->
<interface type='direct'>
<source dev='enp0s3' mode='bridge'/>
<model type='virtio'/>
</interface>
8.5 virt-manager 图形管理
安装 virt-manager
# 安装
sudo apt install virt-manager # Debian/Ubuntu
sudo dnf install virt-manager # Fedora
# 启动
virt-manager
virt-manager 核心功能
| 功能 | 说明 |
|---|---|
| 创建虚拟机 | 向导式创建,支持 ISO/PXE/导入 |
| 远程管理 | 支持 SSH/TLS 远程连接 |
| 性能监控 | CPU、内存、网络、磁盘实时监控 |
| 快照管理 | 创建、恢复、删除快照 |
| 控制台 | VNC/SPICE 图形控制台 |
| 资源调整 | 动态调整 CPU、内存 |
| 设备管理 | 热插拔设备 |
8.6 virt-install 快速创建
# 基本创建
virt-install \
--name ubuntu-vm \
--ram 4096 \
--vcpus 4 \
--disk size=40 \
--os-variant ubuntu22.04 \
--network network=default \
--graphics vnc \
--cdrom /path/to/ubuntu-22.04.iso
# 使用桥接网络
virt-install \
--name centos-vm \
--ram 8192 \
--vcpus 8 \
--disk size=100,bus=virtio \
--os-variant centos-stream9 \
--network bridge=br0,model=virtio \
--graphics spice,listen=0.0.0.0 \
--cdrom /path/to/CentOS-Stream.iso \
--boot uefi
# 使用现有磁盘
virt-install \
--name existing-vm \
--ram 4096 \
--vcpus 4 \
--disk /var/lib/libvirt/images/vm.qcow2,format=qcow2 \
--os-variant generic \
--import
# 使用 cloud-init
virt-install \
--name cloud-vm \
--ram 2048 \
--vcpus 2 \
--disk size=20 \
--os-variant ubuntu22.04 \
--cloud-init root-password-generate=on \
--network network=default
8.7 存储池管理
存储池类型
| 类型 | 说明 | 用途 |
|---|---|---|
| dir | 本地目录 | 通用 |
| fs | 文件系统 | LVM/VG |
| netfs | 网络文件系统 | NFS |
| iscsi | iSCSI 目标 | SAN |
| logical | LVM 卷组 | 高性能 |
| disk | 物理磁盘 | 直通 |
| rbd | Ceph RBD | 分布式存储 |
| gluster | GlusterFS | 分布式存储 |
创建目录存储池
# 定义存储池
virsh pool-define-as default dir \
--target /var/lib/libvirt/images
# 构建(创建目录)
virsh pool-build default
# 启动
virsh pool-start default
# 自动启动
virsh pool-autostart default
# 查看
virsh pool-info default
创建 NFS 存储池
# 定义 NFS 存储池
virsh pool-define-as nfs-pool netfs \
--source-host nfs-server \
--source-path /exports/vms \
--target /mnt/nfs-vms
virsh pool-build nfs-pool
virsh pool-start nfs-pool
virsh pool-autostart nfs-pool
使用 XML 定义存储池
<!-- 目录存储池 -->
<pool type='dir'>
<name>vm-pool</name>
<target>
<path>/var/lib/libvirt/images</path>
<permissions>
<mode>0755</mode>
<owner>107</owner> <!-- libvirt-qemu -->
<group>107</group>
</permissions>
</target>
</pool>
<!-- NFS 存储池 -->
<pool type='netfs'>
<name>nfs-pool</name>
<source>
<host name='nfs-server'/>
<dir path='/exports/vms'/>
</source>
<target>
<path>/mnt/nfs-vms</path>
</target>
</pool>
8.8 网络池管理
默认 NAT 网络
# 查看默认网络
virsh net-dumpxml default
# 输出示例
# <network>
# <name>default</name>
# <forward mode='nat'/>
# <bridge name='virbr0'/>
# <ip address='192.168.122.1' netmask='255.255.255.0'>
# <dhcp>
# <range start='192.168.122.2' end='192.168.122.254'/>
# </dhcp>
# </ip>
# </network>
创建自定义桥接网络
<bridge-network>
<network>
<name>br0-network</name>
<forward mode='bridge'/>
<bridge name='br0'/>
</network>
</bridge-network>
virsh net-define bridge-network.xml
virsh net-start br0-network
virsh net-autostart br0-network
创建隔离网络
<network>
<name>isolated</name>
<bridge name='virbr1'/>
<ip address='10.10.10.1' netmask='255.255.255.0'>
<dhcp>
<range start='10.10.10.2' end='10.10.10.254'/>
</dhcp>
</ip>
</network>
8.9 备份与导出
导出虚拟机定义
# 导出 XML 定义
virsh dumpxml ubuntu-vm > ubuntu-vm.xml
# 导出为可移植格式(去除 UUID 和 MAC)
virsh dumpxml ubuntu-vm | sed -e '/<uuid>/d' -e '/<mac address/d' > ubuntu-vm-portable.xml
克隆虚拟机
# 使用 virt-clone
virt-clone \
--original ubuntu-vm \
--name ubuntu-vm-clone \
--auto-clone
# 克隆并指定新磁盘路径
virt-clone \
--original ubuntu-vm \
--name ubuntu-vm-clone \
--file /var/lib/libvirt/images/clone.qcow2
要点回顾
| 要点 | 核心内容 |
|---|---|
| libvirt | 统一的虚拟化管理 API 和守护进程 |
| virsh | 命令行管理工具,功能最全面 |
| virt-manager | 图形化管理界面 |
| virt-install | 快速创建虚拟机的命令行工具 |
| XML 定义 | 声明式虚拟机配置,可版本控制 |
| 存储池/网络池 | 统一管理存储和网络资源 |
注意事项
权限管理:
qemu:///system需要 root 或 libvirt 组权限,qemu:///session不需要 root 但功能有限。
XML 版本控制: 将虚拟机 XML 定义纳入 Git 版本控制,便于追踪配置变更和灾难恢复。
SELinux/AppArmor: libvirt 与 SELinux/AppArmor 集成,自定义存储路径可能需要设置正确的安全上下文。
扩展阅读
下一步
→ 09 - QEMU Guest Agent:学习在虚拟机内部安装和使用 Guest Agent,实现自动化运维。