BusyBox 中文文档 下载 App

BusyBox 最小系统裁剪指南 从 defconfig 到 200KB

裁剪目标

一个真正能用的"最小系统"需要以下工具(不考虑网络和日志):

必须的可选但推荐完全不需要的
init(PID 1)mount/umount网络工具(ifconfig、wget)
sh(ash/hush)ps日志工具(syslogd、klogd)
lscat编译/开发工具
mkdircp/mv/rm需要 Perl/Python 的脚本
reboot/haltchmod/chown压缩工具

用 defconfig 出发裁剪到这个集合,产物大约 200-300KB。

裁剪步骤

cd busybox-1.36.1

# 1. 从 defconfig 起步
make defconfig

# 2. 进入 menuconfig
make menuconfig

然后按以下路径依次关闭不需要的组件:

Shells 子菜单:

Coreutils 子菜单:

Networking Utilities 子菜单:

Linux System Utilities 子菜单:

Process Utilities 子菜单:

Build Options 子菜单:

验证裁剪结果

裁剪完退出 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 内部依赖非常熟悉的开发者。