强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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
iscsiiSCSI 目标SAN
logicalLVM 卷组高性能
disk物理磁盘直通
rbdCeph RBD分布式存储
glusterGlusterFS分布式存储

创建目录存储池

# 定义存储池
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,实现自动化运维。