1. 环境准备与源码获取
第一次接触NanoPi R3S开发板时,我花了两天时间才搞清楚整个编译流程。RK3566这颗芯片性能不错,但官方文档有些细节没讲清楚,这里把我的踩坑经验完整分享出来。
硬件准备清单:
- 一台x86_64架构的Linux主机(实测Ubuntu 20.04/22.04最稳定)
- 至少200GB可用磁盘空间(编译过程会产生大量中间文件)
- 16GB以上内存(链接阶段很吃内存)
- 稳定的网络连接(需要下载约2GB的源码和依赖)
先安装基础依赖包,这个步骤很多人会漏掉libssl-dev导致后续出错:
sudo apt update sudo apt install -y git make gcc g++ bison flex libssl-dev \ python3 unzip patchelf bc pigz rsync获取源码有两种方式,我推荐直接用官方压缩包:
wget https://download.friendlyelec.com/NanoPiR3S/buildroot-rk3566-20241007.tar tar xvf buildroot-rk3566-20241007.tar cd buildroot-rk3566如果是通过repo同步(适合需要最新代码的情况):
.repo/repo/repo sync -l注意:国内用户可能会遇到同步缓慢问题,建议在晚上网络空闲时段操作。我在深圳电信网络下实测完整同步需要40分钟左右。
2. 编译配置与初始化
进入目录后先处理预编译文件,这个unpack.sh脚本很多人会漏执行:
cd pre-download ./unpack.sh # 解压内核驱动和文件系统 cd ..关键的一步是选择板型配置,这里有个隐藏坑点:
./build.sh rk3566.mk # 必须带.mk后缀执行后会生成.current_config.mk软链接,验证是否成功:
ls -l .current_config.mk # 应指向device/friendlyelec/rk3566/rk3566.mk遇到过最头疼的问题是dl目录冲突。由于Rockchip的包管理策略变化,需要手动清理旧缓存:
cd buildroot mv dl dl_bak # 备份原有目录 mkdir dl # 新建空目录 cd ..3. 完整编译流程
开始全量编译前,建议先开个screen会话防止中断:
screen -S build_rk3566 ./build.sh all # 首次编译约2小时编译过程会输出各阶段日志,重点观察:
- uboot编译:约15分钟,输出idbloader.img和uboot.img
- 内核编译:约30分钟,生成resource.img和kernel.img
- 根文件系统:最耗时的部分,约1小时
遇到编译错误时,90%的情况是网络问题导致包下载失败。这时候可以:
- 检查buildroot/dl目录下是否有对应的.tar.gz包
- 手动下载后放入dl目录
- 重新执行./build.sh all
编译成功的标志是在scripts/sd-fuse/out目录下生成镜像文件:
ls -lh scripts/sd-fuse/out/*.img # 应该看到 buildroot_YYYYMMDD_rk3566_arm64_sd.img4. 镜像备份与优化
备份策略是我特别要强调的。每次完整编译后,一定要保存这两个目录:
- dl目录:包含所有下载的源码包(约700MB)
cd buildroot tar --use-compress-program=pigz -cvpf dl_backup_$(date +%Y%m%d).tgz dl/- output目录:包含编译产物(约15GB)
tar -cvpf output_backup_$(date +%Y%m%d).tar output/实测备份后下次编译可节省90%时间。我的测试数据:
- 首次编译:118分钟
- 使用备份后编译:22分钟
镜像刷写技巧:
xz -d buildroot_20241125_rk3566_arm64_sd.img.xz sudo dd if=buildroot_20241125_rk3566_arm64_sd.img of=/dev/sdX bs=1M status=progress重要提醒:刷写前务必确认设备路径,误操作会导致数据丢失。我曾在凌晨3点误刷了工作硬盘...
5. 常见问题解决
问题1:编译中途报错"Failed to download package xxx"
- 解决方案:手动下载对应的包到dl目录
- 示例(以zlib为例):
wget https://www.zlib.net/zlib-1.2.13.tar.gz -P buildroot/dl/问题2:uboot编译失败提示"missing dtc"
- 原因:设备树编译器路径问题
- 修复:
export PATH=$PATH:$(pwd)/buildroot/output/rockchip_rk3566/host/bin问题3:生成的镜像启动卡在uboot阶段
- 检查步骤:
- 确认板型配置正确(rk3566.mk)
- 验证电源供应是否充足(建议5V/3A)
- 更换质量更好的TF卡(推荐SanDisk Extreme)
最后分享一个实用技巧:在build.sh all之前先执行以下命令可以大幅减少编译时间:
export MAKEFLAGS="-j$(nproc) --load-average=$(nproc)"