4、内核配置系统:Kconfig语法基础、make menuconfig图形化配置、配置选项详解(General setup, Processor type等)、保存与加载配置文件
内核配置,说白了就是给Linux内核“选菜”。
你要什么功能,不要什么功能,全在这一步定下来。我刚开始接触内核时,觉得这步最烦人——几千个选项,看得眼花。但后来我发现,搞懂了Kconfig和menuconfig,整个内核的骨架也就摸清了。
4.1 Kconfig语法基础
Kconfig是内核配置的“语法规则”。它定义了一个选项长什么样,依赖什么,默认值是什么。
你想想看,如果没有这套规则,几千个配置项怎么管理?
一个典型的Kconfig条目长这样:
config CONFIG_EXAMPLE
bool "Enable example feature"
depends on CONFIG_SOME_OTHER
default y
help
This is an example configuration option.
Say Y here if you want to enable this feature.
我来拆解一下:
- config:关键字,声明一个配置项
- bool:类型,表示“是/否”开关。还有tristate(三态:Y/N/M)、int、string等
- depends on:依赖关系。如果依赖项没选,这个选项不会出现
- default y:默认值。我习惯把常用功能默认打开,省得每次都要手动选
- help:帮助信息。写清楚这个选项干嘛用的
还有一种常见写法是choice,用于互斥选项:
choice
prompt "CPU frequency scaling governor"
default CPU_FREQ_GOV_PERFORMANCE
config CPU_FREQ_GOV_PERFORMANCE
bool "Performance"
config CPU_FREQ_GOV_POWERSAVE
bool "Powersave"
endchoice
嗯,这里要注意:choice里的选项只能选一个。我在项目中遇到过有人把两个都选了,结果编译报错——其实Kconfig根本不允许这种事发生。
4.2 make menuconfig图形化配置
光看Kconfig文件太抽象了。实际干活时,我们用的是make menuconfig。
运行它之前,确保你装了ncurses库:
sudo apt-get install libncurses-dev
make menuconfig
界面一出来,你会看到类似这样的结构:
- General setup — 通用设置
- Processor type and features — 处理器类型
- Power management and ACPI — 电源管理
- Networking support — 网络支持
- Device Drivers — 设备驱动
- File systems — 文件系统
- ...
操作很简单:
- 方向键:上下移动
- Enter:进入子菜单
- Y:选中(编译进内核)
- N:不选
- M:编译成模块(仅对tristate类型有效)
- ?:查看帮助
- /:搜索选项
4.3 配置选项详解
下面我挑几个最重要的配置区域,说说我的理解。
4.3.1 General setup
这是“通用设置”。里面有些选项很关键:
| 选项 | 说明 | 我的建议 |
|---|---|---|
| Local version | 给内核版本加后缀 | 写上你的项目名,方便区分 |
| Kernel compression mode | 内核镜像压缩方式 | 默认gzip就行,除非你特别在意解压速度 |
| System V IPC | 进程间通信支持 | 大部分应用需要,建议开启 |
| POSIX Message Queues | 消息队列 | 如果你用到了mq_*系列函数,就打开 |
我曾经在一个嵌入式项目里,为了省空间把System V IPC关了。结果跑某个中间件时,它死活起不来。查了半天,发现它内部用了信号量。嗯,从那以后我再也不敢乱关这个选项了。
4.3.2 Processor type and features
这个区域决定了你的内核为哪种CPU优化。
- Subarchitecture Type:比如PC标准、AMD、Intel等
- Processor family:具体到哪一代CPU
- Symmetric multi-processing support:多核支持
- Preemption Model:抢占模式
- No Forced Preemption (Server) — 服务器用,吞吐量优先
- Voluntary Kernel Preemption (Desktop) — 桌面用,响应适中
- Preemptible Kernel (Low-Latency Desktop) — 低延迟,实时性要求高
4.3.3 其他常用区域
简单列一下:
- Device Drivers:驱动全在这。我一般只选自己硬件需要的,其他的统统不选
- File systems:ext4、btrfs、xfs等。嵌入式常用jffs2或squashfs
- Networking support:协议栈。如果你做路由器,这里要仔细配
- Kernel hacking:调试选项。开发阶段全开,发布时全关
4.4 保存与加载配置文件
配置完了,怎么保存?
在menuconfig界面里,选择Save,默认保存为.config。这个文件就在内核源码根目录下。
你也可以手动操作:
# 保存当前配置
cp .config my_kernel_config
# 加载已有配置
cp my_kernel_config .config
make olddefconfig # 用默认值填充新增选项
为什么要用olddefconfig?
因为内核版本升级后,可能会有新选项。直接编译会问你“这个新选项选什么?”。olddefconfig会自动用默认值填上,省得你一个个回答。
config_项目名_日期。这样万一搞崩了,还能快速恢复。
还有一个常用命令是make savedefconfig:
make savedefconfig
它会生成一个最小化的配置文件defconfig,只包含你修改过的选项。这个文件特别适合版本管理——别人一看就知道你改了哪些地方。
4.5 本章小结
内核配置系统,说白了就是三件事:
- Kconfig:定义选项的语法
- menuconfig:图形化配置工具
- .config:最终的配置文件
搞懂了这三样,你就能随心所欲地裁剪内核了。我见过很多新手一上来就make defconfig,然后直接编译。结果跑起来发现缺这缺那。其实花10分钟配一下,后面能省几小时。
嗯,下一节我们聊聊编译系统。不过那是后话了。
公众号:蓝海资料掘金营,微信deep3321