结论速览
- BusyBox 把大量常见 Unix/Linux 命令集合在一个可执行程序
/bin/busybox里。 /bin/ls、/bin/sh通常是指向 busybox 的符号链接,BusyBox 根据启动时的命令名决定执行哪个 applet。- 极简 rootfs 只需要
/init、/bin/busybox和几个目录,所以路由器、工业设备、启动盘、救援系统都爱用它。 - 动态链接的 BusyBox 还要在 rootfs 里带上
/lib/ld-*.so和/lib/libc.so,极简系统推荐CONFIG_STATIC=y。 - PC 上的 x86_64 BusyBox 不能直接复制到 MT7621,必须用
mipsel-linux-gnu-gcc交叉编译出 MIPS32 小端版本。
1. BusyBox 是什么
BusyBox 是一个开源项目。
它把大量常见 Unix/Linux 命令集合在一个可执行程序里:
1 | /bin/busybox |
内部可包含:
1 | sh |
所以可以执行:
1 | /bin/busybox ls |
2. 为什么 ls 可以指向 BusyBox
通常会创建符号链接:
1 | /bin/ls -> busybox |
当执行:
1 | ls |
实际运行的还是:
1 | /bin/busybox |
BusyBox 根据启动时的命令名决定执行哪个 applet。
因此一个文件可以顶很多命令。
3. 为什么嵌入式 Linux 爱用 BusyBox
因为体积小。
完整 Debian 用户空间可能包含大量:
1 | coreutils |
而极简 rootfs 可以只有:
1 | /init |
所以 BusyBox 特别适合:
1 | 路由器 |
4. 静态编译和动态编译
动态链接 BusyBox:
1 | busybox |
rootfs 中还必须带:
1 | /lib/ld-*.so |
静态编译则把依赖尽量放进 BusyBox 本身。
极简系统推荐:
1 | CONFIG_STATIC=y |
这样最适合第一次启动。
5. BusyBox 必须为目标 CPU 编译
PC 上的 x86_64 BusyBox 不能直接复制到 MT7621。
MT7621 需要对应的 MIPS 小端版本。
否则:
1 | Exec format error |
因此通常需要交叉编译:
1 | mipsel-linux-gnu-gcc |
最终生成:
1 | MIPS32 Little Endian |
可执行文件。