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

KVM 宿主安装、权限与网络准备

逐项检查宿主能力、发行版组件、管理授权和默认网络的实际状态。

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

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


1. 硬件虚拟化验证#

本文安装命令分属不同发行版,不应连续执行。NixOS 使用模块和 Home Manager 维护软件/服务,不直接改 /etc 或 dotfile。AMD IOMMU 通常由固件与内核初始化;iommu.strict=1 只控制失效策略,不是启用开关。

在安装任何软件之前,必须先确认 CPU 支持硬件虚拟化、对应的固件扩展已启用,以及内核模块可正常加载。

1.1 检查 CPU 虚拟化扩展

Intel 平台需要 VT-x (vmx),AMD 平台需要 AMD-V/SVM (svm)。

# 统计 CPU 虚拟化标志位(> 0 表示支持)
egrep -c '(vmx|svm)' /proc/cpuinfo

如果返回 0,说明 CPU 不支持硬件虚拟化,或者 BIOS/UEFI 中未启用。

更详细地查看具体标志位:

# 查看完整 flags 行
grep -E '(vmx|svm)' /proc/cpuinfo

# 使用 lscpu 查看虚拟化信息
lscpu | grep -i virtualization

期望输出示例(Intel):

Virtualization:                  VT-x

期望输出示例(AMD):

Virtualization:                  AMD-V

1.2 使用 kvm-ok 辅助检测

kvm-ok 来自 cpu-checker 包,能一次性完成 CPU 检查和 /dev/kvm 设备检查。

# Ubuntu/Debian
sudo apt install cpu-checker
sudo kvm-ok

# Fedora
virt-host-validate qemu  # Fedora 可用 libvirt 的验证工具;cpu-checker 包名不能跨发行版假定
sudo kvm-ok

期望输出:

INFO: /dev/kvm exists
KVM acceleration can be used

失败时可能出现:

INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used

1.3 检查 KVM 内核模块

# 查看 KVM 模块是否已加载
lsmod | grep kvm

# 如果未加载,手动加载
sudo modprobe kvm           # 通用 KVM 核心
sudo modprobe kvm_amd       # AMD 平台
sudo modprobe kvm_intel     # Intel 平台

期望输出(Intel 平台):

kvm_intel           385024  0
kvm                 1134592  1 kvm_intel

AMD-V 在 BIOS 中被禁用的常见问题 部分主板(尤其是华硕、微星的 AMD 平台)出厂默认关闭 AMD-V。开机按 Del/F2 进入固件设置,在 Advanced CPU Configuration 中找到 SVM Mode 并设为 Enabled。在 Linux 下可以通过以下命令快速判断:

dmesg | grep -i "svm.*disabled by bios"

如果看到 svm: SVM disabled (by BIOS) 则确认是固件层未开启。

1.4 IOMMU 检查(PCI 直通前置条件)

如果计划做 VGA/PCI 直通(GPU passthrough),还需要确认 IOMMU 支持。

# 检查 IOMMU 是否在内核日志中出现
dmesg | grep -i iommu

# 查看 IOMMU 分组
ls /sys/kernel/iommu_groups/ 2>/dev/null

Intel 平台还需要确认 VT-d 是否启用:

dmesg | grep -i "DMAR" | grep -i "IOMMU"

如果 IOMMU 未启用,需要在 GRUB 内核命令行中添加:

  • Intel: intel_iommu=on
  • AMD: 固件开启 AMD-Vi 后检查内核初始化和 group;iommu.strict=1 是可选 DMA 失效策略,不是启用开关

2. 各发行版安装指南#

KVM 虚拟化栈包含以下几个核心组件:

组件 功能 关键包名
KVM 内核模块 CPU 硬件虚拟化加速 kvm.ko (内核自带)
QEMU 设备模拟与虚拟机执行引擎 qemu-kvm / qemu-full
libvirt 虚拟机管理抽象层,提供统一 API libvirt-daemon
virsh libvirt 命令行管理工具 libvirt-clients
virt-manager 图形化管理界面 (GUI) virt-manager
bridge-utils 桥接网络工具 bridge-utils

2.1 Ubuntu 24.04+ / Debian

sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients \
  bridge-utils virt-manager virt-viewer qemu-utils
