2. 嵌入式Linux根文件系统基础

RK3568 作为一款高性能、低功耗的国产化 SoC,其根文件系统定制与系统构建工作必须依托于一套完整、稳定且可复现的开发环境。本章节将系统讲解从零开始搭建 RK3568 开发环境的完整流程,涵盖 Linux 主机的安装与配置、交叉编译工具链的部署、Rockchip SDK 的获取与校验,以及最终的环境验证方法。一个规范的环境是后续所有编译、调试和定制工作的基石,能够有效避免因工具链版本不一致、依赖缺失或 SDK 损坏导致的各类“玄学”问题。

RK3568 开发环境搭建链路图 Linux 主机 Ubuntu 20.04/22.04 ≥ 200GB 磁盘 / 16GB RAM 交叉编译工具链 gcc-arm-10.3-x86_64 aarch64-linux-gnu- RK3568 SDK repo 同步 / 压缩包 包含 u-boot/kernel/buildroot 环境验证 编译测试 运行测试 ① 主机安装 安装依赖包 ② 工具链配置 解压并设置 PATH ③ SDK 获取 repo sync 或解压 ④ 验证 编译 hello 程序 关键检查点 磁盘空间:df -h 确认 /opt 或工作目录 ≥ 100GB 工具链版本:aarch64-linux-gnu-gcc --version 输出 10.3 SDK 完整性:检查 .repo 目录及 device/rockchip/rk3568 目录存在 编译验证:交叉编译 hello.c 并执行 file 命令确认 ELF 64-bit ARM 建议使用 Ubuntu 20.04 LTS 64 位系统,内核版本 ≥ 5.4

2.1 Linux 主机安装与基础配置

核心原理:RK3568 的 SDK 编译过程涉及大量的 shell 脚本、Makefile 和 Python 工具,对操作系统的文件系统大小写敏感性、符号链接支持以及 GNU 工具链的版本有严格要求。Windows 的 WSL 或虚拟机虽然可以运行 Linux 命令,但在处理复杂的 repo 多仓库同步、设备节点映射和长时间编译任务时,容易出现文件权限错乱或 I/O 性能瓶颈。因此,官方推荐使用原生安装的 Ubuntu 20.04 或 22.04 LTS 64 位系统作为开发主机。

操作流程:安装完成后,需要执行以下基础配置步骤:

  1. 更新软件源:使用 sudo apt update 和 sudo apt upgrade 将系统内核与基础库更新至最新稳定版。
  2. 安装基础依赖:执行以下命令安装编译所需的软件包集合:
sudo apt install -y git ssh make gcc libssl-dev liblz4-tool \
expect g++ patchelf chrpath gawk texinfo chrpath diffstat \
binutils binfmt-support build-essential device-tree-compiler \
flex bison libncurses5-dev libssl-dev libsqlite3-dev libudev-dev \
libusb-1.0-0-dev python3-pip python3-dev python3-setuptools \
swig libtool libglib2.0-dev gtk-doc-tools m4 bc u-boot-tools \
nfs-kernel-server nfs-common dosfstools mtools fakeroot tar zip unzip

