BusyBox 与极简用户空间

结论速览

  • 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
2
3
4
5
6
7
8
9
10
11
sh
ls
cat
cp
mv
rm
mount
dmesg
ip
ping
reboot

所以可以执行:

1
2
3
/bin/busybox ls
/bin/busybox cat /proc/cpuinfo
/bin/busybox sh

2. 为什么 ls 可以指向 BusyBox

通常会创建符号链接:

1
2
3
/bin/ls    -> busybox
/bin/cat -> busybox
/bin/sh -> busybox

当执行:

1
ls

实际运行的还是:

1
/bin/busybox

BusyBox 根据启动时的命令名决定执行哪个 applet。

因此一个文件可以顶很多命令。

3. 为什么嵌入式 Linux 爱用 BusyBox

因为体积小。

完整 Debian 用户空间可能包含大量:

1
2
3
4
5
6
7
coreutils
bash
systemd
glibc
apt
dpkg
各种库

而极简 rootfs 可以只有:

1
2
3
/init
/bin/busybox
几个目录

所以 BusyBox 特别适合:

1
2
3
4
5
6
路由器
工业设备
启动盘
initramfs
救援系统
嵌入式 bring-up

4. 静态编译和动态编译

动态链接 BusyBox:

1
2
3
4
5
busybox
↓
动态链接器
↓
libc

rootfs 中还必须带:

1
2
/lib/ld-*.so
/lib/libc.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

可执行文件。