包名 说明
qemu-kvm 带有 KVM 加速的 QEMU 用户态组件;虚拟包,自动拉取适合当前架构的 QEMU 二进制
libvirt-daemon-system libvirt 系统守护进程 + systemd service 单元文件,替代旧的 libvirt-bin
libvirt-clients 命令行客户端:virsh、virt-admin、virt-host-validate
bridge-utils 提供 brctl 命令,用于手动创建 Linux 网桥(bridge networking)
virt-manager GTK 图形化管理工具,通过 libvirt API 管理虚拟机
virt-viewer SPICE/VNC 控制台查看器(virt-viewer 命令),轻量级替代方案
qemu-utils 提供 qemu-img(磁盘镜像创建/转换)、qemu-io(I/O 测试)等实用工具

可选但推荐的额外包:

sudo apt install libguestfs-tools virt-top ovmf
  • libguestfs-tools: 提供 virt-builder、virt-resize 等 Guest 磁盘操作工具
  • virt-top: 类似 top 的虚拟机实时资源监控
  • ovmf: UEFI 固件,用于创建 UEFI 启动的虚拟机

2.2 Fedora

# 方式一:安装 @virtualization 组(推荐,一键安装全部相关包)
sudo dnf install @virtualization

# 方式二:手动按需安装
sudo dnf install qemu-kvm libvirt-daemon libvirt-client \
  virt-manager virt-viewer bridge-utils

Fedora 组包说明 @virtualization 组包含:qemu-kvm、libvirt-daemon、virt-manager、virt-viewer、edk2-ovmf、guestfs-tools 等,是 Fedora 官方推荐的安装方式。相比手动安装,组包能确保依赖关系正确且版本配套。

Fedora 上 libvirt 默认使用模块化守护进程架构(modular daemons),详见 02_Installation_and_Setup。

2.3 Arch Linux

sudo pacman -S qemu-full virt-manager virt-viewer libvirt \
  dnsmasq edk2-ovmf swtpm iptables-nft
包名 说明
qemu-full QEMU 完整版,包含所有系统模拟器(qemu-system-x86_64、qemu-system-aarch64 等)。若只需要 x86_64 虚拟化,可改用 qemu-base,但不推荐,因为限制太多
virt-manager 图形化管理界面
virt-viewer SPICE/VNC 控制台
libvirt 主包,含 libvirtd 守护进程
dnsmasq DHCP/DNS 服务,libvirt NAT 虚拟网络 (default 网络) 依赖此项
edk2-ovmf UEFI 固件(OVMF),创建 UEFI 虚拟机的必要条件
swtpm TPM 2.0 模拟器。Windows 11 安装必要条件:Win11 要求 TPM 2.0,没有 swtpm 则无法通过安装检查
iptables-nft iptables 兼容后端所用工具;新版 libvirt 也支持原生 nftables,检查实际版本、network firewall_backend 和发行版默认值

可选包:

sudo pacman -S dmidecode guestfs-tools virt-top

qemu-full vs qemu-base vs qemu-desktop

  • qemu-base: 仅含 qemu-system-x86_64,适合极简场景
  • qemu-desktop: 含 x86_64 + 常用 UI 后端(SPICE, OpenGL),适合桌面用户
  • qemu-full: 含所有架构的 QEMU 模拟器,推荐开发/实验环境使用,避免后续因缺少模拟器而反复编译

2.4 openSUSE

# 安装 KVM 服务器模式(含 libvirt、QEMU、virt-manager)
sudo zypper install -t pattern kvm_server

# 补充图形管理界面(若 pattern 未包含)
sudo zypper install virt-manager

openSUSE 的 kvm_server pattern 会安装完整的 KVM 虚拟化栈;kvm_tools pattern 则提供额外的 Guest 管理工具,可按需安装。

2.5 安装完成后的基本验证

无论使用哪种发行版,安装完成后执行以下命令确认组件就位:

# 检查 QEMU 版本和可用架构
qemu-system-x86_64 --version

# 检查 libvirt 版本
virsh --version

# 检查 virt-manager 是否可启动
virt-manager --version

# 运行 libvirt 宿主机验证
virt-host-validate qemu

virt-host-validate 会逐项检查 IOMMU、CPU 扩展、设备权限等,标记 PASS/FAIL/WARN。


3. 用户与权限配置#

libvirt 通过 UNIX socket 和 PolicyKit 控制访问权限。让非 root 用户管理虚拟机,需要将其加入对应的 UNIX 组。

3.1 添加用户到虚拟化组

# 将当前用户加入 libvirt 和 kvm 组
sudo usermod -aG libvirt,kvm $USER
组名 权限范围
libvirt 允许通过 libvirt socket (/var/run/libvirt/libvirt-sock) 管理虚拟机、网络、存储池
kvm 允许访问 /dev/kvm 设备节点,执行 KVM 加速的 QEMU 进程

