3. 配置内核选项:make config/menuconfig/xconfig/gconfig的区别
内核编译的第一步是什么?不是直接敲 make,而是先配置内核。这一步决定了你的内核支持哪些硬件、文件系统、网络协议等等。说白了,就是告诉内核:「你要长成什么样子」。
我刚开始接触内核时,觉得配置这一步特别麻烦。后来才发现,配置选对了,后面编译、调试能省一大半时间。今天我们就来聊聊内核配置的几种方式,以及它们之间的区别。
3.1 四种配置工具:选哪个?
Linux 内核提供了四种配置界面,分别是:
| 命令 | 界面类型 | 适用场景 |
|---|---|---|
make config |
命令行问答式 | 脚本自动化、最小化配置 |
make menuconfig |
基于 ncurses 的文本菜单 | SSH 远程、无图形环境 |
make xconfig |
基于 Qt 的图形界面 | 桌面环境、习惯图形操作 |
make gconfig |
基于 GTK+ 的图形界面 | 桌面环境、GTK 偏好者 |
我个人习惯用 make menuconfig。为什么?因为它不依赖图形桌面,SSH 到服务器上也能用。而且操作简单,上下键选菜单,空格键切换状态,Y/N/M 三个字母搞定一切。
至于 make config,我只有在写自动化脚本时才会用。它会一个接一个地问你几百个问题,手动回答能把你逼疯。我曾经试过一次,按了半小时回车还没结束……嗯,从那以后我再也没手动用过它。
make xconfig 和 make gconfig 界面更友好,有搜索功能,还能显示依赖关系图。但前提是你得装好 Qt 或 GTK 的开发库。嵌入式开发中,很多时候服务器上根本没有图形环境,所以这两个用得少。
3.2 配置选项的三种状态
每个内核配置项都有三种状态,用 menuconfig 操作时,按空格键循环切换:
- Y(编译进内核):功能直接集成到内核镜像中,启动时自动加载。适合必须用到的功能,比如 CPU 调度、内存管理。
- M(编译为模块):功能编译成独立的
.ko文件,需要时再用modprobe加载。适合驱动、文件系统等可选功能。 - N(不编译):完全不要这个功能。省空间、省编译时间。
3.3 配置依赖关系:选一个,带一串
内核配置项之间不是孤立的。你选了一个功能,它可能依赖其他功能。比如你要用 EXT4 文件系统,它依赖 BLOCK 层、CRC16、JBD2 等。
在 menuconfig 中,如果你选了一个选项,它依赖的选项会自动被选中。反过来,如果你取消了一个依赖项,依赖它的选项也会被自动取消。这就是内核的「依赖关系自动处理」机制。
我曾经踩过一个坑:手动修改 .config 文件,把某个驱动设为 Y,但没注意到它依赖的 I2C 子系统被设成了 N。结果编译时报了一堆错,查了半天才发现是依赖没满足。所以,尽量用 menuconfig 来配置,别手改 .config。
select 和 depends on 实现。搞不清楚时,按 ? 键查看帮助信息。
3.4 保存与加载配置文件
配置完成后,内核会生成一个 .config 文件,保存在内核源码根目录下。这个文件就是你的「配置快照」。
保存配置:
# 保存当前配置
cp .config my_kernel_config
# 或者用内核自带的命令
make savedefconfig # 生成最小化的 defconfig 文件
加载配置:
# 从备份恢复
cp my_kernel_config .config
# 或者用默认配置
make defconfig # 加载架构默认配置
make allyesconfig # 所有选项设为 Y(测试用)
make allnoconfig # 所有选项设为 N(最小化)
我个人的工作流是这样的:先 make defconfig 加载架构默认配置,然后 make menuconfig 手动调整需要的功能。调整完后,cp .config config_my_board 保存一份。下次编译时直接 cp config_my_board .config,省得重新选。
.config。结果新内核新增了一些配置项,旧文件里没有,编译时用了默认值,导致某些功能没打开。所以,跨版本升级时,建议用 make oldconfig 来更新配置,它会问你新增的选项怎么选。
3.5 知识体系图
下面这张图总结了内核配置的核心逻辑:
这张图把整个配置流程串起来了。你从左边选工具,中间选选项,内核自动处理依赖,最后生成 .config。保存和加载就是对这个文件的备份和恢复操作。
3.6 小结
配置内核其实没那么玄乎。记住三点:
- 用
menuconfig最稳妥,别手改.config - Y/M/N 三种状态要分清,模块化是嵌入式优化的关键
- 依赖关系交给内核自动处理,别自作聪明
配置选好了,编译就成功了一半。下一节我们聊聊编译过程中那些让人头疼的错误,以及怎么快速定位问题。
可可精品资料库