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

QEMU 虚拟化完全指南 / 02 - 安装与配置

02 - 安装与配置

在各主流 Linux 发行版上安装 QEMU,配置 KVM 加速、用户权限、桥接网络,以及从源码编译的完整流程。


2.1 各平台安装

Debian / Ubuntu

# 基础安装(全系统仿真 + 用户模式 + 工具)
sudo apt update
sudo apt install -y qemu-system qemu-user qemu-utils

# 安装特定架构支持
sudo apt install -y qemu-system-arm qemu-system-misc qemu-system-x86

# 安装 UEFI 固件(ARM64 虚拟机需要)
sudo apt install -y qemu-efi-aarch64

# 验证安装
qemu-system-x86_64 --version
qemu-img --version

Fedora / RHEL / CentOS Stream

# 基础安装
sudo dnf install -y @virtualization

# 或者只安装 QEMU 组件
sudo dnf install -y qemu-kvm qemu-img qemu-kvm-core

# 安装 libvirt 管理层(推荐)
sudo dnf install -y libvirt virt-install virt-manager

# 启动并启用 libvirtd
sudo systemctl enable --now libvirtd
sudo systemctl start libvirtd

Arch Linux

# 基础安装
sudo pacman -S qemu-full

# 仅安装特定架构
sudo pacman -S qemu-system-x86 qemu-system-arm qemu-img

# 安装 UEFI 固件
sudo pacman -S edk2-ovmf  # x86_64 UEFI
sudo pacman -S edk2-armvirt  # ARM UEFI

# 安装 libvirt(可选)
sudo pacman -S libvirt virt-manager dnsmasq

# 启动 libvirt
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $(whoami)

openSUSE

# 安装 QEMU 和 KVM
sudo zypper install -y qemu-kvm qemu-tools qemu-x86

# 安装 libvirt 管理套件
sudo zypper install -y libvirt virt-manager

sudo systemctl enable --now libvirtd

macOS(实验性)

# 使用 Homebrew 安装(仅用户模式仿真)
brew install qemu

# 验证
qemu-system-x86_64 --version
qemu-aarch64 --version

注意: macOS 上 QEMU 仅支持用户模式仿真和 TCG 全系统仿真(无 KVM 加速)。性能有限,仅适用于开发测试。

各平台安装总结

平台包管理器核心包KVM 支持
Debian/Ubuntuaptqemu-system, qemu-utils✅ 默认内核包含
Fedora/RHELdnfqemu-kvm, qemu-img✅ 默认内核包含
Arch Linuxpacmanqemu-full✅ 默认内核包含
openSUSEzypperqemu-kvm, qemu-tools✅ 默认内核包含
macOSbrewqemu❌ 不支持 KVM
Windows-WHPX (实验)⚠️ 有限支持

2.2 KVM 配置

验证 KVM 支持

# 检查 CPU 虚拟化扩展
grep -E '(vmx|svm)' /proc/cpuinfo | head -1

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

# 如果没有输出,手动加载模块
# Intel CPU
sudo modprobe kvm_intel

# AMD CPU
sudo modprobe kvm_amd

# 验证 KVM 设备文件
ls -la /dev/kvm

设置 KVM 模块自动加载

# 创建模块自动加载配置
cat << 'EOF' | sudo tee /etc/modules-load.d/kvm.conf
# KVM 模块 - 根据 CPU 型号选择
# Intel CPU
kvm_intel

# AMD CPU (取消注释并注释掉 kvm_intel)
# kvm_amd
EOF

# 设置模块参数(可选)
cat << 'EOF' | sudo tee /etc/modprobe.d/kvm.conf
# 启用嵌套虚拟化
# Intel
options kvm_intel nested=1

# AMD
# options kvm_amd nested=1
EOF

# 重新加载模块
sudo modprobe -r kvm_intel && sudo modprobe kvm_intel

验证 KVM 加速

# 使用 QEMU 测试 KVM 加速是否生效
qemu-system-x86_64 -machine accel=kvm:tcg -cpu help 2>&1 | head -5

# 检查加速器状态
qemu-system-x86_64 -machine accel=kvm -cpu host -nographic \
  -monitor none -serial none -display none \
  -device isa-debug-exit,iobase=0xf4,iosize=0x04 \
  2>&1 | grep -i "accel"

# 更直观的方法 - 运行一个简单虚拟机看是否有 KVM
qemu-system-x86_64 -machine accel=kvm -cpu host -m 256 \
  -nographic -serial none -monitor stdio \
  <<<'info status' 2>/dev/null || echo "KVM 不可用"

2.3 用户权限配置

添加用户到 KVM 组

# 将当前用户添加到 kvm 组
sudo usermod -aG kvm $(whoami)

# 将当前用户添加到 libvirt 组(如果安装了 libvirt)
sudo usermod -aG libvirt $(whoami)

# 验证组成员
groups $(whoami)

# 需要重新登录或运行以下命令使组生效
newgrp kvm

设置 KVM 设备权限

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

# 如果权限不正确,设置 udev 规则
cat << 'EOF' | sudo tee /etc/udev/rules.d/99-kvm.rules
KERNEL=="kvm", GROUP="kvm", MODE="0660", OPTIONS+="static_node=kvm"
EOF