3.2 生效组变更

usermod -aG 修改的是用户登录时加载的组成员关系,已存在的 shell 会话不会自动继承新组。

# 方式一:在当前 shell 临时生效(仅影响此 shell 及其子进程)
newgrp libvirt

# 方式二:登出后重新登录(永久生效,推荐)
# 注销当前桌面会话并重新登录

# 方式三:重启系统(最彻底)
sudo reboot

组变更必须生效 如果在未生效组变更前运行 virsh list --all,会收到 Failed to connect to the hypervisor 或 Permission denied 错误。解决方法就是确保当前会话已加入 libvirt 组。

3.3 验证权限

# 确认当前用户已加入目标组
id -nG | grep -E 'libvirt|kvm'

# 期望输出中包含 libvirt 和 kvm
# 示例: user adm cdrom sudo dip plugdev libvirt kvm docker

# 测试 libvirt 连接(不应需要 sudo)
virsh list --all

# 期望输出
#  Id   Name   State
# --------------------

如果 virsh list --all 无需 sudo 就能执行且返回空列表,说明权限配置正确。


4. libvirtd 服务管理#

4.1 启动与启用

# 启动并设为开机自启(一次性操作)
sudo systemctl enable --now libvirtd

# 检查运行状态
sudo systemctl status libvirtd

期望输出关键行:

Active: active (running) since ...

Socket 激活机制 libvirtd 在大多数发行版上默认配置为 socket-activated。这意味着 systemctl status libvirtd 可能显示 active (running) 或 inactive (dead) 都是正常的:

  • 没有任何客户端连接时,libvirtd 可能处于空闲状态
  • 当 virsh 或 virt-manager 发起连接时,systemd 会自动通过 socket 触发 libvirtd 启动

通过 socket 状态确认服务就绪:

systemctl status libvirtd.socket libvirtd-ro.socket libvirtd-admin.socket

4.2 模块化守护进程架构

现代发行版(Fedora 35+、Ubuntu 24.04+、Arch Linux)中,libvirt 已从单体 libvirtd 拆分为多个专用守护进程:

传统守护进程 现代模块化替代 职责
libvirtd(单体) virtqemud QEMU/KVM 虚拟机管理
virtnetworkd 虚拟网络管理(NAT、bridge、DHCP)
virtstoraged 存储池管理(dir、LVM、iSCSI 等)
virtnodedevd 主机设备管理(PCI、USB 等)
virtsecretd 密钥/密码管理(Ceph、iSCSI CHAP 等)
virtinterfaced 主机网络接口管理
virtproxyd 统一代理入口,将请求路由到对应模块

检查当前使用的架构:

# 查看模块化 daemon 是否在运行
systemctl status virtqemud virtnetworkd virtstoraged 2>/dev/null

# 查看 libvirt 连接 URI(会显示使用哪个 daemon)
virsh uri
  • 模块化架构下 virsh uri 输出:qemu:///system(实际由 virtqemud 处理)
  • 单体架构下输出同为 qemu:///system,但由 libvirtd 处理

在使用层面,无论是单体还是模块化架构,virsh、virt-manager 的 API 调用方式完全一致,对用户透明。

4.3 服务故障排查

# 查看 libvirtd 日志
sudo journalctl -u libvirtd -f

# 查看模块化 daemon 日志
sudo journalctl -u virtqemud -f

# 检查配置文件语法
sudo virt-host-validate qemu

# 查看 systemd 托管服务的日志;避免重复 daemon
journalctl -u libvirtd -b  # 检查已托管 daemon 的日志,不另起第二个实例

5. 默认网络配置#

libvirt 安装后会自动创建一个名为 default 的 NAT 虚拟网络,使用 virbr0 网桥。

5.1 网络参数

参数 值
网络名称 default
网桥接口 virbr0
网络地址 192.0.2.0/24
DHCP 地址池 192.0.2.2 - 192.0.2.254
宿主机 IP(在此网络上) 192.0.2.1
DNS/DHCP 服务 dnsmasq(由 libvirt 自动管理)

5.2 管理 default 网络

# 启动 default 网络
sudo virsh net-start default

# 设为自动启动(宿主机开机后自动创建)
sudo virsh net-autostart default

# 查看所有虚拟网络
virsh net-list --all

