3. 构建环境搭建:交叉编译工具链安装、必要依赖包、环境变量设置、工作目录规划
嵌入式 Linux 内核裁剪的第一步,是搭建一个稳定、可复现的构建环境。与桌面或服务器环境不同,嵌入式目标板(如 ARM、RISC-V、MIPS)通常资源有限,无法直接运行本地编译工具链。因此,必须在性能强大的宿主机(x86_64)上安装交叉编译工具链,并配置好所有依赖包、环境变量和工作目录结构。
核心原则: 宿主机与目标板架构分离。宿主机运行 Linux 发行版(推荐 Ubuntu 22.04 LTS 或 Debian 12),目标板架构为 ARM64(aarch64)或 ARM32(armv7l)。本章所有示例均以
aarch64-linux-gnu- 工具链为准。
3.1 交叉编译工具链安装
交叉编译工具链包含编译器(gcc)、汇编器(as)、链接器(ld)、库(glibc/uclibc)以及调试器(gdb)。安装方式有三种,按推荐优先级排列:
| 方式 | 命令/工具 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 发行版包管理器 | apt install gcc-aarch64-linux-gnu |
快速原型、学习 | 安装简单,依赖自动解决 | 版本较旧,不可定制 |
| Linaro 预编译工具链 | 下载 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz |
稳定生产、版本可控 | 经过验证,性能好 | 需要手动解压和配置路径 |
| crosstool-NG 自编译 | ct-ng build |
深度定制、非标准架构 | 完全可控,可定制 glibc/uclibc | 编译耗时 30-60 分钟 |
推荐做法: 本课程使用 Linaro 预编译工具链,版本为 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu。安装步骤如下:
# 1. 下载工具链(约 150MB)
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
# 2. 解压到 /opt 目录
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt/
# 3. 验证安装
/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc --version
验证输出示例: 应显示
aarch64-linux-gnu-gcc (Linaro GCC 7.5-2019.12) 7.5.0。如果提示 command not found,请检查解压路径和后续环境变量设置。
3.2 必要依赖包安装
内核编译需要宿主机提供一系列开发工具和库。缺少依赖会导致编译中断或生成错误的 .config 文件。以下为 Ubuntu/Debian 系统的最小依赖集:
sudo apt update
sudo apt install -y \
build-essential \
flex bison \
libncurses-dev \
libssl-dev \
libelf-dev \
bc \
kmod \
cpio \
rsync \
git \
wget \
xz-utils
| 包名 | 作用 | 缺失后果 |
|---|---|---|
build-essential |
基础编译工具(gcc, make, g++) | 无法执行任何编译 |
flex, bison |
词法/语法分析器,用于生成解析器 | 配置阶段报错 flex: command not found |
libncurses-dev |
提供 menuconfig 图形界面 |
make menuconfig 无法启动 |
libssl-dev |
内核模块签名、加密功能 | 编译 crypto 子系统时报错 |
libelf-dev |
处理 ELF 格式文件 | 编译 BPF 或模块时链接失败 |
bc |
命令行计算器,内核构建系统使用 | 编译时出现 bc: not found 错误 |
常见陷阱: 如果宿主机是 Ubuntu 20.04 或更早版本,
libelf-dev 可能未包含在默认源中。请先执行 sudo apt update 并确认包名正确。对于 RISC-V 目标,还需额外安装 gcc-riscv64-linux-gnu。
3.3 环境变量设置
环境变量是构建系统的“导航仪”。正确设置后,内核 Makefile 才能找到交叉编译工具链。建议将以下配置写入 ~/.bashrc 或 ~/.profile,使其永久生效:
# 交叉编译工具链路径
export CROSS_COMPILE=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
# 目标架构
export ARCH=arm64
# 将工具链加入 PATH(可选,但推荐)
export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
# 内核源码根目录(后续章节会用到)
export KERNEL_DIR=$HOME/linux-kernel
设置完成后,执行 source ~/.bashrc 使其立即生效。验证环境变量是否正确:
echo $ARCH # 应输出 arm64
echo $CROSS_COMPILE # 应输出完整路径
${CROSS_COMPILE}gcc --version # 应显示 Linaro GCC 版本信息
关键说明:
CROSS_COMPILE 变量必须以 - 结尾。内核构建系统会自动在其后追加 gcc、ld、as 等命令名。如果忘记加 -,编译时会提示 *** Cannot find aarch64-linux-gnu-gcc。
3.4 工作目录规划
良好的目录结构可以避免文件混乱,方便后续多版本内核管理。推荐以下布局:
$HOME/
└── linux-kernel/ # 内核工作根目录
├── src/ # 内核源码(解压后)
│ └── linux-6.6/ # 具体版本目录
├── build/ # 编译输出目录(O= 指定)
│ └── arm64/ # 按架构区分
├── output/ # 最终产物:Image, dtbs, modules
│ └── arm64/
├── dl/ # 下载的源码包、补丁文件
└── scripts/ # 自定义辅助脚本
创建目录并设置权限:
mkdir -p $HOME/linux-kernel/{src,build/arm64,output/arm64,dl,scripts}
chmod 755 $HOME/linux-kernel
最佳实践: 使用
O= 参数将编译输出与源码分离。这样同一份源码可以针对不同架构(arm64、arm32)或不同配置(debug、release)分别编译,互不干扰。命令示例:make O=$HOME/linux-kernel/build/arm64。
3.5 环境完整性验证
在正式开始内核配置前,执行一次快速验证,确保所有组件就绪:
# 1. 检查工具链
${CROSS_COMPILE}gcc -E -x c /dev/null -o /dev/null 2>&1 && echo "Toolchain OK" || echo "Toolchain FAIL"
# 2. 检查依赖
dpkg -l | grep -E "libncurses-dev|libssl-dev|libelf-dev|bc" > /dev/null && echo "Deps OK" || echo "Deps FAIL"
# 3. 检查环境变量
[ -n "$ARCH" ] && [ -n "$CROSS_COMPILE" ] && echo "Env OK" || echo "Env FAIL"
# 4. 检查目录结构
[ -d "$HOME/linux-kernel/src" ] && [ -d "$HOME/linux-kernel/build/arm64" ] && echo "Dir OK" || echo "Dir FAIL"
如果全部输出 OK,说明构建环境已准备完毕,可以进入下一章的内核源码获取与配置阶段。
本章小结: 交叉编译环境搭建是嵌入式内核裁剪的基石。通过安装 Linaro 工具链、补齐宿主机依赖、设置
ARCH 和 CROSS_COMPILE 环境变量、规划清晰的目录结构,我们建立了一个可复现、可扩展的构建工作台。后续所有内核配置、编译、裁剪操作都将基于此环境执行。