完全可以,而且这也是 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.shrun.shgdbinitQEMU启动脚本
这样以后无论重建环境还是升级到新的 6.6.x LTS,都可以一键恢复整个内核实验环境。