# 重新加载 udev 规则
sudo udevadm control --reload-rules
sudo udevadm trigger

使用 sudo 运行 QEMU(不推荐)

如果无法修改组权限,可以临时使用 sudo:

# 不推荐,但可用于快速测试
sudo qemu-system-x86_64 -m 1G -hda test.qcow2 -enable-kvm

注意: 使用 root 权限运行 QEMU 存在安全风险。推荐通过组权限或 libvirt 来管理访问控制。


2.4 桥接网络配置

使用 netctl 配置桥接(通用方法)

# 安装 bridge-utils
sudo apt install -y bridge-utils  # Debian/Ubuntu
sudo dnf install -y bridge-utils  # Fedora
sudo pacman -S bridge-utils       # Arch

# 创建桥接接口
sudo ip link add br0 type bridge
sudo ip link set br0 up

# 将物理网卡加入桥接(会中断网络连接!)
sudo ip link set enp0s3 master br0

# 为桥接分配 IP
sudo ip addr add 192.168.1.100/24 dev br0
sudo ip route add default via 192.168.1.1 dev br0

使用 netplan 配置桥接(Ubuntu 18.04+)

# /etc/netplan/01-bridge.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: false
  bridges:
    br0:
      interfaces: [enp0s3]
      dhcp4: true
      parameters:
        stp: false
        forward-delay: 0
# 应用配置
sudo netplan apply

使用 NetworkManager 配置桥接

# 创建桥接连接
sudo nmcli connection add type bridge ifname br0 con-name br0

# 设置桥接 IP
sudo nmcli connection modify br0 ipv4.addresses 192.168.1.100/24
sudo nmcli connection modify br0 ipv4.gateway 192.168.1.1
sudo nmcli connection modify br0 ipv4.method manual

# 将物理网卡绑定到桥接
sudo nmcli connection add type ethernet ifname enp0s3 \
  master br0 con-name br0-slave

# 启用桥接
sudo nmcli connection up br0
sudo nmcli connection up br0-slave

桥接网络验证

# 查看桥接接口状态
bridge link show
ip addr show br0

# 测试桥接是否工作
ping -I br0 192.168.1.1

# 使用桥接启动虚拟机
qemu-system-x86_64 \
  -m 2G \
  -drive file=vm.qcow2,format=qcow2 \
  -net nic,model=virtio \
  -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown

QEMU 桥接脚本

# /etc/qemu-ifup
#!/bin/bash
switch=br0
if [ -n "$1" ]; then
    sudo ip link set $1 up
    sudo ip link set $1 master ${switch}
    echo "Added $1 to bridge ${switch}"
fi
# /etc/qemu-ifdown
#!/bin/bash
switch=br0
if [ -n "$1" ]; then
    sudo ip link set $1 nomaster
    sudo ip link set $1 down
    echo "Removed $1 from bridge ${switch}"
fi
# 设置脚本权限
sudo chmod +x /etc/qemu-ifup /etc/qemu-ifdown

# 允许用户无需密码执行 ip 命令(安全性考虑)
echo "$(whoami) ALL=(ALL) NOPASSWD: /usr/bin/ip" | \
  sudo tee /etc/sudoers.d/qemu-bridge

2.5 从源码编译 QEMU

安装编译依赖

# Debian/Ubuntu
sudo apt install -y \
  git build-essential ninja-build meson \
  libglib2.0-dev libpixman-1-dev \
  zlib1g-dev libfdt-dev \
  libslirp-dev \
  libspice-server-dev libspice-protocol-dev \
  libusb-1.0-0-dev libusbredirparser-dev \
  libncurses-dev libgnutls28-dev \
  libaio-dev liburing-dev \
  libcap-ng-dev libattr1-dev \
  dtc-tools

# Fedora/RHEL
sudo dnf install -y \
  git gcc gcc-c++ make ninja-build meson \
  glib2-devel pixman-devel \
  zlib-devel dtc-devel libslirp-devel \
  spice-server-devel spice-protocol-devel \
  libusb1-devel \
  ncurses-devel gnutls-devel \
  libaio-devel liburing-devel \
  libcap-ng-devel libattr-devel

下载源码并编译

# 克隆 QEMU 源码
git clone https://gitlab.com/qemu-project/qemu.git
cd qemu

# 查看可用的版本标签
git tag -l | sort -V | tail -10

# 切换到稳定版(推荐)
git checkout v9.0.0

# 初始化子模块
git submodule update --init --recursive

# 配置编译选项
./configure \
  --target-list=x86_64-softmmu,x86_64-linux-user,aarch64-softmmu,aarch64-linux-user \
  --enable-kvm \
  --enable-spice \
  --enable-usb-redir \
  --enable-slirp \
  --enable-vhost-net \
  --enable-virtfs \
  --enable-gnutls \
  --prefix=/usr/local

# 编译(使用所有 CPU 核心)
make -j$(nproc)

# 安装
sudo make install

常用编译选项