# 期望输出:
#  名称       状态     自动启动   持久
# -------------------------------------------
#  default    活跃     是         是

# 查看 virbr0 网桥接口
ip addr show virbr0

# 查看 DHCP 租约
virsh net-dhcp-leases default

5.3 网络不存在时的恢复

如果 default 网络被误删或从未创建:

# 从 libvirt 默认网络 XML 模板重新定义
sudo virsh net-define /usr/share/libvirt/networks/default.xml

# 启动并设为自启
sudo virsh net-start default
sudo virsh net-autostart default

default.xml 在不同发行版的位置可能略有不同:

  • Debian/Ubuntu: /usr/share/libvirt/networks/default.xml
  • Fedora: /usr/share/libvirt/networks/default.xml
  • Arch: /etc/libvirt/qemu/networks/default.xml

5.4 理解 NAT 网络通信

graph LR
    VM[虚拟机 / 192.0.2.x] -->|eth0| Bridge[virbr0 / 192.0.2.1]
    Bridge -->|NAT/Masquerade| Host[宿主机物理网卡 / enpXsY]
    Host -->|路由| LAN[外部网络/互联网]
  • 虚拟机出站:NAT 转换后通过宿主机物理网卡出去(需要宿主机开启 IP 转发)
  • 宿主机到虚拟机:宿主机直接 ping 192.0.2.x 即可
  • 外部到虚拟机:需要在宿主机上设置端口转发或改用 bridged networking(见 高级网络配置)

验证 IP 转发是否开启 KVM NAT 网络依赖宿主机的 IP 转发功能。确认状态:

sysctl net.ipv4.ip_forward
# 期望: net.ipv4.ip_forward = 1

如果为 0,libvirt 通常在启动 default 网络时会自动开启,但若被手动关闭可能导致虚拟机无法访问外部网络。


6. 验证安装#

本节 CirrOS 0.6.2 是历史 smoke-test 镜像,官方目录列出的 x86_64 disk 文件约 20 MiB。MD5SUMS 仅能核对意外传输损坏,不提供强来源认证;按实际 release 核对可用签名/强校验链。不得将这种测试镜像及公开默认口令用于对外服务。system QEMU 读取路径还需安全策略和目录权限;--graphics none 不会自动让任意客户机提供串口登录。

用 CirrOS 测试镜像完成端到端验证。CirrOS 是一个仅约 12MB 的极简 Linux 发行版,专为 OpenStack/KVM 测试设计。

6.1 下载测试镜像

# 下载 CirrOS(x86_64 压缩磁盘镜像)
wget https://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img

# 校验文件完整性(可选)
wget https://download.cirros-cloud.net/0.6.2/MD5SUMS
grep cirros-0.6.2-x86_64-disk.img MD5SUMS | md5sum -c -

6.2 创建并启动测试虚拟机

virt-install --connect qemu:///system \
  --name test \
  --ram 512 \
  --vcpus 1 \
  --disk path=cirros-0.6.2-x86_64-disk.img \
  --import \
  --os-variant cirros0.6 \
  --graphics none \
  --network network=default
参数 含义
--name test 虚拟机在 libvirt 中的名称标识
--ram 512 分配 512MB 内存
--vcpus 1 分配 1 个虚拟 CPU 核心
--disk path=... 指定磁盘镜像文件路径
--import 跳过操作系统安装步骤,直接使用已有磁盘镜像(关键:不指定则 virt-install 会尝试启动 OS 安装程序)
--os-variant cirros0.6 告知 libvirt Guest OS 类型,用于优化默认配置(如 virtio 驱动)
--graphics none 不启动图形控制台,输出直接连接到当前终端(适合测试/无桌面环境)
--network network=default 连接到 default NAT 虚拟网络

虚拟机启动后,终端会直接显示 CirrOS 启动过程和登录提示:

=== cirros: cirros 0.6.2 ===
login:

CirrOS 默认登录凭据:

  • 用户名:cirros
  • 密码:<CIRROS_TEST_PASSWORD_FROM_RELEASE>

按 Ctrl+] 退出终端连接(虚拟机继续在后台运行)。

6.3 检查虚拟机状态

# 列出所有虚拟机
virsh list --all

# 期望输出:
#  Id   Name    State
# -----------------------
#  1    test    running

# 查看虚拟机详细信息
virsh dominfo test

# 期望输出关键字段:
#  Id:             1
#  Name:           test
#  UUID:           xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
#  OS Type:        hvm
#  State:          running
#  CPU(s):         1
#  Max memory:     524288 KiB
#  Used memory:    524288 KiB

