4、配置BusyBox:make menuconfig详解、选择需要的Applet、配置编译选项(静态/动态链接)

好,咱们接着往下走。上一节我们把BusyBox源码拉下来了,也验证了基础编译没问题。但说实话,那个默认配置就是个「大礼包」,啥都给你塞进去。真正做产品,你得学会「做减法」——只留你需要的,砍掉没用的。

这一节,我就带你手把手过一遍 make menuconfig 的配置界面。我会告诉你哪些选项是坑,哪些是宝,以及静态链接和动态链接到底怎么选。

4.1 启动配置界面

在BusyBox源码根目录下,执行:

make menuconfig

如果你是在干净的Ubuntu环境里第一次跑,可能会报错说缺少 ncurses-dev。别慌,装一下就好:

sudo apt-get install libncurses5-dev

装完再跑,就能看到一个蓝底白字的配置界面了。嗯,这界面跟Linux内核的配置界面长得一模一样,毕竟都是同门师兄弟。

4.2 配置界面的基本操作

我个人习惯用键盘操作,鼠标在这界面里基本没用。记住这几个快捷键就行:

  • 上下方向键:移动光标,选择菜单项
  • Enter:进入子菜单或确认选择
  • 空格键:切换选项状态([*] 选中,[ ] 取消)
  • Y / N:快速选中或取消
  • ? 键:查看当前选项的帮助信息
  • Esc + Esc:返回上一级菜单
  • / 键:搜索功能,找Applet特别方便
小技巧:按 / 键输入 ls,能直接定位到 ls 这个Applet的配置位置。我在项目中经常用这招,比一层层翻菜单快多了。

4.3 选择需要的Applet

配置界面的主菜单里,最核心的就是 BusyBox Settings → 下面的 Applets 子菜单。这里按功能分了十几个大类:

分类 典型Applet 说明
Coreutils cat, cp, mv, rm, ls, mkdir 文件操作基本命令,几乎必选
Shells ash, hush, msh Shell解释器,至少选一个
Networking ping, ifconfig, wget, telnetd 网络相关工具,按需选择
Linux System Utilities mount, umount, dmesg, init 系统管理工具,init必选
Process Utilities ps, top, kill, free 进程管理,调试时很有用
Editors vi, sed, awk 文本编辑,嵌入式环境建议选sed和awk

你想想看,一个路由器只需要网络相关的命令,根本不需要 vi 编辑器。但如果你做的是工业控制面板,可能就需要 vi 来现场改配置。

我的经验:刚开始做项目时,我总想把所有Applet都选上,觉得「有总比没有好」。结果编译出来的BusyBox有2MB多,放在只有4MB Flash的板子上,根本塞不下。后来学乖了,先列一个「必须清单」,再慢慢加。

4.4 配置编译选项

回到主菜单,进入 BusyBox Settings → Build Options。这里有几个关键选项,直接决定你的BusyBox能不能跑起来。

4.4.1 静态链接 vs 动态链接

这是新手最容易纠结的问题。说白了就是:

  • 静态链接:把所有用到的库函数都编译进BusyBox里,生成的文件大,但独立运行,不依赖外部库。
  • 动态链接:BusyBox只记录函数地址,运行时去系统库(如glibc或uClibc)里找,文件小,但依赖库环境。

在配置界面里,这个选项叫:

[*] Build BusyBox as a static binary (no shared libs)

选中就是静态链接,不选就是动态链接。

注意:如果你选动态链接,但目标板子上没有对应的C库(比如glibc版本不对),BusyBox启动时会直接报错 No such file or directory。我曾经在移植时踩过这个坑,折腾了半天才发现是库版本不匹配。

我个人建议:嵌入式环境优先用静态链接。原因很简单:

  • 你不需要操心目标板上的库版本
  • BusyBox本身不大,静态链接也就几百KB到1MB左右
  • 部署时只需要拷贝一个文件,省心

但如果你做的是桌面环境或者容器场景,动态链接更合适,因为可以共享系统库,节省内存。

4.4.2 交叉编译工具链设置

在 Build Options 里,你还需要指定交叉编译器:

Cross Compiler prefix
(arm-linux-gnueabihf-)

这里填你的工具链前缀。比如我用的是ARM Cortex-A7的板子,就填 arm-linux-gnueabihf-。注意后面要带横杠。

如果你不填,默认用本机的gcc编译,那编译出来的BusyBox只能在你的PC上跑,放到ARM板子上肯定不行。

4.4.3 其他重要选项

选项 推荐值 说明
Path to sysroot 工具链的sysroot路径 指定头文件和库的搜索路径
Additional CFLAGS -Os -march=armv7-a 优化选项,-Os是尺寸优化
Enable debug build 不选 调试用,生产环境别开,会增大体积

4.5 知识体系结构图

下面这张图,是我梳理的BusyBox配置核心逻辑。你看一眼,心里就有谱了:

BusyBox配置核心逻辑 make menuconfig Applet选择 编译选项配置 交叉编译设置 Coreutils Shells Networking 静态/动态链接 优化选项 调试选项 工具链前缀 Sysroot路径 架构优化 配置原则: 按需选择Applet + 静态链接 + 正确交叉编译 = 最小化Rootfs

4.6 保存配置与编译

配置完成后,按 Exit 退出,系统会问你是否保存。选 Yes,配置会写入 .config 文件。

然后直接编译:

make -j4

编译完成后,在当前目录下会生成一个 busybox 可执行文件。你可以用 file 命令看看它是什么架构的:

file busybox
# 输出示例:busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked

看到 statically linked 了吗?说明你配置的静态链接生效了。

验证小技巧:用 busybox --list-full 可以列出所有编译进去的Applet。我每次改完配置都会跑一下这个命令,确认我需要的命令都在,不需要的确实被砍掉了。

嗯,到这里,BusyBox的配置环节就讲完了。你可能会觉得选项很多,但核心就三件事:选对Applet、选对链接方式、选对交叉编译器。把这三点拿捏住,剩下的都是锦上添花。


可可精品资料库