4、Applet选择策略:核心Applet必选列表

做BusyBox裁剪,说白了就是做选择题。

你选什么,系统就有什么。你漏了什么,系统就崩给你看。

我刚开始做SDK发布那会儿,就吃过这个亏。有一次把init给裁掉了,结果固件刷上去,内核启动完直接panic——连个shell都进不去。嗯,从那以后,我列了一个「必选清单」,每次裁剪前先过一遍。

4.1 核心Applet:一个都不能少

先说说哪些Applet是「命根子」。少了它们,系统根本跑不起来。

Applet 作用 为什么必选
init 用户空间第一个进程 没有它,内核启动后直接死机
sh Shell解释器 没有它,你连命令行都进不去
mount 挂载文件系统 根文件系统、proc、sysfs全靠它
busybox BusyBox本体 没有它,其他Applet全是空壳

我的经验:init、sh、mount这三个,我建议你直接写死在配置里,永远不要动。哪怕你觉得自己用不到,也留着。我见过太多人为了省那几十KB,把init裁了,结果返工重做。

除了上面三个,还有几个「半核心」的:

  • login / getty:如果你需要登录控制台,这两个得留着
  • mdev / udev:设备节点管理,嵌入式里mdev更常见
  • reboot / poweroff:系统管理必备

4.2 网络工具裁剪:能省则省

网络工具这块,我个人的态度是:够用就行,别贪多。

你想想看,一个嵌入式设备,可能就做一件事——比如采集传感器数据、控制电机。它需要telnet吗?需要wget吗?大部分时候不需要。

telnet:能砍就砍

telnet是明文传输,安全性极差。我在项目中遇到过客户要求必须保留telnet,结果被安全审计打了个低分。后来我们统一用SSH替代,实在不行就用串口。

警告:如果你做的是联网设备,千万别开telnet。我曾经见过一个路由器固件,telnet默认开启,结果被扫描到直接getshell。那叫一个惨。

wget:看场景

wget用来下载文件,挺方便。但如果你不需要OTA升级,不需要远程拉取配置,那它就是个累赘。

我一般这样判断:

  • 有OTA功能 → 保留wget或curl
  • 没有OTA → 直接砍掉,省下几十KB

nc(netcat):调试利器,但别留在正式版里

nc是个好东西,调试网络时特别好用。但正式发布时,我建议你把它去掉。为什么?因为它太强了——能监听端口、能传文件、能反弹shell。攻击者拿到nc,基本就等于拿到了半个后门。

我的习惯:开发版固件里留着nc,方便调试。正式发布版里一定删掉。这个习惯帮我避免了好几次安全漏洞。

4.3 文件系统工具:按需取舍

文件系统工具这块,坑比较多。我列几个常见的:

工具 建议 说明
cp / mv / rm 必选 文件操作基本命令,没有它们寸步难行
ls / cat / echo 必选 查看文件、输出信息,调试必备
dd 可选 如果你需要磁盘拷贝、备份,就留着
find / grep 可选 调试时很有用,但正式版可以砍
tar / gzip 按需 有压缩需求就留,没有就砍

这里有个容易踩的坑:cp和mv看起来简单,但如果你裁掉了,很多脚本会直接报错。我曾经裁掉cp想省空间,结果启动脚本里有个cp /etc/config /tmp,直接导致配置丢失。从那以后,我再也不敢动这几个基础命令了。

4.4 核心逻辑:一张图看懂

下面这张图,是我自己总结的Applet选择流程。每次裁剪前,我都会过一遍:

Applet选择决策流程 开始裁剪 核心Applet(init/sh/mount) 网络工具(telnet/wget/nc) 文件系统工具(cp/ls/tar等) 生成配置 决策原则 • 核心Applet:必选 • 网络工具:按需裁剪 • 文件系统:保留基础 • 调试工具:开发版保留 • 安全工具:正式版删除 • 压缩工具:按需选择 • 脚本依赖:不可裁剪

这张图的核心逻辑很简单:先保命,再优化,最后砍冗余。你按这个顺序走,基本不会出大问题。

4.5 避坑指南

最后分享几个我踩过的坑:

  • 别信「默认配置」:BusyBox的默认配置是全选的,直接编译出来固件很大。但如果你自己裁剪,一定要逐项检查,别漏了关键项。
  • 脚本依赖要留意:有些Applet看起来没用,但你的启动脚本、监控脚本可能依赖它。比如sleep、test、[这些,很多脚本里都会用到。
  • 测试环境要模拟:裁剪完一定要在目标硬件上跑一遍。我在QEMU上测试没问题,结果刷到真机上发现mount不支持某个文件系统类型——那叫一个尴尬。

我的建议:每次裁剪后,用busybox --list查看当前启用的Applet列表。然后对照你的需求文档,逐项确认。这个习惯帮我避免了很多低级错误。

好了,Applet选择策略就讲到这里。记住一句话:核心的不能动,网络的谨慎砍,文件系统的留基础。按这个思路走,你的BusyBox裁剪基本稳了。