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,请检查解压路径和后续环境变量设置。
交叉编译工具链安装流程 交叉编译工具链安装流程 1. 下载工具链 2. 解压到 /opt 3. 验证版本 ⚠️ 注意事项 • 下载前确认目标板架构(aarch64 / arm / riscv64) • 解压后工具链约 1.2GB,确保 /opt 有足够空间 • 不要使用 root 用户编译内核,但工具链可安装到系统目录

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。
环境变量与构建系统交互 环境变量与内核构建系统交互 用户 Shell ~/.bashrc 环境变量 ARCH / CROSS_COMPILE Kernel Makefile arch/arm64/Makefile 💡 变量传递机制 • ARCH 决定内核搜索哪个 arch/ 子目录 • CROSS_COMPILE 前缀替换默认的 gcc 调用 • 也可在 make 命令行临时指定:make ARCH=arm64 CROSS_COMPILE=...

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 环境变量、规划清晰的目录结构,我们建立了一个可复现、可扩展的构建工作台。后续所有内核配置、编译、裁剪操作都将基于此环境执行。