2、开发环境搭建:安装Ubuntu主机、配置交叉编译工具链、安装必要软件包
RK3588 作为瑞芯微旗舰级 SoC,其 rootfs 构建与系统部署工作必须在 Linux 环境下完成。Windows 或 macOS 主机虽然可以通过虚拟机或 Docker 间接使用,但在 USB 烧录、设备节点识别、分区挂载、串口调试等环节会遇到权限和驱动兼容性问题。因此,本章将系统讲解 Ubuntu 主机的安装与配置、交叉编译工具链的搭建、以及构建 rootfs 所必需的软件包安装流程。这些工作是后续所有章节的基础,环境搭建的质量直接决定了后续编译、打包、烧录和调试的效率与稳定性。
上图展示了 RK3588 开发环境的整体架构。主机层负责承载编译工具链和构建脚本,工具链将源代码交叉编译为 aarch64 架构的二进制文件,最终通过 USB、网络或 SD 卡部署到目标板。下面我们将按照实际操作顺序,逐步完成环境搭建。
2.1 Ubuntu 主机安装与初始配置
核心原理
RK3588 的 rootfs 构建过程涉及大量文件系统操作、设备映射(device mapper)、loop 设备挂载和 chroot 切换。这些操作在 Linux 原生环境下最为稳定可靠。Ubuntu 作为 Debian 系发行版,与 RK3588 官方 SDK(基于 Debian/Ubuntu 定制)的兼容性最好,且 apt 包管理工具能够方便地解决依赖关系。选择 LTS 版本(20.04 或 22.04)可以确保长期获得安全更新和软件源支持。
安装流程与关键参数
- 镜像选择:从 Ubuntu 官网下载 ubuntu-22.04.3-desktop-amd64.iso(或服务器版)。桌面版自带图形界面,便于后续使用 RKDevTool 等图形化烧录工具;服务器版更节省资源,适合纯命令行工作流。
- 磁盘分区建议:至少分配 200GB 空间。推荐分区方案为:
/根分区 100GB(ext4)、/home分区 80GB(ext4)、swap分区 16GB。如果使用 SSD,建议启用 TRIM 支持。 - 用户权限配置:安装时创建的用户默认具有 sudo 权限。安装完成后,建议立即执行
sudo apt update && sudo apt upgrade更新系统。 - 网络配置:确保主机能够访问外网。如果使用代理,需要配置
/etc/apt/apt.conf.d/proxy.conf和~/.bashrc中的环境变量。
实战场景:双系统安装与驱动验证
某项目组使用一台配备 32GB 内存和 1TB NVMe SSD 的工作站,计划安装 Ubuntu 22.04 与 Windows 11 双系统。安装过程中遇到以下问题:
- 现象:Ubuntu 安装程序无法识别 NVMe 硬盘。
- 分析:BIOS 中 SATA 模式设置为 RAID,导致 NVMe 控制器被 RAID 驱动接管。
- 解决:进入 BIOS 将 SATA 模式改为 AHCI,重新启动安装程序后正常识别。
- 验证:安装完成后执行
lsblk确认分区挂载,执行lspci | grep -i nvme确认 NVMe 控制器驱动加载。
安装完成后,建议立即安装 ssh 服务以便远程开发:sudo apt install openssh-server,并配置静态 IP 地址。
2.2 交叉编译工具链配置
核心原理
交叉编译是指在 x86_64 主机上编译生成 aarch64(ARM 64 位)架构的可执行文件。RK3588 的 rootfs 中包含大量用户空间程序(如 systemd、busybox、glibc 库等),这些程序必须在目标架构上运行。交叉编译工具链由编译器(gcc)、汇编器(as)、链接器(ld)、库文件(libc、libm 等)和调试工具(gdb)组成。瑞芯微官方推荐使用 gcc-arm-10.3-x86_64-aarch64-none-linux-gnu 工具链,该工具链基于 GCC 10.3,支持 C++17 标准,并针对 RK 系列芯片进行了优化。
工具链安装步骤
# 1. 下载工具链(约 200MB)
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
# 2. 解压到 /opt 目录
sudo tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt
# 3. 配置环境变量(添加到 ~/.bashrc)
export PATH=/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-none-linux-gnu-
export ARCH=arm64
# 4. 使环境变量生效
source ~/.bashrc
# 5. 验证安装
aarch64-none-linux-gnu-gcc --version
如果使用瑞芯微 SDK 自带的工具链,路径通常位于 SDK/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-x86_64-aarch64-none-linux-gnu/,配置方式相同。
工具链验证与测试
编写一个简单的 C 程序验证交叉编译环境:
// hello_rk3588.c
#include <stdio.h>
int main() {
printf("Hello RK3588!\n");
return 0;
}
# 交叉编译
aarch64-none-linux-gnu-gcc hello_rk3588.c -o hello_rk3588
# 查看文件类型
file hello_rk3588
# 输出: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV)
stdio.h: No such file or directory 错误,说明工具链的 sysroot 路径配置不正确。检查工具链目录下是否有 aarch64-none-linux-gnu/libc/usr/include 目录,并确认环境变量 C_INCLUDE_PATH 未被错误覆盖。
2.3 必要软件包安装
核心原理
rootfs 构建过程依赖一系列主机端工具。这些工具分为三类:编译构建类(build-essential、make、cmake)、文件系统操作类(mtd-utils、genext2fs、parted)、网络服务类(nfs-kernel-server、tftpd-hpa)。其中 device-tree-compiler(dtc)用于编译设备树源文件(.dts)为二进制设备树(.dtb),这是 RK3588 硬件初始化所必需的。
软件包清单与安装命令
| 软件包 | 用途 | 安装命令 |
|---|---|---|
| build-essential | 包含 gcc、g++、make 等基础编译工具 | sudo apt install -y build-essential |
| device-tree-compiler | 编译 .dts 设备树源文件为 .dtb | sudo apt install -y device-tree-compiler |
| u-boot-tools | 生成 uImage、boot.scr 等 U-Boot 镜像 | sudo apt install -y u-boot-tools |
| mtd-utils | NAND/NOR Flash 的擦除、写入工具 | sudo apt install -y mtd-utils |
| nfs-kernel-server | 配置 NFS 网络文件系统,用于 rootfs 挂载调试 | sudo apt install -y nfs-kernel-server |
| tftpd-hpa | TFTP 服务器,用于网络加载内核和设备树 | sudo apt install -y tftpd-hpa |
| parted | 磁盘分区工具,用于制作 SD 卡启动盘 | sudo apt install -y parted |
| python3-pip | Python 包管理,部分构建脚本依赖 | sudo apt install -y python3-pip |
执行批量安装命令:
sudo apt update
sudo apt install -y build-essential device-tree-compiler u-boot-tools \
mtd-utils nfs-kernel-server tftpd-hpa parted python3-pip \
git curl wget unzip zip pkg-config libssl-dev
常见误区与排障
build-essential 已经包含交叉编译器。实际上,build-essential 安装的是 x86_64 原生编译器,交叉编译器需要单独下载安装。误区2:忽略
libssl-dev 的安装。在编译 U-Boot 或内核时,如果启用了 FIT 签名或加密功能,会报 openssl/evp.h: No such file 错误。误区3:NFS 服务配置错误。编辑
/etc/exports 时,需要指定 no_root_squash 选项,否则目标板无法以 root 权限访问 NFS 目录。
实战场景:NFS 调试环境搭建
在开发初期,频繁烧写 rootfs 到 eMMC 会降低 Flash 寿命且耗时。更高效的方式是使用 NFS 挂载 rootfs。具体步骤如下:
- 在主机上创建 rootfs 目录:
sudo mkdir -p /srv/nfs/rk3588_rootfs - 将构建好的 rootfs 解压到该目录。
- 编辑
/etc/exports,添加:/srv/nfs/rk3588_rootfs *(rw,sync,no_root_squash,no_subtree_check) - 重启 NFS 服务:
sudo systemctl restart nfs-kernel-server - 在 U-Boot 中设置启动参数:
setenv bootargs 'root=/dev/nfs nfsroot=192.168.1.100:/srv/nfs/rk3588_rootfs ip=dhcp'
通过 NFS 方式,每次修改 rootfs 后只需在主机端更新文件,目标板重启即可生效,极大缩短了调试周期。但需要注意,NFS 启动对网络稳定性要求较高,建议使用千兆交换机直连。
2.4 环境验证与总结
验证清单
完成上述安装后,执行以下命令验证环境完整性:
# 1. 验证交叉编译器
aarch64-none-linux-gnu-gcc -v
# 2. 验证 dtc
dtc --version
# 3. 验证 make
make --version
# 4. 验证 NFS 服务
sudo systemctl status nfs-kernel-server
# 5. 编译一个综合测试程序(包含线程、网络、文件操作)
aarch64-none-linux-gnu-gcc -pthread test.c -o test
常见问题速查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
bash: aarch64-none-linux-gnu-gcc: command not found |
PATH 未配置或配置错误 | 检查 ~/.bashrc 中的 PATH 设置,确认工具链路径存在 |
fatal error: sys/socket.h: No such file |
缺少 libc 开发头文件 | 检查工具链 sysroot 完整性,重新解压工具链 |
dtc: command not found |
device-tree-compiler 未安装 | sudo apt install -y device-tree-compiler |
| NFS 挂载失败 | exports 配置错误或防火墙拦截 | 检查 /etc/exports 语法,执行 sudo exportfs -ra,关闭防火墙或放行 2049 端口 |
总结复盘
开发环境搭建是 RK3588 项目中最容易被忽视但影响最大的环节。一个干净、可复现的环境能够避免大量无谓的排障时间。建议团队统一使用 Docker 或脚本化方式部署环境,将工具链版本、软件包列表和配置脚本纳入版本控制。本章完成的环境具备以下能力:
- 能够编译 RK3588 的 U-Boot、内核和设备树
- 能够构建完整的 rootfs 文件系统
- 支持 NFS/TFTP 网络调试模式
- 支持 SD 卡启动盘制作和 eMMC 烧录