案例拆解:某项目组在 Ubuntu 18.04 上编译 RK3568 SDK 时,频繁报错 crypto/af_alg.c: undefined reference to `EVP_MD_CTX_new'。排查发现是系统自带的 OpenSSL 1.1.0 版本过旧,而 SDK 中的某些加密模块需要 OpenSSL 1.1.1 以上版本。通过升级至 Ubuntu 20.04 并重新安装 libssl-dev 后,问题彻底解决。这提示我们,主机系统的版本直接影响 SDK 的编译成功率,不要使用过于古老的发行版。

风险提示:不要使用 32 位系统或 ARM 架构的 Linux 主机(如树莓派)进行 SDK 编译。RK3568 SDK 的编译脚本大量依赖 x86_64 架构的预编译工具,且 32 位系统无法处理超过 4GB 的内存映射,会导致编译过程中段错误。

2.2 交叉编译工具链配置

核心原理:交叉编译是指在 x86_64 主机上编译生成 ARM64 (aarch64) 架构可执行代码的过程。RK3568 使用的是 ARMv8-A 架构,因此需要 aarch64-linux-gnu- 前缀的 GCC 工具链。Rockchip 官方提供的工具链基于 GCC 10.3,针对 Cortex-A55 内核进行了优化,支持 LTO(链接时优化)和 SVE(可扩展向量扩展)特性。

配置步骤:工具链的安装本质上是解压并设置环境变量,具体如下:

# 1. 创建工具链目录
sudo mkdir -p /opt/arm
cd /opt/arm

# 2. 解压工具链(假设已下载 gcc-arm-10.3-x86_64-aarch64-none-linux-gnu.tar.xz)
sudo tar -xvf gcc-arm-10.3-x86_64-aarch64-none-linux-gnu.tar.xz

# 3. 设置环境变量(建议写入 ~/.bashrc 永久生效)
export PATH=/opt/arm/gcc-arm-10.3-x86_64-aarch64-none-linux-gnu/bin:$PATH
export ARCH=arm64
export CROSS_COMPILE=aarch64-none-linux-gnu-

# 4. 验证版本
aarch64-none-linux-gnu-gcc --version

对比分析:下表列出了不同工具链的适用场景,帮助开发者做出正确选择:

工具链类型前缀适用场景优点缺点
Rockchip 官方工具链aarch64-none-linux-gnu-SDK 默认编译与 SDK 版本严格匹配,稳定性高版本较旧,不支持最新语言特性
Linaro 工具链aarch64-linux-gnu-通用 Linux 用户态程序更新频繁,支持新特性可能与内核模块编译不兼容
发行版自带工具链aarch64-linux-gnu-Debian/Ubuntu 包管理安装方便版本过旧,无法编译最新内核
经验提醒:在编译内核或 U-Boot 时,务必使用 SDK 自带的工具链或官方指定的版本。使用 Linaro 或发行版工具链编译内核时,可能会因为 GCC 版本差异导致内联汇编语法错误或 ABI 不兼容,产生难以调试的启动异常。

2.3 获取 RK3568 SDK

核心原理:Rockchip 的 SDK 采用 repo 多仓库管理机制,由数百个 Git 仓库组成,包括 U-Boot、Kernel、Buildroot、App 层等。通过 repo 工具可以一次性同步所有仓库并锁定到特定版本。SDK 的获取有两种方式:一是通过 repo 从 Git 服务器同步(适合持续开发),二是直接下载官方发布的完整压缩包(适合快速搭建基线环境)。

操作流程(repo 方式):

# 1. 安装 repo 工具
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH

# 2. 创建 SDK 目录并初始化
mkdir -p ~/rk3568_sdk
cd ~/rk3568_sdk
repo init -u https://gitlab.com/rockchip_linux/rk3568-manifest.git -b master

# 3. 同步全部代码(耗时较长,建议使用 -j4 控制并发)
repo sync -j4 -c --no-tags

案例拆解:某开发者在同步 SDK 时,网络中断导致 repo sync 失败。此时直接重新执行 repo sync 会从头开始下载,浪费大量时间。正确的做法是使用 repo sync -j4 --force-sync 强制同步,repo 会基于已有的 .git 目录进行增量更新,只下载缺失的对象。此外,如果公司内部有 Git 镜像服务器,可以通过修改 ~/.gitconfig 中的 URL 替换规则,将外网地址替换为内网镜像地址,大幅提升同步速度。

SDK 目录结构说明:同步完成后,SDK 根目录下应包含以下关键目录:
  • kernel/:Linux 4.19 或 5.10 内核源码,包含 Rockchip 平台补丁。
  • u-boot/:U-Boot 引导加载程序源码。
  • buildroot/:Buildroot 构建系统,用于生成根文件系统。
  • device/rockchip/:板级配置、设备树文件、分区表定义。
  • external/:第三方库和应用程序。
  • app/:Rockchip 提供的系统应用。

2.4 验证开发环境

核心原理:环境验证的目的是确认工具链、SDK 和主机系统三者之间的兼容性。验证分为两个层面:编译验证和运行验证。编译验证确保工具链能正确生成 ARM64 代码;运行验证则通过 QEMU 用户态模拟或直接在开发板上运行,确认生成的二进制文件可执行。

验证流程:

  1. 编写测试程序:创建一个简单的 hello.c 文件。
  2. 交叉编译:使用 aarch64-none-linux-gnu-gcc hello.c -o hello 生成可执行文件。
  3. 检查文件类型:执行 file hello,输出应包含 ELF 64-bit LSB executable, ARM aarch64。
  4. 运行验证:如果开发板已连接,可通过 NFS 或 adb push 将程序拷贝至板端运行;若无板子,可使用 qemu-aarch64 运行。
# 编译验证
cat <<EOF > hello.c
#include <stdio.h>
int main() {
    printf("RK3568 Env OK!\n");
    return 0;
}
EOF

aarch64-none-linux-gnu-gcc hello.c -o hello
file hello
# 输出: hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked

# 运行验证(无板子时使用 QEMU)
sudo apt install qemu-user-static
./hello
# 输出: RK3568 Env OK!

常见误区与复盘:

  • 误区一:只验证了 gcc --version 就认为环境 OK。实际上,工具链的库文件(libgcc、libstdc++)可能缺失,导致链接阶段失败。必须通过实际编译一个包含标准库调用的程序来验证。
  • 误区二:忽略磁盘空间。SDK 完整编译需要约 150GB 空间,如果 /home 分区空间不足,编译会在链接阶段报 No space left on device。建议将 SDK 放在 /opt 或独立数据盘。
  • 误区三:使用 root 用户直接编译。SDK 中的某些脚本会检测当前用户,root 用户可能导致文件属主混乱。建议创建普通用户并加入 sudo 组。
重要提醒:在验证环境时,如果发现 file 命令输出的架构不是 ARM aarch64,而是 x86-64,说明编译器没有使用交叉编译工具链。请检查 PATH 环境变量是否被后续配置覆盖,或者是否在 Makefile 中显式指定了 CC 变量。

完成上述四个步骤后,开发环境即搭建完毕。此时建议执行一次 SDK 的 ./build.sh lunch 命令,选择 rk3568 对应的配置文件,然后执行 ./build.sh kernel 进行一次完整的内核编译,以进一步验证 SDK 的完整性。如果内核编译通过,说明整个工具链、SDK 和主机系统的配合已经达到生产可用状态,可以开始后续的根文件系统定制工作。