OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 138

virt-manager 创建、硬件面板与远程控制

将 GUI 创建向导、设备设置和远程显示对应到实际 domain 配置与认证条件。

所在专题KVM 宿主与管理基础 ↗
约 43 分钟阅读开始阅读

命令与 XML 使用通用示例,需按宿主版本和实际资源调整。网络地址采用文档地址段,实际部署应选择不冲突的私网;镜像修改与设备直通的适用条件见对应章节。

virt-manager(Virtual Machine Manager)是 libvirt 生态中最成熟的图形化管理工具,用 Python 编写,基于 GTK(以安装版本的依赖为准) 构建。它提供了一套完整的 GUI 来创建、配置、监控和管理 KVM/QEMU 虚拟机,同时也支持远程连接管理 Xen、LXC 等 hypervisor。

virt-manager 与 libvirt 的关系 virt-manager 是一个客户端(client),它通过 libvirt API 与 libvirtd 守护进程通信。无论操作的是本地还是远程 hypervisor,底层都经过 libvirt → libvirtd → QEMU/KVM 这条调用链。理解这一点有助于排查连接故障。


1. virt-manager 界面全景#

1.1 主窗口布局

启动 virt-manager 后,主窗口分为三个核心区域:

区域 内容 说明
左侧连接列表 QEMU/KVM (localhost)、自定义远程连接 每个连接对应一个 libvirtd 实例
右侧 VM 列表 名称、状态(Running/Shutoff)、CPU 使用率柱状图、内存占用 双击可打开控制台
底部统计栏 总 VM 数、运行数、主机 CPU/内存总体占用 快速掌握宿主机负载

菜单栏功能:

  • File:新建 VM(Ctrl+N)、添加连接、关闭连接、退出
  • Edit:Preferences(控制台缩放模式、统计轮询间隔)、Connection Details(主机详情窗口)
  • View:控制台缩放(Always/VNC console only/Never)、性能图类型(CPU usage / Memory usage / Disk I/O / Network I/O)

1.2 Connection Details 窗口

双击连接名称或通过 Edit 菜单打开 Connection Details,这是管理宿主机资源的核心面板:

标签页 功能
Overview 宿主机 CPU 型号/核心数、总内存、架构(x86_64)、libvirt 版本、libvirtd 连接 URI
Virtual Networks 管理虚拟网络(默认 default 为 NAT 模式,子网 192.0.2.0/24)、创建/删除/启停网络
Storage 管理存储池(默认 default 位于 /var/lib/libvirt/images/)、创建卷(volume)、查看磁盘使用量
Network Interfaces 查看宿主机物理网卡(eth0、wlan0 等)及桥接信息

1.3 整体架构

graph TD
    subgraph "用户层"
        A[virt-manager GUI]
        B[virsh CLI]
        C[virt-viewer]
    end

    subgraph "API 层"
        D[libvirt API - libvirt.so]
    end

    subgraph "守护进程层"
        E[libvirtd]
        F[virtlogd]
        G[virtlockd]
    end

    subgraph "虚拟化层"
        H[QEMU/KVM]
        I[QEMU Emulator]
    end

    subgraph "内核层"
        J[kvm.ko]
        K[vhost-net / vhost-scsi]
    end

    subgraph "虚拟机"
        L[Guest VM]
    end

    A --> D
    B --> D
    C --> D
    D --> E
    E --> F
    E --> G
    E --> H
    H --> I
    H --> J
    H --> K
    J --> L
    K --> L

关键理解 virt-manager 不直接与 QEMU 通信。所有操作走 virt-manager → libvirt API → libvirtd → QEMU/KVM,这也是为什么 sudo systemctl status libvirtd 是排查问题的第一步。


2. 虚拟机创建向导#

从菜单 File → New Virtual Machine(或工具栏 + 按钮)进入向导。

2.1 Step 1: 安装源选择

安装方式 说明 适用场景
Local install media (ISO image) 浏览宿主机文件系统中的 ISO 文件 最常见方式,ISO 已下载到本地
Network Install (HTTP/FTP/NFS) 输入安装树的 URL 企业批量部署、无需下载完整 ISO
Network Boot (PXE) 无安装介质,从网络引导 机房批量装机
Import existing disk image 直接导入已有 qcow2/raw 磁盘 迁移 VM、使用预配置镜像

