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选择流程。每次裁剪前,我都会过一遍:
这张图的核心逻辑很简单:先保命,再优化,最后砍冗余。你按这个顺序走,基本不会出大问题。
4.5 避坑指南
最后分享几个我踩过的坑:
- 别信「默认配置」:BusyBox的默认配置是全选的,直接编译出来固件很大。但如果你自己裁剪,一定要逐项检查,别漏了关键项。
- 脚本依赖要留意:有些Applet看起来没用,但你的启动脚本、监控脚本可能依赖它。比如
sleep、test、[这些,很多脚本里都会用到。 - 测试环境要模拟:裁剪完一定要在目标硬件上跑一遍。我在QEMU上测试没问题,结果刷到真机上发现
mount不支持某个文件系统类型——那叫一个尴尬。
我的建议:每次裁剪后,用busybox --list查看当前启用的Applet列表。然后对照你的需求文档,逐项确认。这个习惯帮我避免了很多低级错误。
好了,Applet选择策略就讲到这里。记住一句话:核心的不能动,网络的谨慎砍,文件系统的留基础。按这个思路走,你的BusyBox裁剪基本稳了。