6.4 清理测试虚拟机

# 强制关闭虚拟机(相当于拔电源)
virsh destroy test

# 若虚拟机已正常关机(shutdown),用 undefine 直接删除定义即可
# 从 libvirt 中注销虚拟机定义(不删除磁盘文件)
virsh undefine test

# 可选:删除下载的测试镜像
rm cirros-0.6.2-x86_64-disk.img

destroy vs shutdown vs undefine

  • virsh destroy <name>: 强制停止虚拟机(类似断电,未落盘数据可能丢失),不删除虚拟机定义和磁盘
  • virsh shutdown <name>: 向 Guest 发送 ACPI 关机信号,优雅关闭(需 Guest 安装 ACPI 服务)
  • virsh undefine <name>: 从 libvirt 数据库中删除虚拟机配置,不删除磁盘文件。加 --remove-all-storage 可同时删除关联的存储卷

7. 安装后推荐配置#

7.1 配置 libvirt 默认 URI

避免每次使用 virsh 都需指定 -c qemu:///system:

# 写入 shell 配置文件
echo 'export LIBVIRT_DEFAULT_URI="qemu:///system"' >> ~/.bashrc
source ~/.bashrc

# 或者一次性设置(已有 shell 会话)
export LIBVIRT_DEFAULT_URI="qemu:///system"

7.2 配置 VM 存储目录

pool-define-as 创建持久定义,随后 pool-start 才激活;pool-create-as 只创建瞬态池,不能直接假定能 autostart。system QEMU 需要实际目录遍历和文件读写权限,家目录常受权限或安全策略限制;应选经过授权的存储目录,而非 chmod 开放整个家目录。

建议创建专用目录存储虚拟机磁盘和 ISO 镜像:

# 创建存储目录
mkdir -p ~/vm/images    # 虚拟机磁盘文件
mkdir -p ~/vm/isos      # 操作系统 ISO 镜像
mkdir -p ~/vm/cloud-init  # cloud-init 配置文件(可选)

# 注册为 libvirt 存储池(方便 virt-manager 可视化操作)
virsh pool-define-as --name vm-images --type dir --target ~/vm/images
virsh pool-define-as --name vm-isos --type dir --target ~/vm/isos
virsh pool-start vm-images
virsh pool-autostart vm-images
virsh pool-start vm-isos
virsh pool-autostart vm-isos

7.3 配置远程管理(可选)

优先使用 SSH 隧道:远程账号需要 SSH 认证,以及远程 system libvirt socket 的组或 polkit 授权。SSH 登录权限本身不等于 libvirt 管理权限。

virsh -c qemu+ssh://user@server.example.com/system list --all

TLS 管理需要 CA、服务器与客户端证书、正确的主机名验证、私钥权限、访问控制及对应 socket 配置。单体 daemon 的历史配置键包括 listen_tls、tls_port、key_file、cert_file、ca_file;socket activation 或 virtproxyd 部署应按所用架构的官方文档配置,不能只改旧的 libvirtd.conf。

明文 TCP 的历史组合 listen_tcp 与无认证 auth_tcp 会把完整管理能力交给端口可达的请求者;不应作为“受信任内网”默认配置。TLS 常用端口是 16514,明文 TCP 常用端口是 16509;端口号不能证明连接已经认证或加密。


小结#

默认 NAT 网络是否定义、启动或 autostart 由发行版安装与现有状态决定。NAT 提供出站转发而非完整安全隔离;客体通常仍可访问宿主虚拟网桥和同网络客体。示例网段使用文档地址段表示拓扑,实际创建时应改为不冲突的 RFC1918 私网。

完成配置后,应逐项验证以下条件;本文没有运行这些命令:

  • KVM 硬件加速就绪
  • QEMU + libvirt 软件栈安装完毕
  • 用户权限配置正确,无需 sudo 管理虚拟机
  • libvirtd(或等价模块化守护进程)开机自启
  • default NAT 网络可用

下一步:虚拟机创建与管理 将深入讲解虚拟机的创建流程、配置参数和生命周期管理。



参考与延伸

  1. libvirt daemon 与 socket ↗
  2. libvirt remote 管理 ↗
  3. libvirt network XML ↗
  4. Linux kernel parameters ↗

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

沿专题继续阅读

KVM 宿主与管理基础

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

保留命令分类和 XML 参数,并明确持久定义、运行实例、快照与离线备份的区别。