3、Busybox编译与安装:下载、配置、编译、安装
Busybox 是什么?说白了,它就是一个「瑞士军刀」式的工具集。一个几兆的二进制文件,就能替代 Linux 系统里几十个基础命令。做嵌入式根文件系统,几乎绕不开它。
我个人习惯把 Busybox 作为根文件系统的核心。为什么?因为它够轻、够稳,而且社区活跃。今天我们就一步步把 Busybox 从源码变成可执行文件,再安装到目标目录里。
核心流程:下载源码 → 配置(静态编译 + IPv6) → 编译 → 安装到目标目录
3.1 下载 Busybox 源码
先到官网或镜像站拉一份源码。我建议用 Git 克隆,方便后续切版本。
# 克隆最新稳定版
git clone git://busybox.net/busybox.git
cd busybox
# 或者直接下载 tarball(我常用这个,省事)
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xjf busybox-1.36.1.tar.bz2
cd busybox-1.36.1
嗯,这里要注意:版本号别追太新。我遇到过几次新版本交叉编译工具链不兼容的情况。1.36.x 目前比较稳,推荐。
3.2 配置 Busybox
配置是重头戏。Busybox 的配置系统和 Linux 内核一样,都是 Kconfig 那一套。运行 make menuconfig 就能进入图形界面。
make menuconfig
进去之后,我们需要改两个关键项:
3.2.1 开启静态编译
为什么要静态编译?因为根文件系统里可能没有动态链接器,或者 libc 版本不匹配。静态编译直接把所有依赖打进二进制,省心。
路径:Settings → Build static binary (no shared libs)
把它选上(按 Y)。
我的经验:静态编译后 Busybox 体积会大一些,但换来的是「扔到任何架构的 rootfs 里都能跑」。我在项目里吃过动态链接的亏——换了 glibc 版本,一堆命令直接 segfault。从那以后,根文件系统里的 Busybox 我全用静态编译。
3.2.2 支持 IPv6
现在网络环境 IPv6 已经很普遍了。嵌入式设备如果只支持 IPv4,迟早要踩坑。
路径:Networking utilities → 找到 IPv6 相关选项
具体来说,把这几项打开:
Enable IPv6(全局开关)ping6(IPv6 的 ping)traceroute6(IPv6 路由追踪)ifconfig里的 IPv6 支持
你可能会问:这些不打开会怎样?我遇到过一台设备,运营商分配了 IPv6 地址,但 Busybox 的 ifconfig 不认,死活配不上。最后重新编译才解决。所以,提前打开,省得后面返工。
注意:menuconfig 里有些选项是互斥的。比如选了静态编译,某些需要动态加载的功能就不能用。不过对于根文件系统的基础命令,影响不大。
3.3 编译 Busybox
配置保存后,直接 make 就行。如果是交叉编译,记得指定交叉工具链前缀。
# 本地编译(x86 环境)
make -j$(nproc)
# 交叉编译(比如 ARM)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc)
编译过程很快,几分钟就好。结束后你会得到一个 busybox 可执行文件。
验证一下:
file busybox
# 输出示例:busybox: ELF 32-bit LSB executable, ARM, statically linked
看到 statically linked 就对了。
3.4 安装到目标目录
编译完的 busybox 只是一个孤零零的二进制。我们需要把它「展开」成完整的根文件系统目录结构——也就是创建一堆软链接,比如 /bin/ls 指向 /bin/busybox。
Busybox 提供了 make install 来自动干这件事。
# 指定安装路径,比如 /home/user/rootfs
make install CONFIG_PREFIX=/home/user/rootfs
执行完后,看看目标目录里有什么:
ls -l /home/user/rootfs/
# 输出:
# drwxr-xr-x bin/
# drwxr-xr-x sbin/
# drwxr-xr-x usr/
# lrwxrwxrwx linuxrc -> bin/busybox
bin 目录下全是软链接,都指向 busybox。比如:
ls -l /home/user/rootfs/bin/ls
# lrwxrwxrwx ls -> busybox
这就对了。Busybox 通过 argv[0] 来判断自己该扮演哪个命令。
避坑指南:我曾经在安装时忘了指定 CONFIG_PREFIX,结果 Busybox 直接装到了宿主机的 / 目录下。还好发现得早,没把系统搞崩。所以,每次 make install 前,务必确认 CONFIG_PREFIX 指向的是你的目标根目录,不是 /。
3.5 本章知识体系
下面这张图把 Busybox 从源码到根文件系统的完整流程串起来了。你可以对照着看,每一步对应什么操作。
3.6 验证安装结果
安装完成后,最好做一次快速验证。我一般会检查三件事:
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| 二进制类型 | file busybox |
显示 statically linked |
| 命令数量 | busybox --list |
输出 300+ 个命令名 |
| 软链接完整性 | ls -l target/bin/ |
所有文件都是指向 busybox 的软链接 |
如果这三项都通过,恭喜你,Busybox 这块就稳了。
小结:Busybox 的编译安装其实不复杂,但细节决定成败。静态编译保兼容,IPv6 保未来,CONFIG_PREFIX 保安全。记住这三点,后面做根文件系统会顺很多。