架构选项(Architecture options):

  • x86_64:标准 PC 架构,包含 q35 和 i440fx 两种机器类型(machine type)
  • aarch64:ARM 64 位架构(如树莓派、鲲鹏服务器)
  • 其他架构取决于系统安装的 qemu-system-* 包

2.2 Step 2: OS 检测与变体选择

virt-manager 会自动读取 ISO 元数据来检测操作系统。检测成功后,自动填入 OS variant。

手动选择的优势:

  • virt-manager 会根据 OS 变体自动优化默认配置(如磁盘总线选择 virtio 还是 IDE、NIC 型号等)
  • 不同变体有不同的默认值:
    • ubuntu24.04 → 默认 virtio 磁盘 + virtio 网卡 + QXL 显卡
    • win11 → 默认 Q35 芯片组 + UEFI + TPM 2.0 + Secure Boot
    • generic → 保守默认值(IDE 磁盘 + rtl8139 网卡),性能最差

务必选择正确的 OS variant 选择 Generic 或不选择 variant 会导致 virt-manager 使用最保守(同时也是需实测延迟)的默认硬件配置。安装 Linux 发行版时至少选择对应的 Linux 系列 variant。

搜索框支持模糊匹配:ubuntu、win11、rhel9、debian12。

2.3 Step 3: CPU 和内存

vCPU 分配

  • 默认值为 1,推荐设置为宿主物理核心数的 1/2 到等额
  • 拓扑覆盖(Topology):可手动设置 sockets / cores / threads per socket
    • 总 vCPU = sockets x cores x threads
    • 对于需要按 socket 授权的软件(如某些数据库),正确的拓扑尤为重要

内存分配

  • 支持滑块拖动或直接输入数值,单位可选 MiB 或 GiB
  • Current allocation:VM 启动时立即分配的内存量
  • Max allocation:热插拔上限(需要 guest 支持 memory hotplug)

各 OS 推荐配置参考

操作系统 最低 vCPU 推荐 vCPU 最低 RAM 推荐 RAM
Ubuntu Server (无 GUI) 1 2 512 MiB 2 GiB
Ubuntu Desktop 2 4 2 GiB 4 GiB
Arch Linux (CLI) 1 2 512 MiB 1 GiB
Windows 10 2 4 2 GiB 4 GiB
Windows 11 2 4 4 GiB 8 GiB
Alpine Linux 1 1 128 MiB 256 MiB

2.4 Step 4: 存储配置

创建新磁盘

  • 大小:输入所需磁盘容量(GiB)
  • Format:强烈推荐 qcow2(QEMU Copy-On-Write v2)
  • 分配策略:
    • Thin provisioned(qcow2 默认):空间按需增长,不立即占用全部容量
    • Thick provisioned:立即分配全部空间,适合对 IO 延迟敏感的场景

选择已有磁盘

从存储池中浏览已有卷(volume),支持直接导入 .qcow2、.raw、.img 等格式。

磁盘格式对比

特性 qcow2 raw qed
精简置备(Thin) 是 否 是
快照支持 内部快照(默认) 需要外部快照 支持
压缩 zlib/zstd 压缩 不支持 支持
加密 QEMU 原生加密(qcow2) 依赖 LUKS 支持
性能 轻微开销(可忽略) 最高(裸盘) 中等
后备文件(Backing file) 支持(模板链) 不支持 支持
推荐场景 通用、开发、测试 生产数据库、IO 敏感 实验(已被 qcow2 替代)

缓存模式(Cache Mode)

模式 宿主机页缓存 客机写缓存 数据安全 性能 说明
Hypervisor default libvirt 决定 libvirt 决定 — — 跟随 libvirt 版本默认值(通常为 writeback)
writeback 启用 启用 中等 高 写入先到宿主机页缓存,再异步刷盘
writethrough 启用 禁用 高 中 每次写入都等待磁盘确认
none 禁用 (O_DIRECT) 启用 中等 高 绕过宿主机页缓存,客机写缓存启用
directsync 禁用 (O_DIRECT) 禁用 最高 低 同步写策略;仍依赖实际存储保证但需实测延迟
unsafe 启用 忽略 最低 最高 忽略所有 flush 请求,宿主机崩溃可能丢数据

