2. 环境准备:宿主机操作系统与必要软件包

搭建 QEMU + kgdb 联调环境的第一步是准备一台功能完备的宿主机。宿主机承载内核编译、QEMU 虚拟化运行以及 GDB 调试会话,其软件栈的完整性直接影响后续调试效率。本节将明确操作系统选型理由,并逐一安装核心工具链。

2.1 宿主机操作系统选择:Ubuntu 22.04 LTS

本课程选用 Ubuntu 22.04 LTS (Jammy Jellyfish) 作为宿主机操作系统,主要基于以下考量:

评估维度 Ubuntu 22.04 LTS 其他发行版对比
内核版本 默认 5.15 LTS,兼容性广 较新内核可能引入 kgdb 适配问题
软件包新鲜度 GCC 11.x、GDB 12.x、QEMU 7.x 过旧版本缺少 gdb-multiarch 支持
LTS 支持周期 5 年安全更新(至 2027) 非 LTS 版本需频繁升级
社区生态 内核调试文档丰富,问题响应快 小众发行版需自行排查依赖
虚拟化支持 KVM 开箱即用,嵌套虚拟化稳定 部分发行版需额外配置内核模块
提示: 若你使用其他 Ubuntu 版本(如 20.04 或 24.04),大部分步骤仍然适用,但需注意软件包版本差异。建议在虚拟机或独立分区中搭建环境,避免影响生产系统。

2.2 必要软件包清单与安装

以下软件包构成调试环境的基础。按功能分组列出,便于理解每项工具的用途:

类别 软件包名 作用说明
编译工具链 build-essential 包含 GCC、G++、make 等内核编译必需工具
libncurses-dev 提供 menuconfig 图形化配置界面
调试器 gdb-multiarch 支持多架构(x86_64、ARM64、RISC-V)的 GDB
gdbserver 远程调试场景的 stub 服务端(kgdb 可选)
虚拟化 qemu-system-x86 x86_64 架构的 QEMU 系统模拟器
qemu-utils 提供 qemu-img 等磁盘镜像管理工具
版本控制 git 获取内核源码、管理补丁
文件系统 cpio fakeroot 制作 initramfs 根文件系统

2.2.1 一键安装命令

在终端中执行以下命令,一次性安装所有必要软件包:

sudo apt update
sudo apt install -y \
    build-essential \
    libncurses-dev \
    gdb-multiarch \
    gdbserver \
    qemu-system-x86 \
    qemu-utils \
    git \
    cpio \
    fakeroot
验证安装: 安装完成后,运行 gdb-multiarch --version 应显示 GDB 版本信息;运行 qemu-system-x86_64 --version 应显示 QEMU 版本。若命令未找到,请检查 $PATH 或重新安装对应包。

2.3 软件包版本确认

不同版本的 GDB 和 QEMU 在 kgdb 联调时的行为略有差异。建议记录当前版本,以便后续排查兼容性问题:

# 查看关键工具版本
echo "=== GCC ===" && gcc --version | head -n1
echo "=== GDB ===" && gdb-multiarch --version | head -n1
echo "=== QEMU ===" && qemu-system-x86_64 --version | head -n1
echo "=== Git ===" && git --version

预期输出示例(实际版本可能因更新而异):

=== GCC ===
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
=== GDB ===
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1
=== QEMU ===
QEMU emulator version 7.2.0 (qemu-7.2.0)
=== Git ===
git version 2.34.1

2.4 环境依赖关系总览

下图展示了宿主机上各软件组件之间的依赖与协作关系,帮助理解后续章节中每一步操作所处的生态位置:

宿主机调试环境软件栈依赖关系 Ubuntu 22.04 LTS 宿主机 build-essential gdb-multiarch qemu-system-x86 libncurses-dev git / cpio / fakeroot qemu-utils QEMU 虚拟机(调试目标内核) 说明:GDB 通过 kgdb 协议与 QEMU 内嵌的 gdbstub 通信,实现对内核源码级的单步调试与断点设置。 编译工具链负责生成带调试符号(-g)的内核镜像,git 用于管理内核源码版本。

2.5 常见问题与避坑指南

  • gdb-multiarch 缺失: 若 apt install gdb-multiarch 提示找不到包,请先执行 sudo apt update 并确保 Ubuntu 22.04 的 universe 仓库已启用。
  • QEMU 版本过旧: Ubuntu 22.04 默认仓库提供 QEMU 7.2,若需更新版本,可添加 ppa:jacob/virtualisation PPA 源。
  • 权限问题: 使用 qemu-system-x86_64 时若提示 Permission denied,请确认当前用户已加入 kvm 用户组:sudo usermod -aG kvm $USER,然后重新登录。
  • 内核编译依赖: 除 build-essential 外,编译内核还需 flex、bison、elfutils 等工具,后续章节会补充安装。
注意: 不要使用 apt install gdb 替代 gdb-multiarch。普通 gdb 仅支持宿主机本地架构,而 gdb-multiarch 支持交叉调试(例如在 x86_64 宿主机上调试 ARM64 内核),这是 kgdb 联调场景的必备能力。

2.6 环境就绪检查清单

完成上述安装后,逐项核对以下清单,确保环境完全就绪:

检查项 验证命令 预期结果
GCC 可用 gcc --version 显示版本号 ≥ 11.x
GDB 多架构支持 gdb-multiarch --configuration 输出包含 --enable-targets=all
QEMU 系统模拟 qemu-system-x86_64 --machine help 列出支持的机器类型列表
Git 可用 git --version 显示版本号 ≥ 2.34
内核源码准备 ls /usr/src/linux-* 或自定义路径 存在内核源码目录(后续章节下载)