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 整体流程一览

下面这张图把咱们这一章的核心流程串起来了。你可以把它当作一个检查清单:

源码获取与环境准备流程 源码获取与环境准备流程 获取Busybox源码 安装交叉编译工具链 安装系统依赖包 配置环境变量 验证环境是否就绪 关键检查点 • git clone 成功 • gcc --version 有输出 • menuconfig 能启动 常见错误 • 缺少flex/bison • CROSS_COMPILE漏了"-" • PATH没生效

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了。