unsafe 模式的危险 unsafe 模式忽略来自 guest 的所有磁盘刷新请求。这在安装/初始化阶段可大幅加速,但在生产环境中,宿主机意外断电将导致不可恢复的数据损坏。仅用于临时测试或 CI 流水线中的一次性 VM。

2.5 Step 5: 最终确认

网络选择

网络类型 libvirt 名称 说明
NAT default (virbr0) 客机通过宿主机 NAT 上网,客机间互通,与外部隔离
Bridge br0 客机直接接入宿主机物理网络,获得局域网独立 IP
Macvtap macvtap 客机共享宿主机物理网卡,适合不需要客机间通信的场景
Isolated 无上行链路 仅客机间通信,完全隔离

NAT vs Bridge 选择建议 开发/测试用 NAT 就够了。需要从局域网其他机器访问 VM(如搭建 Web 服务器),选 Bridge 模式。

自定义配置

勾选 Customize configuration before install 会在首次启动前打开完整的硬件配置面板,这在需要调整以下内容时非常关键:

  • 修改 UEFI/BIOS 固件类型
  • 添加 TPM(Windows 11 必需)
  • 调整磁盘总线为 virtio(提升性能)
  • 添加额外网卡或磁盘

虚拟化类型

  • kvm:硬件加速虚拟化,利用 CPU 的 VT-x/AMD-V 扩展,性能接近裸机
  • qemu:纯软件模拟(TCG),极慢,仅用于无硬件虚拟化支持的场景或跨架构模拟

可以通过以下命令确认 KVM 可用:

# 检查 KVM 模块是否加载
lsmod | grep kvm
# 输出示例:
# kvm_amd              155648  0
# kvm                  1089536  1 kvm_amd

# 检查 /dev/kvm 设备权限
ls -la /dev/kvm
# crw-rw---- 1 root kvm 10, 232 ...

# 将当前用户加入 kvm 组
sudo usermod -aG kvm $USER

固件类型

固件 说明 适用场景
BIOS (SeaBIOS) 传统 BIOS,最兼容 Linux、Windows 10 及更早版本
UEFI (OVMF) 现代 UEFI 固件,支持 Secure Boot Windows 11(强制要求)、现代 Linux

3. 虚拟机控制台与交互#

SPICE agent、guest-agent 与 virtio 驱动承担不同职责;Windows SPICE guest tools 从对应官方包安装,不假定在 virtio-win ISO 中的固定路径。快照是否含内存取决于选项与状态;UEFI、TPM、VFIO 和外部盘需核对当前支持,GUI 列出恢复点不等于完整备份。

3.1 SPICE 控制台

SPICE(Simple Protocol for Independent Computing Environments)是 QEMU/KVM 的推荐显示协议,相比传统的 VNC 提供了显著的体验提升。

SPICE vs VNC 对比

特性 SPICE VNC
图形性能 优(2D 加速、视频流优化) 一般(逐像素传输)
剪贴板共享 双向(需 spice-vdagent) 不支持
USB 重定向 支持(动态热插拔) 不支持
音频传输 原生支持(播放+录音) 不支持
多显示器 支持(每显示器独立通道) 仅单显示器
文件拖放传输 支持(需 spice-vdagent) 不支持
压缩算法 自适应(LZ4/GLZ/QUIC) zlib/Hextile
带宽消耗 低(智能检测脏区域) 较高
兼容性 需要 spice-guest-tools 几乎所有 OS 都内置 VNC 客户端

控制台工具栏

打开 VM 控制台后,顶部工具栏提供以下功能:

按钮 功能 快捷键
全屏模式 切换到全屏 Ctrl+Shift+F
自动缩放 客机分辨率变化时自动缩放窗口 —
截图 截取当前控制台画面 —
USB 设备重定向 将宿主机 USB 设备挂载到 guest —
Send Key 发送组合键 Ctrl+Alt+Del、Ctrl+Alt+F1、PrintScreen 等
退出全屏 从全屏返回窗口模式 —

Guest 集成(spice-vdagent)

安装 guest 侧代理以获得完整体验:

# Linux guest
sudo apt install spice-vdagent        # Debian/Ubuntu
sudo dnf install spice-vdagent         # Fedora/RHEL
sudo pacman -S spice-vdagent           # Arch

