3、配置工具入门:make menuconfig详解、配置保存与加载、常用配置选项

好,咱们进入第三讲。这一章我带你亲手摸一摸Buildroot的配置工具。说白了,就是那个让你选软件包、调内核参数、改文件系统大小的界面——make menuconfig

很多新手第一次跑make menuconfig,看到满屏的选项就懵了。别急,我当年也一样。记得我第一次用Buildroot,对着那个蓝底白字的界面愣了半天,不知道该点哪里。后来摸透了,发现它其实就是个带菜单的配置文件编辑器。

3.1 make menuconfig 到底是个啥?

make menuconfig 本质上是一个基于 kconfig 的图形化配置工具。Linux内核也用这套东西。你想想看,内核配置、U-Boot配置、Buildroot配置,底层都是同一套机制。

它的工作原理很简单:

  • 读取 Config.in 文件(这是配置项的声明文件)
  • 解析依赖关系和可见条件
  • 显示一个可交互的菜单界面
  • 用户选择后,生成 .config 文件

嗯,这里要注意:make menuconfig 依赖 ncurses 库。如果你的开发机没有装,会报错。我建议先跑一句:

sudo apt-get install libncurses-dev

不然你连界面都看不到,直接报错退出,挺尴尬的。

3.2 界面操作:键盘才是主角

进入界面后,你会发现鼠标完全没用。全靠键盘操作。我刚开始也觉得别扭,但用习惯了反而觉得效率高。

按键 功能
↑ ↓ 上下移动光标
Enter 进入子菜单 / 确认选择
Space 切换选项状态(选中/取消)
Y / N 直接设为内置 / 取消
M 设为模块(仅内核配置有效)
? 查看帮助信息
/ 搜索功能(这个最实用)
Tab 切换到底部按钮

我个人最常用的就是 / 搜索键。比如我想加 dropbear(一个轻量级SSH服务器),直接按 / 输入 dropbear,回车就能定位到选项位置。不用一层层翻菜单,省时间。

小技巧: 搜索时支持模糊匹配。比如搜 "ssl" 能列出所有跟SSL相关的包。我在项目中找加密库时经常这么干。

3.3 配置保存与加载:别丢了你的劳动成果

配置选了半天,万一丢了怎么办?Buildroot 提供了几种保存和加载机制。

3.3.1 默认保存

退出 make menuconfig 时,它会问你是否保存。选 Yes,配置会写入 .config 文件。这个文件就在Buildroot根目录下。

3.3.2 自定义配置文件

我习惯把不同项目的配置分开保存。比如:

# 保存当前配置到自定义文件
make savedefconfig
# 这会生成 defconfig 文件,只保存非默认值的选项

# 或者直接复制
cp .config configs/my_project_defconfig

为什么要这么做?因为 .config 文件很大,有几千行。而 defconfig 只记录你改过的选项,干净利落。我曾经有个项目,需要维护三套配置(开发版、量产版、测试版),就是用 defconfig 分开管理的。

3.3.3 加载已有配置

# 加载自定义配置
make my_project_defconfig

# 或者直接复制
cp configs/my_project_defconfig .config
make olddefconfig  # 更新依赖关系
注意: 直接复制 .config 后,一定要跑 make olddefconfigmake oldconfig。否则可能出现选项依赖不一致的问题。我曾经因为偷懒跳过这步,结果编译到一半报错,排查了半天才发现是配置冲突。

3.4 常用配置选项:这些你一定会用到

下面我列几个高频配置项,都是我在实际项目中反复调整的。

3.4.1 Target options(目标架构选项)

这里选你的CPU架构。比如ARM、ARM64、x86、MIPS等。选错了后面全白搭。

  • Target Architecture:架构类型(ARM、AArch64等)
  • Target Architecture Variant:具体型号(cortex-a7、cortex-a53等)
  • Target ABI:EABI、EABIhf(硬浮点)
  • Floating point strategy:软浮点还是硬浮点

嗯,这里有个坑:如果你的CPU支持硬浮点,但选了软浮点,性能会差很多。我做过一个视频解码的项目,一开始没注意这个选项,解码帧率只有15fps。改成硬浮点后直接飙到30fps。

3.4.2 Build options(编译选项)

这里控制编译过程的行为。

  • Download dir:源码包下载目录,默认是 dl/
  • Number of jobs to run simultaneously:并行编译线程数,建议设为CPU核心数+1
  • Enable compiler cache:启用ccache,二次编译能快很多
  • Debug build:是否保留调试符号(量产版记得关掉)
我的建议:Number of jobs 设成你CPU线程数的1.5倍。比如4核8线程的CPU,设成12。编译速度能快不少。但别设太大,否则内存会爆。

3.4.3 Toolchain(工具链)

工具链是编译器的集合。你可以用Buildroot内置的,也可以用外部的。

  • Toolchain type:Buildroot内置、外部工具链、系统工具链
  • Custom toolchain:指定外部工具链路径
  • Enable C++ support:要不要C++支持?很多嵌入式项目只用C,可以关掉省空间

我个人习惯用Buildroot内置工具链,省事。但如果你有芯片厂商提供的优化工具链,比如ARM的DS-5,那就选外部工具链。我在一个海思项目上就用了厂商的工具链,编译出来的二进制体积小了15%。

3.4.4 System configuration(系统配置)

这里配置根文件系统的基本属性。

  • System hostname:设备的主机名
  • System banner:登录时的欢迎信息
  • Init system:选择初始化系统(BusyBox init、systemd、OpenRC等)
  • Root password:root用户的密码(留空则无密码)
  • Enable root login with password:是否允许root远程登录

这里有个安全建议:量产设备一定要设root密码,或者干脆禁用root远程登录。我见过一个客户的产品,出厂时root密码是空的,结果被黑客扫描到直接登录了。

3.4.5 Filesystem images(文件系统镜像)

选择你要生成的文件系统格式。

  • ext2/3/4:传统的Linux文件系统
  • squashfs:只读压缩文件系统,适合小容量Flash
  • ubifs:针对NAND Flash优化的文件系统
  • tar.gz:打包成压缩包,方便解压到分区
  • cpio:常用于initramfs

你想想看,如果你的设备用的是NAND Flash,选ext4就不太合适。因为ext4没有做坏块管理。我建议用UBIFS或者squashfs。我在一个路由器项目上用过squashfs,根文件系统从8MB压缩到了3.2MB,效果很明显。

3.5 配置的依赖关系:别乱选

Buildroot的配置项之间有依赖关系。比如你选了 openssl,它自动会选上 zlib。但反过来,你取消 zlib 时,如果 openssl 还选着,系统会报错。

为什么会这样?因为 Config.in 文件里用 depends onselect 关键字定义了依赖。比如:

config BR2_PACKAGE_OPENSSL
    bool "openssl"
    select BR2_PACKAGE_ZLIB
    depends on BR2_TOOLCHAIN_HAS_THREADS

这表示:选openssl,会自动选中zlib,并且依赖工具链支持线程。

我建议你在修改配置时,多用 ? 键查看帮助。帮助里会写明依赖关系和推荐理由。别凭感觉乱选,否则编译时各种报错,排查起来很痛苦。

3.6 本章小结

这一章我们聊了:

  • make menuconfig 的本质和操作方式
  • 配置的保存、加载、备份技巧
  • 5个最常用的配置区域
  • 配置依赖关系的处理

下一章,我会带你深入 BusyBox 的配置。那个才是根文件系统瘦身的重头戏。咱们到时候见。