3、QEMU安装与配置:从源码编译QEMU、启用调试支持、验证QEMU版本
QEMU 是内核调试环境的核心组件,它模拟目标硬件平台并内置 GDB 调试桩(stub),使得 kgdb 能够通过远程串口或 TCP 连接与 QEMU 通信。本章将指导你从源码编译 QEMU,确保启用调试支持,并验证版本正确性。
3.1 为什么从源码编译 QEMU?
大多数发行版提供的 QEMU 二进制包(如 qemu-system-x86_64)默认未启用 --enable-debug 或 --enable-gdbstub 等调试特性,或者版本较旧,无法支持最新的内核调试功能。从源码编译可以精确控制以下关键选项:
| 编译选项 | 作用 | 调试环境要求 |
|---|---|---|
--enable-debug |
启用 QEMU 自身的调试符号和断言检查 | 必须 |
--enable-gdbstub |
开启 GDB 远程调试桩支持(默认已开启) | 必须 |
--enable-kvm |
启用 KVM 硬件加速(宿主机支持时) | 推荐 |
--target-list |
指定目标架构,减少编译时间 | 按需 |
提示: 如果宿主机 CPU 支持虚拟化(Intel VT-x / AMD-V),务必启用
--enable-kvm,否则内核在 QEMU 中运行速度极慢,影响调试体验。
3.2 编译前的依赖安装
在编译 QEMU 之前,需要安装必要的构建工具和库。以下命令基于 Ubuntu/Debian 系统:
sudo apt update
sudo apt install -y \
build-essential \
git \
python3 \
python3-pip \
ninja-build \
pkg-config \
libglib2.0-dev \
libpixman-1-dev \
libsdl2-dev \
libslirp-dev \
libcapstone-dev \
libfdt-dev \
zlib1g-dev \
libaio-dev \
libncurses-dev \
libcurl4-openssl-dev \
libbz2-dev \
liblzo2-dev \
libsnappy-dev \
libattr1-dev \
libcap-ng-dev \
libseccomp-dev \
libgnutls28-dev \
libnfs-dev \
libiscsi-dev \
librbd-dev \
libspice-server-dev \
libusb-1.0-0-dev \
libudev-dev \
libpmem-dev \
libdaxctl-dev \
libnuma-dev
注意: 如果使用其他发行版(如 Fedora、Arch Linux),请使用对应的包管理器安装等效依赖包。缺少
libglib2.0-dev 或 libpixman-1-dev 会导致编译失败。
3.3 下载 QEMU 源码
从 QEMU 官方 Git 仓库获取最新稳定版源码:
git clone https://gitlab.com/qemu-project/qemu.git
cd qemu
git checkout stable-8.2 # 建议使用 LTS 或稳定分支
你也可以从 https://download.qemu.org/ 下载 tar 压缩包,但 Git 方式便于后续更新和切换分支。
3.4 配置与编译
创建一个独立的构建目录,在构建目录中运行 configure 脚本,并指定调试相关选项:
mkdir build
cd build
../configure \
--enable-debug \
--enable-gdbstub \
--enable-kvm \
--enable-slirp \
--target-list=x86_64-softmmu \
--prefix=/opt/qemu-debug
make -j$(nproc)
sudo make install
参数说明:
--enable-debug:编译 QEMU 时包含调试符号(-O0 -g),便于后续分析 QEMU 自身问题。--enable-gdbstub:确保 GDB 远程调试桩被编译进 QEMU。--target-list=x86_64-softmmu:仅编译 x86_64 系统模拟器,大幅缩短编译时间。--prefix=/opt/qemu-debug:安装到独立目录,避免与系统 QEMU 冲突。
编译耗时参考: 在 8 核 CPU、16GB 内存的机器上,编译 x86_64-softmmu 目标约需 10~15 分钟。如果编译全部目标,耗时可能超过 1 小时。
3.5 验证 QEMU 版本与调试支持
安装完成后,验证 QEMU 版本及调试特性是否生效:
/opt/qemu-debug/bin/qemu-system-x86_64 --version
输出示例:
QEMU emulator version 8.2.0 (v8.2.0)
Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers
检查 GDB 调试桩是否可用:
/opt/qemu-debug/bin/qemu-system-x86_64 -gdb ?
如果输出包含 -gdb dev 或 -gdb tcp::PORT 等帮助信息,说明调试桩已启用。
进一步确认 QEMU 是否包含调试符号:
file /opt/qemu-debug/bin/qemu-system-x86_64
# 输出应包含 "not stripped" 或 "debug_info"
3.6 QEMU 调试架构概览
下图展示了 QEMU 与 GDB/kgdb 之间的调试通信架构:
3.7 常见编译问题与解决
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
ERROR: glib-2.56 gthread-2.0 is required to compile QEMU |
缺少 glib2.0 开发库 | 安装 libglib2.0-dev |
ERROR: pixman >= 0.21.8 required |
缺少 pixman 库 | 安装 libpixman-1-dev |
ERROR: ninja not found |
缺少 Ninja 构建工具 | 安装 ninja-build |
../configure: line 86: python3: command not found |
缺少 Python3 | 安装 python3 |
qemu-system-x86_64: -gdb: invalid option |
编译时未启用 gdbstub | 重新配置时添加 --enable-gdbstub |
3.8 设置环境变量
为了方便使用,将 QEMU 安装路径添加到 PATH 环境变量:
echo 'export PATH=/opt/qemu-debug/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
验证环境变量生效:
which qemu-system-x86_64
# 输出应为 /opt/qemu-debug/bin/qemu-system-x86_64
建议: 保留系统自带的 QEMU 包,仅在调试内核时使用
/opt/qemu-debug/bin/qemu-system-x86_64 绝对路径,避免影响其他虚拟化工作负载。
3.9 本章小结
通过从源码编译 QEMU 并启用 --enable-debug 和 --enable-gdbstub,我们获得了完全可控的调试模拟器。验证版本和调试桩可用性后,QEMU 已准备好与 GDB/kgdb 协同工作。下一阶段将配置内核编译选项,使其支持 kgdb 调试。