# 验证代理是否运行
systemctl status spice-vdagentd
# Windows guest: 安装 spice-guest-tools(virtio-win ISO 中包含)
# 下载地址: https://www.spice-space.org/download.html
# 或从 virtio-win ISO 安装: E:\guest-agent\spice-guest-tools.exe

安装后获得的能力:

  • 自动窗口缩放(客机分辨率跟随 virt-manager 窗口大小)
  • 双向剪贴板共享(文本+图片)
  • 宿主机 ↔ 客机文件拖放
  • 光标无缝切换(无需按 Ctrl+Alt 释放光标)

virt-viewer:轻量级 SPICE/VNC 客户端

# 安装
sudo apt install virt-viewer

# 连接到本地 VM(VM 名称来自 virsh list --all)
virt-viewer --connect qemu:///system <vm-name>

# 连接到远程 VM
virt-viewer --connect qemu+ssh://user@host/system <vm-name>

# 直接连接到 SPICE/VNC 端口
remote-viewer spice://localhost:5900

virt-viewer 比 virt-manager 轻量,适合只需要控制台而不需要管理功能的场景。

3.2 快照管理

快照(Snapshot)不是备份(Backup) 快照记录的是某个时间点的虚拟机状态(磁盘+内存),它可以快速回滚但不能替代备份。快照链依赖原始磁盘镜像,如果底层 qcow2 文件损坏,所有快照都会失效。真正的备份需要独立拷贝磁盘镜像文件。

内部快照 vs 外部快照

类型 存储位置 优点 缺点
内部快照 存储在 qcow2 文件内部 管理简单,创建/恢复速度快 快照越多 qcow2 文件越大;无法对 raw 格式使用
外部快照 独立文件(overlay + backing file 链) 支持 raw 格式;可增量备份 管理复杂;需要手动处理 overlay 链

virt-manager 默认使用内部快照。

操作步骤

  1. VM 运行状态下:菜单 VM → Manage Snapshots(或工具栏 Snapshots 按钮)
  2. 点击 + 按钮:填写名称和描述(建议包含日期和状态说明)
  3. 创建后快照出现在列表中,显示名称、创建时间、VM 状态(running/shutoff)
  4. 恢复:选中目标快照 → 点击 ▶ Run 按钮(运行状态快照恢复到运行中,关机状态快照恢复到关机状态)
  5. 删除:选中快照 → 点击 🗑(删除后无法恢复)

virsh CLI 等效命令

# 创建快照
virsh snapshot-create-as <vm-name> <snapshot-name> \
    --description "Before upgrading kernel"

# 列出快照
virsh snapshot-list <vm-name>

# 查看快照详情
virsh snapshot-info <vm-name> --snapshotname <snapshot-name>

# 恢复到快照
virsh snapshot-revert <vm-name> --snapshotname <snapshot-name>

# 删除快照
virsh snapshot-delete <vm-name> --snapshotname <snapshot-name>

3.3 VM 克隆

克隆(Clone)会基于现有 VM 创建一个完整的独立副本。

操作步骤

  1. 确保源 VM 已关机(virt-manager 要求在关机状态下克隆)
  2. 右键点击 VM → Clone...
  3. 填写新 VM 名称、选择存储路径
  4. 克隆操作自动生成:
    • 新的 UUID
    • 新的 MAC 地址(避免网络冲突)
    • 新的磁盘镜像(独立拷贝,不影响源 VM)

virsh CLI 等效命令

# 使用 virt-clone 克隆 VM
virt-clone \
    --original <source-vm-name> \
    --name <new-vm-name> \
    --file /var/lib/libvirt/images/<new-vm-name>.qcow2 \
    --auto-clone

典型使用场景

  • 模板 VM:创建一个纯净安装的 VM 作为模板,每次需要新环境时从模板克隆
  • 安全测试:在克隆体上测试破坏性操作(内核升级、配置变更),失败不影响原始 VM
  • 批量部署:配合 cloud-init,批量克隆出多个相同的基础 VM

克隆前准备 先克隆已停机的模板,再对离线副本用 virt-sysprep 清理 SSH host keys、machine-id、网络等身份;不要直接清理正在使用或仍需保留的源 VM。Windows、TPM/NVRAM 与加密状态应采用客户机支持的模板流程。


4. 硬件配置面板详解#

