命令与 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 Bootgeneric→ 保守默认值(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:5900virt-viewer 比 virt-manager 轻量,适合只需要控制台而不需要管理功能的场景。
3.2 快照管理
快照(Snapshot)不是备份(Backup) 快照记录的是某个时间点的虚拟机状态(磁盘+内存),它可以快速回滚但不能替代备份。快照链依赖原始磁盘镜像,如果底层 qcow2 文件损坏,所有快照都会失效。真正的备份需要独立拷贝磁盘镜像文件。
内部快照 vs 外部快照
| 类型 | 存储位置 | 优点 | 缺点 |
|---|---|---|---|
| 内部快照 | 存储在 qcow2 文件内部 | 管理简单,创建/恢复速度快 | 快照越多 qcow2 文件越大;无法对 raw 格式使用 |
| 外部快照 | 独立文件(overlay + backing file 链) | 支持 raw 格式;可增量备份 | 管理复杂;需要手动处理 overlay 链 |
virt-manager 默认使用内部快照。
操作步骤
- VM 运行状态下:菜单
VM → Manage Snapshots(或工具栏 Snapshots 按钮) - 点击
+按钮:填写名称和描述(建议包含日期和状态说明) - 创建后快照出现在列表中,显示名称、创建时间、VM 状态(running/shutoff)
- 恢复:选中目标快照 → 点击
▶ Run按钮(运行状态快照恢复到运行中,关机状态快照恢复到关机状态) - 删除:选中快照 → 点击
🗑(删除后无法恢复)
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 创建一个完整的独立副本。
操作步骤
- 确保源 VM 已关机(virt-manager 要求在关机状态下克隆)
- 右键点击 VM → Clone...
- 填写新 VM 名称、选择存储路径
- 克隆操作自动生成:
- 新的 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 -20CPU 拓扑
# 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 -a4.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 # FedoraRNG(随机数生成器)
为 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/sharevirtiofs 的优势 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 添加远程连接
File → Add Connection...- 配置参数:
| 参数 | 说明 | 示例 |
|---|---|---|
| Hypervisor | 远程 hypervisor 类型 | QEMU/KVM |
| Connect to remote host | 勾选此选项 | — |
| Method | 连接传输协议 | SSH(推荐)、TCP、TLS |
| Username | SSH 用户名 | root 或具有 libvirt 权限的普通用户 |
| Hostname | 远程主机地址 | 198.51.100.100 或 server.example.com |
- 点击 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:5900virt-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.socket6.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 kvm6.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 表示支持参考与延伸
根据技术笔记重新整理,示例使用通用名称。