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/Ubuntu | apt | qemu-system, qemu-utils | ✅ 默认内核包含 |
| Fedora/RHEL | dnf | qemu-kvm, qemu-img | ✅ 默认内核包含 |
| Arch Linux | pacman | qemu-full | ✅ 默认内核包含 |
| openSUSE | zypper | qemu-kvm, qemu-tools | ✅ 默认内核包含 |
| macOS | brew | qemu | ❌ 不支持 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。