面板参数是配置而非性能保证。CPU topology 必须与 vCPU 数一致;host-model 不保证异构热迁移兼容,host-passthrough 即使相同型号也需核对微码、机器类型、QEMU 与设备。内存 current/max 与热插拔 maxMemory/slots 含义不同;热插拔还需要客体支持。raw 可为稀疏文件;旧 qcow2 AES 不作为现代加密方案。多队列 virtio-net 需客体驱动与 ethtool 等设置配合。

在 VM 关机状态下,通过 View → Details(或工具栏 i 图标)打开硬件配置面板。这是 virt-manager 最强大的功能区域。

4.1 CPU 配置

CPU 模型选择

模式 说明 优点 缺点
host-passthrough 按支持范围尽量暴露宿主 CPU 特性 性能取决于负载 破坏迁移兼容性(同型号也不足以保证兼容,需检查完整迁移条件)
host-model 使用宿主机 CPU 模型但允许 libvirt 做兼容处理 性能好,迁移兼容性佳 某些特殊指令可能被过滤
特定命名模型 选择一个具体 CPU 模型(如 EPYC、Skylake-Client) 跨异构主机迁移时最稳定 性能损失取决于差异程度
Copy host CPU configuration GUI 选项,等价于 host-model 简单直接 —
# 查看宿主机 CPU 支持的模型列表
virsh domcapabilities | xmllint --xpath '//cpu/mode[@name="custom"]/model' - | head -20

CPU 拓扑

# virsh 设置 CPU 拓扑示例(1 socket x 4 cores x 2 threads = 8 vCPU)
virsh edit <vm-name>
<cpu mode="host-passthrough">
  <topology sockets="1" dies="1" cores="4" threads="2"/>
</cpu>

CPU Pinning(vCPU 绑定)

将 vCPU 线程绑定到宿主机特定物理 CPU 核心,减少缓存失效和上下文切换:

<cputune>
  <vcpupin vcpu="0" cpuset="2"/>
  <vcpupin vcpu="1" cpuset="3"/>
  <vcpupin vcpu="2" cpuset="4"/>
  <vcpupin vcpu="3" cpuset="5"/>
</cputune>

CPU Pinning 使用建议 在 NUMA 架构的服务器上,将同一 VM 的 vCPU 绑定到同一 NUMA 节点的核心上,避免跨 NUMA 内存访问带来的延迟惩罚。配合 numatune 进一步提升性能。

4.2 内存配置

分配策略

  • Current allocation(当前分配):VM 启动时实际分配的内存量
  • Max allocation(最大分配):允许通过 memory hotplug 增加到的最大的内存量
  • 勾选 "Set max allocation and use hugepages" 可使用大页内存(需宿主机预先配置)

Hugepages 配置

大页内存通过减少 TLB(Translation Lookaside Buffer)缺失来提升内存密集型 VM 的性能:

# 宿主机配置 hugepages(例如分配 2048 个 2MB 页面 = 4GB)
echo 2048 | sudo tee /proc/sys/vm/nr_hugepages

# 或在 sysctl 中永久配置
echo "vm.nr_hugepages = 2048" | sudo tee -a /etc/sysctl.conf

# 验证配置
grep Huge /proc/meminfo
# HugePages_Total:    2048
# Hugepagesize:       2048 kB

# 在 libvirt 中使用 hugepages
virsh edit <vm-name>
<memoryBacking>
  <hugepages/>
</memoryBacking>

4.3 磁盘配置

磁盘总线对比

总线类型 性能 兼容性 virtio 驱动需要 推荐场景
VirtIO 最高 Linux 原生支持;Windows 需安装 virtio 驱动 是 首选,生产环境
SATA (AHCI) 良好 几乎所有现代 OS 内置支持 否 兼容性要求高的场景
SCSI 良好 广泛支持 否(使用 virtio-scsi 时需要) 企业级特性(UNMAP/TRIM)
IDE 很差 最广泛兼容 否 仅作为兼容性救急方案
USB 差 可移动设备仿真 否 极少使用

缓存模式详解

graph LR
    subgraph "Guest VM"
        A[应用程序]
        B[Guest Page Cache]
        C[Guest 磁盘驱动]
    end

    subgraph "QEMU"
        D[QEMU 块层]
        E[Cache Mode Decision]
    end

    subgraph "Host"
        F[Host Page Cache]
        G[O_DIRECT bypass]
        H[物理磁盘]
    end

    A --> B --> C --> D --> E
    E -->|writeback / writethrough| F --> H
    E -->|none / directsync| G --> H