选项说明
--target-list指定要编译的目标架构,减少编译时间
--enable-kvm启用 KVM 加速支持
--enable-spice启用 SPICE 远程桌面协议
--enable-usb-redir启用 USB 重定向
--enable-slirp启用用户模式网络栈 (替代旧的 libslirp)
--enable-vhost-net启用 vhost-net 内核网络加速
--enable-virtfs启用 VirtFS (9p) 文件系统共享
--enable-gnutls启用 TLS 加密支持
--enable-debug启用调试符号 (开发用)
--disable-werror不将警告视为错误 (编译时)
--prefix安装前缀,默认 /usr/local

查看所有编译选项

./configure --help

验证编译结果

# 检查安装的 QEMU 版本
/usr/local/bin/qemu-system-x86_64 --version

# 检查支持的加速器
/usr/local/bin/qemu-system-x86_64 -accel help

# 检查支持的目标
/usr/local/bin/qemu-system-x86_64 -machine help | head -10

2.6 SELinux / AppArmor 配置

SELinux(Fedora/RHEL)

# 检查 SELinux 状态
getenforce

# 允许 QEMU 使用自定义磁盘路径
sudo setsebool -P virt_use_nfs 1
sudo setsebool -P virt_use_samba 1

# 恢复文件上下文
sudo restorecon -Rv /var/lib/libvirt/

AppArmor(Ubuntu/Debian)

# 查看 QEMU 的 AppArmor 配置文件
cat /etc/apparmor.d/usr.lib.qemu

# 如果 QEMU 二进制路径不同,可能需要修改
# 或者将 AppArmor 设为 complain 模式(仅测试用)
sudo aa-complain /usr/sbin/libvirtd

2.7 UEFI 固件配置

x86_64 UEFI(OVMF)

# 安装 OVMF 固件
sudo apt install -y ovmf  # Debian/Ubuntu
sudo dnf install -y edk2-ovmf  # Fedora
sudo pacman -S edk2-ovmf  # Arch

# 查找固件文件位置
find /usr -name "OVMF*" -type f 2>/dev/null

# 使用 UEFI 启动虚拟机
qemu-system-x86_64 \
  -machine q35,accel=kvm \
  -cpu host \
  -m 4G \
  -bios /usr/share/OVMF/OVMF_CODE.fd \
  -drive file=vm.qcow2,format=qcow2,if=virtio \
  -boot order=c

ARM64 UEFI

# 安装 ARM64 EFI 固件
sudo apt install -y qemu-efi-aarch64  # Debian/Ubuntu

# 查找固件
ls /usr/share/AAVMF/  # Debian/Ubuntu
ls /usr/share/qemu-efi-aarch64/

# 创建可写的变量存储文件(每次启动需要独立的变量文件)
cp /usr/share/AAVMF/AAVMF_VARS.fd my_vars.fd

# 使用 UEFI 启动 ARM64 虚拟机
qemu-system-aarch64 \
  -M virt \
  -cpu cortex-a72 \
  -m 2G \
  -drive if=pflash,format=raw,readonly=on,file=/usr/share/AAVMF/AAVMF_CODE.fd \
  -drive if=pflash,format=raw,file=my_vars.fd \
  -drive file=arm64-disk.qcow2,format=qcow2,if=virtio \
  -nographic

2.8 安装验证清单

完成安装后,按以下清单逐项验证:

# 1. QEMU 版本
qemu-system-x86_64 --version

# 2. KVM 可用
ls -la /dev/kvm

# 3. 用户在 kvm 组中
groups | grep kvm

# 4. KVM 模块已加载
lsmod | grep kvm

# 5. 桥接网络可用(如果配置了)
ip link show br0 2>/dev/null && echo "桥接已配置" || echo "未配置桥接"

# 6. UEFI 固件可用
ls /usr/share/OVMF/OVMF_CODE.fd 2>/dev/null && echo "OVMF 可用" || echo "OVMF 未安装"

# 7. qemu-img 可用
qemu-img --version

要点回顾

要点核心内容
安装方式各发行版包管理器安装(推荐)或源码编译
KVM 配置加载 kvm_intel/kvm_amd 模块,确认 /dev/kvm 可用
用户权限将用户加入 kvm 组,避免使用 root
桥接网络创建 br0 桥接接口,编写 qemu-ifup/ifdown 脚本
UEFI 固件安装 OVMF (x86) 或 AAVMF (ARM),为 UEFI 启动做准备

注意事项

KVM 必须在 Linux 上使用: macOS 和 Windows 不原生支持 KVM。macOS 可以使用 HVF (Hypervisor.framework),Windows 可以使用 WHPX,但功能有限。

桥接网络风险: 将物理网卡加入桥接会导致网络短暂中断。务必通过控制台而非 SSH 进行操作,或确保有备用管理接口。

编译时间: 完整编译 QEMU 所有目标可能需要 10-30 分钟。使用 --target-list 限制目标架构可以大幅缩短编译时间。

固件版本匹配: UEFI 固件版本需要与 QEMU 版本兼容。建议使用发行版提供的固件包,避免自行编译。


扩展阅读


下一步

03 - 基本使用:学习如何创建虚拟机、安装操作系统,以及配置显示与 VNC。