第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就会被写入配置文件。
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.
select和depends 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 本章知识体系
下面这张图,帮你把本章的核心逻辑串起来。你一看就明白配置系统是怎么工作的。
这张图展示了配置系统的完整流程:Kconfig定义选项 → menuconfig提供界面 → 保存为defconfig → 生成.config → 驱动构建。你只要掌握了这个链条,配置系统对你来说就没有秘密了。
核心要点:
- Kconfig是配置的「语法」,menuconfig是配置的「界面」,defconfig是配置的「快照」
- 保存配置用
make savedefconfig,加载配置用make xxx_defconfig - 搜索功能(
/键)是快速定位配置项的利器 - 注意依赖关系,避免配置「灰掉」或编译报错
好了,配置系统入门就讲到这里。你先把这些基础操作练熟,后面章节我们会深入具体的配置场景,比如定制根文件系统、添加第三方包等等。到时候你会发现,今天学的这些,全是基本功。
公众号:蓝海资料掘金营,微信deep3321