3、嵌入式Linux开发环境搭建:安装Ubuntu主机系统、配置交叉编译工具链(aarch64-linux-gnu-gcc)、安装必要依赖包、创建共享目录、配置TFTP/NFS服务、使用串口终端(minicom/picocom)连接开发板
RK3588的U-Boot移植与Buildroot集成,本质上是在主机端完成代码编辑、交叉编译、镜像打包,再通过串口、网络或存储介质将产物部署到目标板上的过程。因此,主机开发环境的完备程度直接决定了后续调试效率。本章将围绕Ubuntu主机系统安装、aarch64交叉编译工具链配置、依赖包安装、共享目录创建、TFTP/NFS服务搭建以及串口终端连接六个核心环节展开,帮助读者构建一套可复现、可维护的嵌入式Linux开发底座。
3.1 Ubuntu主机系统安装与基础配置
RK3588的U-Boot编译对主机系统有明确要求。推荐使用Ubuntu 20.04 LTS或22.04 LTS的x86_64版本,原因在于:Rockchip官方SDK和Buildroot长期在这些版本上验证,且GCC 9/11系列交叉编译器与Ubuntu的glibc版本兼容性最佳。若使用更新的Ubuntu 24.04,虽然可以安装,但可能遇到Python版本过高导致Buildroot的某些脚本不兼容的问题。
安装Ubuntu时,建议采用最小化安装(Minimal Installation),避免预装大量无关软件包。磁盘分区时,为/home单独划分至少200GB空间,因为RK3588的完整SDK(含U-Boot、Kernel、Buildroot)解压后约需80GB,编译产物还会额外占用30-50GB。内存建议16GB起步,若使用虚拟机,需开启嵌套虚拟化并分配至少4核CPU。
系统安装完成后,第一件事是更换软件源为国内镜像(如清华、阿里云),然后执行系统更新:
sudo apt update
sudo apt upgrade -y
sudo apt install -y vim git curl wget tree htop net-tools
对于虚拟机用户,建议安装open-vm-tools或qemu-guest-agent,便于文件拖拽和剪贴板共享。同时,关闭系统的自动休眠和屏幕锁定,避免长时间编译时主机进入睡眠状态导致编译中断。
3.2 配置aarch64交叉编译工具链
RK3588是64位ARMv8-A架构处理器,主机端必须安装aarch64交叉编译工具链,才能在x86_64主机上编译出ARM64架构的U-Boot二进制。Rockchip官方推荐使用GCC 10.3或11.2版本的aarch64工具链,这两个版本在U-Boot 2021.07及以上版本中验证充分。
安装方式有两种:通过apt直接安装(版本较旧但稳定),或从ARM官网下载预编译工具链(版本较新)。对于U-Boot移植,推荐使用apt安装的gcc-arm-linux-gnueabihf或gcc-aarch64-linux-gnu,因为其与Ubuntu的库依赖兼容性最好。
# 方式一:apt安装(推荐)
sudo apt install -y gcc-aarch64-linux-gnu
# 方式二:ARM官网下载(版本更新)
wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
sudo tar -xJf gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/
export PATH=/opt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH
安装完成后,必须验证工具链是否正常工作:
aarch64-linux-gnu-gcc -v
# 输出应包含 "gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)" 或类似信息
aarch64-linux-gnu-gcc -dumpmachine
# 输出应为 aarch64-linux-gnu
还需要确认工具链的库路径是否正确。U-Boot编译时会调用aarch64-linux-gnu-ld、aarch64-linux-gnu-objcopy等工具,这些工具必须与gcc版本匹配。若出现“cannot find -lgcc”错误,说明工具链的libgcc路径未正确配置。
~/.bashrc中固定工具链路径,并注释掉其他版本的工具链PATH。
3.3 安装必要依赖包
U-Boot和Buildroot的编译依赖大量主机端软件包。这些依赖分为三类:基础编译工具、U-Boot特有依赖、Buildroot特有依赖。遗漏任何一个都可能导致编译中断,且错误信息往往不直观。
| 依赖类别 | 软件包名称 | 用途说明 |
|---|---|---|
| 基础编译 | build-essential, gcc, g++, make, cmake | 主机端编译器和构建工具 |
| U-Boot特有 | bison, flex, libssl-dev, u-boot-tools, device-tree-compiler | 设备树编译、镜像打包、加密支持 |
| Buildroot特有 | python3-dev, python3-setuptools, swig, libncurses5-dev, file, rsync | Buildroot配置界面、Python脚本支持 |
| 网络服务 | tftpd-hpa, nfs-kernel-server, samba | TFTP/NFS/共享目录服务 |
| 串口工具 | minicom, picocom, cu | 串口终端连接开发板 |
一次性安装所有依赖包的命令如下:
sudo apt install -y build-essential gcc g++ make cmake \
bison flex libssl-dev u-boot-tools device-tree-compiler \
python3-dev python3-setuptools swig libncurses5-dev file rsync \
tftpd-hpa nfs-kernel-server samba minicom picocom
安装完成后,建议执行一次dpkg -l | grep <package-name>确认关键包已正确安装。特别要注意libssl-dev的版本,U-Boot 2021.07及以上版本需要OpenSSL 1.1.x,若系统安装了OpenSSL 3.0,需额外安装libssl1.1兼容包。
3.4 创建共享目录与配置TFTP/NFS服务
共享目录是主机与开发板之间传输文件的基础。在U-Boot移植阶段,最常用的传输方式有两种:TFTP用于U-Boot加载内核镜像(如bootm命令从网络加载),NFS用于挂载根文件系统(开发阶段避免反复烧写eMMC)。
首先创建标准目录结构:
mkdir -p ~/rk3588/{uboot,kernel,buildroot,output}
mkdir -p ~/tftpboot
mkdir -p ~/nfsroot
chmod 777 ~/tftpboot ~/nfsroot
TFTP服务配置(/etc/default/tftpd-hpa):
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/<username>/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
NFS服务配置(/etc/exports):
/home/<username>/nfsroot 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
配置完成后重启服务并验证:
sudo systemctl restart tftpd-hpa
sudo systemctl restart nfs-kernel-server
# 验证TFTP
tftp 192.168.1.100 -c get test.txt
# 验证NFS
sudo mount -t nfs 192.168.1.100:/home/<username>/nfsroot /mnt
setenv serverip 192.168.1.100
setenv ipaddr 192.168.1.50
tftp 0x02000000 boot.img
bootm 0x02000000
若TFTP传输失败,优先检查主机防火墙(sudo ufw disable)和开发板网络配置(ping测试)。
3.5 使用串口终端连接开发板
RK3588开发板通常提供UART0作为调试串口,通过USB转TTL模块连接主机。连接时需注意:开发板串口电平为3.3V TTL,必须使用支持3.3V电平的USB转串口模块(如CP2102、CH340),严禁直接连接RS232电平。
连接线序为:开发板GND接模块GND,开发板TX接模块RX,开发板RX接模块TX。连接完成后,在主机端确认设备节点:
ls /dev/ttyUSB* # 或 /dev/ttyACM*
dmesg | grep tty # 查看内核日志确认设备识别
minicom配置(推荐使用):
sudo minicom -s
# 进入配置界面,选择 Serial port setup
# 设置 Serial Device: /dev/ttyUSB0
# 设置 Bps/Par/Bits: 1500000 8N1
# 关闭 Hardware Flow Control 和 Software Flow Control
# 保存为默认配置
picocom使用(更轻量):
sudo picocom -b 1500000 /dev/ttyUSB0
# 退出:Ctrl+A Ctrl+X
RK3588的U-Boot默认波特率为1500000,这是Rockchip平台的特殊设置。若使用115200波特率,U-Boot启动日志会显示乱码。连接成功后,上电开发板应能看到U-Boot启动日志,并进入命令行提示符Rockchip>。
3.6 环境验证与排障案例
搭建完环境后,必须进行端到端验证,确保每个环节都可用。以下是一个完整的验证流程,以及一个典型的排障案例。
验证流程清单:
- 工具链验证:
aarch64-linux-gnu-gcc -v,确认版本输出正常。 - 编译验证:编写一个简单的hello.c,使用交叉编译器编译,通过
file命令确认输出为ARM64 ELF格式。 - 网络验证:开发板进入U-Boot后,执行
ping 192.168.1.100,确认TFTP/NFS服务可达。 - 串口验证:上电后观察U-Boot日志完整输出,无乱码、无丢失。
- 共享目录验证:在主机
~/tftpboot放置文件,开发板通过TFTP下载成功。
案例:TFTP传输超时排障
某次实验中,开发板执行tftp 0x02000000 boot.img后一直卡在“T FTP from server 192.168.1.100; Trying ...”,最终超时。初步排查过程如下:
- 检查网络连通性:开发板执行
ping 192.168.1.100,结果正常,排除物理链路问题。 - 检查TFTP服务状态:主机执行
systemctl status tftpd-hpa,服务正常。 - 检查防火墙:
sudo ufw status显示防火墙开启,且未放行UDP 69端口。 - 解决方案:执行
sudo ufw allow 69/udp,并重启TFTP服务。 - 结果:再次执行TFTP下载,成功获取boot.img。
复盘经验:TFTP使用UDP 69端口,但实际数据传输使用随机高位端口。因此,仅放行69端口可能不够,最稳妥的方式是直接关闭防火墙(开发环境)或配置完整的UDP放行规则。
setup_env.sh脚本,并纳入版本管理。这样,当更换主机或团队成员加入时,只需执行一条命令即可完成环境搭建,避免重复踩坑。