缓存模式 Guest 写缓存 Host 页缓存 数据安全性 典型吞吐量
writeback 启用 启用 中等 最高
writethrough 禁用 启用 高 中等
none 启用 绕过 中等 高
directsync 禁用 绕过 最高 低
unsafe 启用 启用 极低 极速

IO Mode

模式 说明
default 让 QEMU 自行选择
native 使用 O_DIRECT 打开文件,绕过宿主机页缓存
threads 使用线程池处理 IO,配合 none 缓存模式使用时可以提高并发 IO 性能

Discard Mode(TRIM/Discard 支持)

  • unmap:客机发出的 TRIM/Discard 命令会穿透到宿主机文件系统,释放未使用的块,对于 qcow2 文件可减小实际占用空间
# 在 guest 中手动执行 TRIM(需要 guest 和宿主机都支持 discard)
sudo fstrim -a

4.4 网络配置

NIC 型号对比

型号 类型 性能 驱动需求 推荐场景
virtio 半虚拟化 最高(接近宿主机网速) 需要 virtio 驱动 首选
e1000e Intel 82574L 仿真 良好(~1Gbps) 几乎所有 OS 内置 兼容性后备方案
rtl8139 Realtek 8139 仿真 差(~100Mbps) 几乎所有 OS 内置 仅作兼容性最后手段
vmxnet3 VMware 半虚拟化 高 VMware Tools VMware 迁移场景

网络源类型

graph TD
    A[VM 虚拟网卡]
    B[NAT - virbr0]
    C[Bridge - br0]
    D[Macvtap - VEPA/Bridge]
    E[SR-IOV VF]
    F[Host Only]

    B --> G[宿主机 iptables/nftables NAT]
    G --> H[物理网络]
    C --> H
    D --> H
    E --> H
    F --> I[仅宿主机内部]
网络源 libvirt XML 中的 type 客机 IP 客机间通信 外部访问客机
NAT (virbr0) network DHCP 192.0.2.0/24 是 否(需端口转发)
Bridge (br0) bridge 与宿主机同网段 DHCP 是 是
Macvtap (VEPA) direct 与宿主机同网段 DHCP 取决于交换机 是
SR-IOV direct (VF) 同网段 取决于硬件 是
Host-only network (isolated) DHCP 是 否

桥接网络配置

# 创建 Linux bridge(使用 NetworkManager)
nmcli connection add type bridge ifname br0
nmcli connection add type ethernet slave-type bridge con-name bridge-br0 \
    ifname eth0 master br0
nmcli connection up br0

# 或使用 systemd-networkd
# /etc/systemd/network/br0.netdev
[NetDev]
Name=br0
Kind=bridge

# /etc/systemd/network/br0.network
[Match]
Name=br0
[Network]
DHCP=yes

多队列 virtio-net

多队列适用于可并行处理的网络负载;收益取决于客体 CPU、队列设置和后端,需要实测:

<interface type="network">
  <model type="virtio"/>
  <driver name="vhost" queues="4"/>
</interface>

队列数设置建议 将 queues 设置为 VM 的 vCPU 数量,使每个 vCPU 可以处理独立的网络队列。需要 guest 内核版本 >= 3.8 支持 MQ veth。

4.5 显卡配置

显卡型号 说明 3D 加速 推荐场景
virtio 半虚拟化 GPU,配合 virgl 支持 3D 加速 是(需 virgl) Linux guest,需要 3D/OpenGL
QXL SPICE 协议优化显卡,支持多显示器 否 通用 Linux/Windows desktop(2D 优化)
VGA 标准 VGA 兼容 否 兼容性后备
Cirrus 古老的 Cirrus Logic 显卡 否 Windows 9x/XP 等老系统
Bochs Bochs VGA 兼容 否 极少使用

启用 3D 加速

<graphics type="spice">
  <listen type="none"/>
  <gl enable="yes" rendernode="/dev/dri/<RENDER_NODE>"/>
</graphics>
<video>
  <model type="virtio" heads="1" primary="yes">
    <acceleration accel3d="yes"/>
  </model>
</video>

宿主机要求:

  • Mesa 驱动 + OpenGL 支持(glxinfo | grep "OpenGL renderer")
  • /dev/dri/renderD128 存在且用户有访问权限

