通过配置文件配置kernel

完全可以,而且这也是 Linux 内核开发者最常用的方法。

实际上,很少有人在 menuconfig 里面一个一个找选项。常用的方法有下面四种,我推荐第 2 或第 3 种。


方法一:直接修改 .config(最简单)

例如:

bash 复制代码
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_DWARF5=y
CONFIG_GDB_SCRIPTS=y
CONFIG_FTRACE=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
CONFIG_KPROBES=y
CONFIG_MODULES=y
CONFIG_BLK_DEV_INITRD=y

修改完成后执行:

bash 复制代码
make olddefconfig

内核会自动补齐依赖。

缺点:

  • 容易写错
  • 容易漏依赖
  • 不适合大量配置

方法二:官方 scripts/config(★★★★★ 推荐)

Linux 内核源码自带了一个配置工具:

bash 复制代码
scripts/config

例如:

bash 复制代码
scripts/config --enable CONFIG_DEBUG_INFO
scripts/config --enable CONFIG_DEBUG_INFO_DWARF5
scripts/config --enable CONFIG_GDB_SCRIPTS

scripts/config --enable CONFIG_FTRACE
scripts/config --enable CONFIG_FUNCTION_TRACER
scripts/config --enable CONFIG_FUNCTION_GRAPH_TRACER

scripts/config --enable CONFIG_KPROBES

scripts/config --enable CONFIG_MODULES
scripts/config --enable CONFIG_MODULE_UNLOAD

scripts/config --enable CONFIG_BLK_DEV_INITRD

如果需要关闭:

bash 复制代码
scripts/config --disable CONFIG_RANDOMIZE_BASE

如果需要指定字符串:

bash 复制代码
scripts/config --set-str CONFIG_LOCALVERSION "-lk-lab"

执行完成:

bash 复制代码
make olddefconfig

这是 Kernel CI 和很多自动化脚本都会使用的方法。


方法三:维护一个配置片段(★★★★★ 我最推荐)

例如建立:

复制代码
configs/debug.config

内容:

text 复制代码
CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_DWARF5=y
CONFIG_GDB_SCRIPTS=y

CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_FRAME_POINTER=y

CONFIG_FTRACE=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y

CONFIG_KPROBES=y

CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y

CONFIG_BLK_DEV_INITRD=y

CONFIG_DEBUG_FS=y

CONFIG_MAGIC_SYSRQ=y

然后利用内核提供的脚本合并:

bash 复制代码
scripts/kconfig/merge_config.sh \
    arch/x86/configs/x86_64_defconfig \
    configs/debug.config

最后:

bash 复制代码
make olddefconfig

优点:

  • 配置可以放 Git 管理
  • 换任何 Linux 版本都能复用
  • 非常适合长期学习

很多内核团队都是这样维护不同用途的配置(debug、CI、release)。


方法四:生成最小配置(适合长期维护)

如果已经有一个配置:

bash 复制代码
make savedefconfig

会生成:

复制代码
defconfig

里面只保留:

和默认配置不同的部分

通常几百行会压缩到几十行。

以后恢复:

bash 复制代码
cp defconfig arch/x86/configs/lklab_defconfig

make lklab_defconfig

我的建议(适合你的 Kernel Lab)

结合你的目标(长期学习 Linux Kernel + QEMU + GDB + Ftrace + Module),我建议建立下面的目录:

text 复制代码
lk-lab/
├── kernel/
├── configs/
│   ├── debug.config        <-- 调试增强配置
│   ├── release.config
│   └── lklab_defconfig
├── scripts/
│   ├── config.sh           <-- 一键开启配置
│   ├── build.sh
│   └── run.sh

其中 scripts/config.sh

bash 复制代码
#!/bin/bash
set -e

cd kernel

scripts/config --enable CONFIG_DEBUG_KERNEL
scripts/config --enable CONFIG_DEBUG_INFO
scripts/config --enable CONFIG_DEBUG_INFO_DWARF5
scripts/config --enable CONFIG_GDB_SCRIPTS

scripts/config --enable CONFIG_KALLSYMS
scripts/config --enable CONFIG_KALLSYMS_ALL
scripts/config --enable CONFIG_FRAME_POINTER

scripts/config --enable CONFIG_FTRACE
scripts/config --enable CONFIG_FUNCTION_TRACER
scripts/config --enable CONFIG_FUNCTION_GRAPH_TRACER

scripts/config --enable CONFIG_KPROBES

scripts/config --enable CONFIG_MODULES
scripts/config --enable CONFIG_MODULE_UNLOAD

scripts/config --enable CONFIG_DEBUG_FS
scripts/config --enable CONFIG_BLK_DEV_INITRD

make olddefconfig

以后只需要执行:

bash 复制代码
./scripts/config.sh

整个调试环境就配置好了,不需要再打开 menuconfig

我建议我们下一步直接做

既然你准备长期学习 Linux 内核,我建议不要每次自己配置

我们可以制作一个 Linux 6.6 Kernel Lab 配置包,包含:

  • debug.config(约 100~200 个学习内核最常用的配置)
  • config.sh(一键开启)
  • build.sh
  • run.sh
  • gdbinit
  • QEMU 启动脚本

这样以后无论重建环境还是升级到新的 6.6.x LTS,都可以一键恢复整个内核实验环境。