BusyBox 最小系统裁剪指南 从 defconfig 到 200KB
裁剪目标
一个真正能用的"最小系统"需要以下工具(不考虑网络和日志):
| 必须的 | 可选但推荐 | 完全不需要的 |
|---|---|---|
| init(PID 1) | mount/umount | 网络工具(ifconfig、wget) |
| sh(ash/hush) | ps | 日志工具(syslogd、klogd) |
| ls | cat | 编译/开发工具 |
| mkdir | cp/mv/rm | 需要 Perl/Python 的脚本 |
| reboot/halt | chmod/chown | 压缩工具 |
用 defconfig 出发裁剪到这个集合,产物大约 200-300KB。
裁剪步骤
cd busybox-1.36.1
# 1. 从 defconfig 起步
make defconfig
# 2. 进入 menuconfig
make menuconfig
然后按以下路径依次关闭不需要的组件:
Shells 子菜单:
- 保持 ash 开启(默认)
- 关闭 hush(如果你不需要 bash 特性)
- 关闭 bash-completion
Coreutils 子菜单:
- 保持 cat、cp、mv、rm、ls、mkdir、rmdir、touch、echo、test([)
- 关闭 tac、rev、od、xxd、bsplit 等冷门工具
- 关闭 dd(除非你的系统需要原始块设备拷贝)
Networking Utilities 子菜单:
- 如果是纯本地系统(如 initramfs),全部关闭
- 如果是嵌入式路由器,全部保持开启
Linux System Utilities 子菜单:
- 保持 mount、umount、reboot、halt、poweroff、init
- 保持 mknod(创建设备节点)
- 关闭 loadkmap、pidof、taskset 等
Process Utilities 子菜单:
- 保持 ps、kill、sleep
- 关闭 top、nice、renice
Build Options 子菜单:
- 确保静态编译开启
- 开启 LTO(体积紧张时)
验证裁剪结果
裁剪完退出 menuconfig 后:
# 编译
make -j$(nproc)
# 检查体积
ls -la busybox
# 预期:200-300KB
# 检查二进制里有哪些 Applet
./busybox --list
# 应该只显示你保留的那些命令
# 测试最基本的功能
./busybox sh -c 'ls -la / && echo "hello from busybox"'
如果 ./busybox sh 能启动一个 shell,./busybox ls / 能列出根目录,你的裁剪就是成功的。
常见陷阱
依赖遗漏:关了某个 Applet 但忘了它是另一个开启项的依赖。menuconfig 通常会自动处理,但手动编辑 .config 时容易漏。建议始终用 menuconfig 而不是直接改 .config。
Shell 内部依赖:ash Shell 内部调用的某些 Applet(如 builtin 命令)必须保留。busybox --list 列出的是编译进二进制的外部 Applet,和 Shell builtin 是不同概念。
init 配置:如果你启用了 init Applet,裁剪完成后别忘了准备 /etc/inittab,否则系统启动后会在 PID 1 上崩溃。
交叉编译遗漏:交叉编译时忘了指定 CROSS_COMPILE 前缀,会编译成宿主机架构。file busybox 命令可以检查产物架构是否正确。
用 allnoconfig 反向裁剪
如果你想更极端,可以从 allnoconfig 开始手动开启:
make allnoconfig
make menuconfig # 手动开启 init、sh、ls、cat 等
make -j$(nproc)
这种方式的好处是不会不小心残留不需要的功能,坏处是很容易漏依赖。适合对 BusyBox 内部依赖非常熟悉的开发者。