2、源码获取与环境准备:下载Busybox源码、安装交叉编译工具链、配置Linux开发环境
好,咱们正式开始动手。这一章说白了就是「把家伙事儿备齐」。我见过不少新手,上来就敲 make,结果报错一堆,最后发现连交叉编译器都没装。嗯,咱们别走那个弯路。
2.1 下载Busybox源码
Busybox的官方源码托管在 git.busybox.net。我个人习惯用git克隆,这样后续想看某个版本的改动,或者切分支都很方便。
核心命令:
git clone git://git.busybox.net/busybox
cd busybox
如果你不需要完整的git历史,只想拿一个稳定版,也可以直接下载压缩包:
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 系列,这个版本对现代内核支持比较好,而且我去年在一个ARM Cortex-A7的项目里用过,没出什么幺蛾子。
小提示: 下载后先看一眼 README 和 INSTALL 文件。里面会写明依赖的最低内核版本和libc版本。别小看这一步,我曾经因为没看文档,用了太老的内核头文件,编译出来的mount命令死活不支持--bind选项。
2.2 安装交叉编译工具链
交叉编译,说白了就是「在PC上编译,在ARM(或其他架构)上运行」。你想想看,你的开发机通常是x86_64,但目标板可能是ARM、MIPS或者RISC-V。没有交叉工具链,你编译出来的程序根本跑不起来。
2.2.1 选择工具链
市面上常见的交叉编译工具链有这几类:
| 工具链 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Linaro GCC | ARM 32/64位 | 官方维护,更新快 | 只支持ARM |
| Buildroot工具链 | 自定义嵌入式系统 | 与Busybox搭配极佳 | 需要先编译Buildroot |
| crosstool-NG | 任意架构 | 高度可定制 | 配置复杂,学习曲线陡 |
| 发行版自带交叉工具链 | 快速原型 | 安装简单 | 版本可能较老 |
咱们这门课以 ARM 32位 (armv7l) 为例。我个人习惯用Linaro的预编译工具链,省事。
2.2.2 安装Linaro工具链
下载并解压到 /opt 目录:
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
sudo tar -xJf gcc-linaro-*.tar.xz -C /opt
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
注意: 上面的 export 只在当前终端有效。建议把它写到 ~/.bashrc 或 ~/.zshrc 里,避免每次打开终端都要重新设置。
验证是否安装成功:
arm-linux-gnueabihf-gcc --version
如果看到版本号输出,说明工具链已经就绪。
2.3 配置Linux开发环境
除了工具链,还有一些基础软件包是必须的。我曾在Ubuntu 20.04上遇到过缺少 flex 和 bison 导致编译失败的情况,折腾了半天才发现。
2.3.1 安装依赖包
以Ubuntu/Debian为例:
sudo apt update
sudo apt install -y \
build-essential \
flex bison \
libncurses-dev \
libssl-dev \
bc \
cpio \
unzip \
rsync
解释一下几个关键包的作用:
- flex/bison:Busybox的配置菜单(make menuconfig)依赖它们生成解析器。
- libncurses-dev:提供终端图形界面的支持,没有它
menuconfig会报错。 - bc:内核和Busybox的构建脚本里会用到这个计算器工具。
- cpio:制作initramfs文件系统时需要。
2.3.2 设置环境变量
我个人习惯把交叉编译相关的变量集中管理,写一个 setenv.sh 脚本:
#!/bin/bash
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
export INSTALL_PATH=./_install
每次开始工作前,执行 source setenv.sh 就行了。这样不会污染全局环境,也方便切换不同项目。
避坑指南: CROSS_COMPILE 变量后面一定要带短横 -。我曾经漏掉这个短横,结果make调用了宿主机的gcc,编译出来的东西在目标板上直接Segmentation fault。排查了整整一下午。
2.4 整体流程一览
下面这张图把咱们这一章的核心流程串起来了。你可以把它当作一个检查清单:
2.5 验证环境
最后一步,验证整个环境是否可用。进入Busybox源码目录,执行:
make defconfig
make menuconfig
如果 menuconfig 能正常弹出蓝白配色的配置界面,说明 libncurses-dev 和 flex/bison 都工作正常。按 ESC 退出即可。
再试一下交叉编译是否生效:
make CROSS_COMPILE=arm-linux-gnueabihf-
注意,第一次编译会花几分钟。如果最后没有报错,并且生成了 busybox 这个可执行文件,那就恭喜你——环境全部就绪。
验证清单:
- ☐ 源码已下载,目录结构完整
- ☐ 交叉编译器可执行,版本正确
- ☐ 系统依赖包全部安装
- ☐ 环境变量已配置,
echo $CROSS_COMPILE输出正确 - ☐
make menuconfig能正常启动 - ☐
make编译无错误
嗯,到这里,咱们的「工欲善其事」部分就完成了。接下来就可以真正开始配置和裁剪Busybox了。