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:帮助信息。写清楚这个选项干嘛用的
小技巧:我个人习惯在写Kconfig时,把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类型有效)
  • ?:查看帮助
  • /:搜索选项
核心经验:搜索功能(/)是我用得最多的。几千个选项,你不可能一个个翻。直接搜“USB”或“EXT4”,快得多。

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) — 低延迟,实时性要求高
注意:Processor family选错了,内核可能无法启动。比如你选了“Intel Core 2”却在最新的i7上跑,虽然能跑,但优化不到位。反过来,选了太新的型号在老CPU上跑,直接崩。

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备份一份,命名为config_项目名_日期。这样万一搞崩了,还能快速恢复。

还有一个常用命令是make savedefconfig

make savedefconfig

它会生成一个最小化的配置文件defconfig,只包含你修改过的选项。这个文件特别适合版本管理——别人一看就知道你改了哪些地方。

4.5 本章小结

内核配置系统,说白了就是三件事:

  1. Kconfig:定义选项的语法
  2. menuconfig:图形化配置工具
  3. .config:最终的配置文件

搞懂了这三样,你就能随心所欲地裁剪内核了。我见过很多新手一上来就make defconfig,然后直接编译。结果跑起来发现缺这缺那。其实花10分钟配一下,后面能省几小时。

嗯,下一节我们聊聊编译系统。不过那是后话了。


公众号:蓝海资料掘金营,微信deep3321