命令与 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-V1.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 used1.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_intelAMD-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/nullIntel 平台还需要确认 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 ovmflibguestfs-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-utilsFedora 组包说明
@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-topqemu-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-manageropenSUSE 的 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 qemuvirt-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 default5.3 网络不存在时的恢复
如果 default 网络被误删或从未创建:
# 从 libvirt 默认网络 XML 模板重新定义
sudo virsh net-define /usr/share/libvirt/networks/default.xml
# 启动并设为自启
sudo virsh net-start default
sudo virsh net-autostart defaultdefault.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 KiB6.4 清理测试虚拟机
# 强制关闭虚拟机(相当于拔电源)
virsh destroy test
# 若虚拟机已正常关机(shutdown),用 undefine 直接删除定义即可
# 从 libvirt 中注销虚拟机定义(不删除磁盘文件)
virsh undefine test
# 可选:删除下载的测试镜像
rm cirros-0.6.2-x86_64-disk.imgdestroy 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-isos7.3 配置远程管理(可选)
优先使用 SSH 隧道:远程账号需要 SSH 认证,以及远程 system libvirt socket 的组或 polkit 授权。SSH 登录权限本身不等于 libvirt 管理权限。
virsh -c qemu+ssh://user@server.example.com/system list --allTLS 管理需要 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(或等价模块化守护进程)开机自启
defaultNAT 网络可用
下一步:虚拟机创建与管理 将深入讲解虚拟机的创建流程、配置参数和生命周期管理。
参考与延伸
根据技术笔记重新整理,示例使用通用名称。