第4章:配置系统入门

Kconfig语言基础、menuconfig图形界面操作、保存与加载配置(defconfig)、常用配置项速查。

说实话,刚接触Buildroot的人,最容易懵的就是配置系统。我当年第一次打开menuconfig,满屏的选项看得我头皮发麻。但别怕,这东西说白了就是一套「开关面板」,你只需要知道哪个开关管什么就行。

4.1 Kconfig语言:配置系统的骨架

Kconfig是Linux内核社区搞出来的一套配置描述语言。Buildroot直接拿过来用了。它的核心思想很简单:定义选项、描述依赖、控制显示

我带你快速过一遍最常用的语法。你不需要背,能看懂就行。

4.1.1 基本选项定义

config BR2_PACKAGE_FOO
    bool "foo package"
    help
      This is a test package.

这段代码的意思是:定义一个叫BR2_PACKAGE_FOO的配置项,类型是bool(开关),在菜单里显示为"foo package"。选中后,BR2_PACKAGE_FOO=y就会被写入配置文件。

我的习惯:写Kconfig时,选项名一定要加BR2_前缀。这是Buildroot的约定,不遵守的话,后续脚本可能找不到你的选项。

4.1.2 依赖关系

config BR2_PACKAGE_BAR
    bool "bar package"
    depends on BR2_PACKAGE_FOO
    help
      Bar depends on foo.

这里depends on表示:只有BR2_PACKAGE_FOO被选中,BR2_PACKAGE_BAR才会出现。说白了就是「先有鸡才有蛋」。

我曾经在项目里犯过一个低级错误:A依赖B,B依赖C,结果我忘了写C的依赖链。编译到一半报错,查了半天才发现是配置没勾上。嗯,这种坑踩过一次就记住了。

4.1.3 选择与提示

config BR2_PACKAGE_BAZ
    bool "baz package"
    select BR2_PACKAGE_FOO
    help
      Selecting baz will automatically select foo.

selectdepends on的区别在于:select是强制选中,用户没得选。适合那种「你选了我,就必须带上某某」的场景。

注意:select容易引发循环依赖。比如A select B,B select A,配置系统会直接崩溃。我建议你尽量用depends on,除非你非常确定不会出环。

4.2 menuconfig图形界面操作

好了,语法看完了。咱们来点实际的。在Buildroot根目录下执行:

make menuconfig

你会看到一个蓝底白字的界面。别被它吓到,操作其实很简单。

4.2.1 基本按键

按键 功能
↑ ↓ 上下移动光标
Enter 进入子菜单 / 确认选择
Space 切换开关状态([ ] → [*])
Y / N 直接设为启用 / 禁用
? 查看帮助信息
/ 搜索选项(按名称或描述)

我个人最常用的就是/搜索功能。项目大了之后,菜单层级很深,一个个翻太慢了。直接搜关键词,比如搜"openssh",一秒定位。

4.2.2 搜索技巧

按下/后,输入关键词,系统会列出所有匹配的选项。注意看每个选项前面的路径,比如:

Symbol: BR2_PACKAGE_OPENSSH [=y]
Type  : bool
Prompt: openssh
  Location:
    -> Target packages
      -> Networking applications

这个路径告诉你:它在「Target packages → Networking applications」下面。你可以按Esc退回到主菜单,然后顺着路径找过去。

避坑指南:我曾经在搜索时只看选项名,没注意depends on条件。结果勾上了,保存退出后重新打开,发现它又变灰了。原因就是它的依赖项没被选中。所以,搜索时一定要看Depends on:那一行。

4.3 保存与加载配置(defconfig)

配置好了,怎么保存?怎么复用?这是关键。

4.3.1 保存配置

在menuconfig界面,按F6或选择Save,会提示你输入文件名。默认是.config。我建议你直接保存为.config,然后退出后执行:

make savedefconfig

这个命令会把.config精简成defconfig文件,只保留非默认值的选项。这样文件小、易读、易维护。

4.3.2 加载配置

下次想复用配置,直接:

make my_board_defconfig

前提是你把my_board_defconfig放到了configs/目录下。Buildroot会自动从那里加载。

我记得有一次,同事把defconfig文件放错了位置,结果make了半天,系统一直用默认配置启动。查了两天才发现是路径不对。所以,一定要放在configs/目录下,文件名以_defconfig结尾。

4.3.3 手动编辑defconfig

你也可以直接编辑defconfig文件。格式很简单:

BR2_PACKAGE_OPENSSH=y
BR2_TARGET_GENERIC_HOSTNAME="myboard"
# BR2_PACKAGE_DROPBEAR is not set

每行一个选项。=y表示启用,=n# ... is not set表示禁用。注意,#开头的行是注释,但# ... is not set这种格式是Buildroot的特殊语法,表示该选项被显式禁用了。

警告:不要手动编辑.config文件!它包含大量自动生成的中间变量,手动改很容易出错。要改就改defconfig,然后重新make defconfig生成.config

4.4 常用配置项速查

下面这张表,是我在实际项目中反复用到的配置项。你把它存下来,以后配系统时直接查。

配置项 说明 典型值
BR2_TARGET_GENERIC_HOSTNAME 设置设备的主机名 "myboard"
BR2_TARGET_GENERIC_ISSUE 登录时的欢迎信息 "Welcome to MyBoard"
BR2_ROOTFS_OVERLAY 根文件系统覆盖目录路径 "board/myboard/overlay"
BR2_PACKAGE_BUSYBOX 是否使用BusyBox 通常为y
BR2_PACKAGE_DROPBEAR SSH服务器(轻量级) 根据需求选y或n
BR2_PACKAGE_OPENSSH SSH服务器(功能全) 根据需求选y或n
BR2_TARGET_ROOTFS_EXT2 生成ext2/3/4根文件系统镜像 通常为y
BR2_TARGET_ROOTFS_SQUASHFS 生成squashfs只读根文件系统 只读系统时用
BR2_LINUX_KERNEL 是否构建Linux内核 通常为y
BR2_LINUX_KERNEL_DEFCONFIG 内核的默认配置名称 "bcm2835_defconfig"

你可能会问:这么多配置项,我怎么知道哪个是哪个?我的方法是:先确定需求,再搜索配置。比如我要加一个Web服务器,我就搜"httpd"或"lighttpd"。搜到了,看依赖,勾上,完事。

4.5 本章知识体系

下面这张图,帮你把本章的核心逻辑串起来。你一看就明白配置系统是怎么工作的。

Buildroot配置系统核心逻辑 Kconfig语言 定义配置选项 描述依赖关系 控制菜单显示 menuconfig界面 图形化操作 搜索与导航 实时查看帮助 defconfig文件 保存非默认配置 版本控制友好 快速复用 解析 保存 make defconfig .config(完整配置) Buildroot构建系统 核心流程:Kconfig定义 → menuconfig操作 → defconfig保存 → .config生成 → 构建

这张图展示了配置系统的完整流程:Kconfig定义选项 → menuconfig提供界面 → 保存为defconfig → 生成.config → 驱动构建。你只要掌握了这个链条,配置系统对你来说就没有秘密了。

核心要点:

  • Kconfig是配置的「语法」,menuconfig是配置的「界面」,defconfig是配置的「快照」
  • 保存配置用make savedefconfig,加载配置用make xxx_defconfig
  • 搜索功能(/键)是快速定位配置项的利器
  • 注意依赖关系,避免配置「灰掉」或编译报错

好了,配置系统入门就讲到这里。你先把这些基础操作练熟,后面章节我们会深入具体的配置场景,比如定制根文件系统、添加第三方包等等。到时候你会发现,今天学的这些,全是基本功。


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