4.6 其他设备

USB 控制器

型号 USB 版本 速度
nec-xhci USB 3.0 5 Gbps
qemu-xhci USB 3.0 5 Gbps
ich9-ehci1 USB 2.0 480 Mbps
piix3-uhci USB 1.1 12 Mbps

TPM(受信任平台模块)

Windows 11 安装必须配置 TPM 2.0:

<tpm model="tpm-crb">
  <backend type="emulator" version="2.0"/>
</tpm>

宿主机安装 swtpm:

sudo apt install swtpm swtpm-tools    # Debian/Ubuntu
sudo dnf install swtpm                 # Fedora

RNG(随机数生成器)

为 guest 提供高质量的熵源,加速加密操作和 SSH host key 生成:

<rng model="virtio">
  <backend model="random">/dev/urandom</backend>
</rng>

Watchdog(看门狗)

当 guest 无响应时自动执行操作:

Action 行为
reset 强制重启 guest
poweroff 强制关闭 guest
pause 暂停 guest
none 仅记录,不执行操作
<watchdog model="i6300esb" action="reset"/>

Virtiofs(文件系统直通)

domain 还需要供 vhost-user 访问的共享内存,例如 <memoryBacking><source type="memfd"/><access mode="shared"/></memoryBacking>。共享目录应限制范围,并核对 UID/GID、权限及 SELinux/AppArmor;不要共享整个家目录。客体挂载前先 mkdir -p /mnt/share。

virt-manager GUI 中对 virtiofs 的支持有限,通常通过 virsh 或直接编辑 XML 配置:

<filesystem type="mount" accessmode="passthrough">
  <driver type="virtiofs"/>
  <source dir="/path/to/host/dir"/>
  <target dir="mount_tag"/>
</filesystem>
# guest 中挂载
sudo mount -t virtiofs mount_tag /mnt/share

virtiofs 的优势 viriofs 相比于 9p/virtio-9p 和 Samba/NFS 有显著的性能优势,因为它基于 FUSE 并通过共享内存直接传递文件操作,避免了协议转换开销。Linux 客体 virtiofs 驱动自 5.4 起提供;宿主需要匹配 QEMU、virtiofsd 与 libvirt 支持,不能只检查宿主内核号。


5. 远程连接管理#

不要暴露无认证 libvirt TCP、VNC 或 SPICE 监听。直接显示连接优先限于本地或 SSH 隧道。SPICE OpenGL/virgl 通常要求本地 Unix socket,不能把 GL 片段与任意远程 TCP SPICE 示例混用。TLS 必须包括对端验证与授权;单体配置文件示例不自动适用于模块化或 socket activation。

virt-manager 的核心优势之一是统一管理多台宿主机的虚拟机,所有操作都通过 libvirt 的远程连接能力实现。

5.1 添加远程连接

  1. File → Add Connection...
  2. 配置参数:
参数 说明 示例
Hypervisor 远程 hypervisor 类型 QEMU/KVM
Connect to remote host 勾选此选项 —
Method 连接传输协议 SSH(推荐)、TCP、TLS
Username SSH 用户名 root 或具有 libvirt 权限的普通用户
Hostname 远程主机地址 198.51.100.100 或 server.example.com
  1. 点击 Connect

5.2 libvirt URI 语法

virt-manager 连接字符串的本质是 libvirt URI:

协议+传输://用户@主机/模式
URI 说明
qemu:///system 本地 system 模式(管理特权 VM)
qemu:///session 本地 session 模式(用户级 VM,无需 sudo)
qemu+ssh://root@198.51.100.100/system 通过 SSH 远程连接
qemu+ssh://user@server/system 通过 SSH 以特定用户连接
qemu+tls://server/system 通过 TLS 加密连接(生产环境推荐)
qemu+tcp://server/system 不加密 TCP 连接(不安全,仅测试用)

5.3 SSH 密钥配置

SSH agent/公钥认证通常便于 GUI 使用;密码和口令提示是否可用取决于 askpass/agent 集成,不能一概认定 GUI 无法认证。先验证 SSH 主机密钥与远程账号权限:

# 生成密钥对(如果还没有)
ssh-keygen -t ed25519 -C "virt-manager-remote"

# 复制公钥到远程主机
ssh-copy-id user@server.example.com

