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 之间的调试通信架构:

QEMU 调试架构图 QEMU 调试架构:GDB/kgdb 远程调试链路 宿主机(Host) GDB 客户端 (gdb) target remote :1234 QEMU 系统模拟器 qemu-system-x86_64 -gdb tcp::1234 TCP 连接 (localhost:1234) GDB Stub CPU 模拟器 设备模型 内存管理 GDB 通过 TCP 连接到 QEMU 的 GDB Stub,Stub 控制 CPU 模拟器执行暂停、单步、读写内存等操作

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 调试。