# 验证免密登录
ssh user@server.example.com "virsh list --all"

# 检查同一个远程账号对 system libvirt 的权限
ssh user@server.example.com "virsh -c qemu:///system list --all"
# 权限应由宿主组/polkit/socket 策略授予。
# 仅给 sudo virsh NOPASSWD 不会授权 GUI 的远程 libvirt 通道。

5.4 远程 SPICE 显示隧道

当管理远程 VM 时,SPICE 流量通过 SSH 隧道传输:

# 手动建立 SSH 隧道(将远程 SPICE 端口转发到本地)
ssh -L 5900:localhost:5900 -L 5901:localhost:5901 user@server.example.com

# 然后在本地的 virt-viewer 中连接
remote-viewer spice://localhost:5900

virt-manager 在通过 SSH 连接时会自动处理 SPICE/VNC 隧道的建立,无需手动操作。

5.5 TLS 安全连接(生产环境)

对于多用户生产环境,推荐使用 TLS 证书认证代替 SSH:

# 在远程宿主机上配置 TLS
# 1. 生成 CA 证书
# 2. 签发服务器证书
# 3. 签发客户端证书
# 4. 配置 /etc/libvirt/libvirtd.conf:
#    listen_tls = 1
#    tls_port = "16514"
#    key_file = "/etc/pki/libvirt/private/serverkey.pem"
#    cert_file = "/etc/pki/libvirt/servercert.pem"
#    ca_file = "/etc/pki/libvirt/cacert.pem"
# 5. 重启 libvirtd: systemctl restart libvirtd

# 客户端连接
virt-manager -c "qemu+tls://server/system"

system vs session 连接 qemu:///system(system 模式)管理的 VM 在 sudo virsh list --all 中可见,QEMU 的运行身份取决于宿主配置。qemu:///session(session 模式)管理的 VM 以当前用户身份运行,无需 sudo,但功能受限(如无法使用桥接网络)。实际默认连接取决于版本、包装和已有用户设置,先查看连接 URI。


6. 常见问题与故障排查#

6.1 virt-manager 无法连接到 libvirtd

# 问题:启动 virt-manager 时提示 "Unable to connect to libvirt qemu:///system"
# 排查步骤:

# 1. 确认 libvirtd 是否运行
sudo systemctl status libvirtd

# 2. 启动 libvirtd
sudo systemctl enable --now libvirtd

# 3. 确认当前用户在 libvirt 组中
groups $USER | grep libvirt
sudo usermod -aG libvirt $USER
# 重新登录后生效

# 4. 确认 virtlogd.socket 正常
sudo systemctl status virtlogd.socket

6.2 KVM 不可用(权限问题)

# 问题:VM 启动失败,提示 KVM not available

# 检查 /dev/kvm 权限
ls -la /dev/kvm

# 修复权限(临时)
id -nG
# 不将 /dev/kvm 开放为世界可写;检查 kvm 组、udev 与授权策略

# 修复权限(永久,推荐)
sudo usermod -aG kvm $USER
# 重新登录

# 验证 KVM 可用
virsh capabilities | grep -A2 kvm

6.3 性能问题

# 1. 确认使用 virtio 而不是 IDE/e1000
virsh dumpxml <vm-name> | grep -E "<disk|<interface"

# 2. 确认使用 KVM 加速而非 QEMU 模拟(查看 VM 详情页 Performance 标签)
# 在 virt-manager GUI 中:VM → View → Details → Overview → Hypervisor 应显示 "kvm"

# 3. 检查 CPU 是否支持硬件虚拟化
egrep -c '(vmx|svm)' /proc/cpuinfo  # > 0 表示支持


参考与延伸

  1. virt-manager 项目 ↗
  2. Domain XML ↗
  3. libvirt virtiofs ↗
  4. Windows 11 官方要求 ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

KVM 宿主与管理基础

  1. 01KVM、QEMU 与 libvirt 的职责边界
  2. 02KVM 宿主安装、权限与网络准备
  3. 03用 virsh 管理域、存储、网络与恢复
  4. 04virt-manager 创建、硬件面板与远程控制
CONTINUE READING / 下一篇KVM 的固件、VFIO、virtiofs 与镜像链

解释高级参数的作用,并为直通、镜像修改和共享目录补齐兼容性与恢复条件。