NanoPi M6 (RK3588) 搭建 Buildroot Docker 编译环境

背景

我有一块 FriendlyElec NanoPi M6,搭载 Rockchip RK3588 SoC。目标是搭建一个 Docker 化的交叉编译环境,编译 Buildroot 并启动自制的 Linux 系统。

获取源码

FriendlyElec 下载站 下载:

文件 大小 说明
buildroot-rk3588-20250527.tar 13 GB repo 管理的源码打包
dl.tar.gz 621 MB Buildroot 下载缓存
tar xvf ~/Downloads/buildroot-rk3588-20250527.tar
cd buildroot-rk3588
./.repo/repo/repo sync -l --no-clone-bundle
(cd pre-download && ./unpack.sh)

Docker 镜像设计

为什么不直接用官方的

FriendlyElec 提供了 docker-cross-compiler-novnc,但包含完整 LXDE 桌面和 noVNC,且 install.sh 装了大量 Android/OpenWRT 依赖。

设计决策

决策 选择 理由
基础镜像 ubuntu:jammy (22.04) LTS,官方 install.sh 明确支持
依赖策略 手写包列表 剔除 Android/桌面 无关依赖
交叉编译器 不装进镜像 源码自带 toolchain-11.3-aarch64,编译时自动装到 /opt
apt 源 阿里云镜像 国内下载提速
源码挂载 -v 运行时挂载 镜像 1.3GB,源码在宿主机便于管理
用户映射 entrypoint 创建同 UID/GID 用户 编译产物权限正常
编译+打包 全部在容器内完成 避免宿主机 sudo 权限污染

Dockerfile

FROM ubuntu:jammy

RUN sed -i 's|http://archive.ubuntu.com|http://mirrors.aliyun.com|g' /etc/apt/sources.list && \
    sed -i 's|http://security.ubuntu.com|http://mirrors.aliyun.com|g' /etc/apt/sources.list

RUN echo 'tzdata tzdata/Areas select Asia' | debconf-set-selections && \
    echo 'tzdata tzdata/Zones/Asia select Shanghai' | debconf-set-selections && \
    DEBIAN_FRONTEND=noninteractive apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata

RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential patch perl rsync file bc wget ca-certificates gnupg \
    findutils gawk time git curl git-lfs \
    libncurses-dev flex bison libssl-dev libelf-dev \
    device-tree-compiler swig \
    python3 python-is-python3 python3-dev python3-setuptools python3-pyelftools \
    genext2fs e2fsprogs parted mtools \
    gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \
    texinfo autoconf automake libtool m4 pkg-config libglib2.0-dev \
    lz4 zstd u-boot-tools libudev-dev libcurl4-openssl-dev libxml2-utils \
    cpio xz-utils unzip kmod sudo locales vim tree \
    && apt-get clean

RUN locale-gen en_US.UTF-8
ENV LANG=en_US.UTF-8

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

docker-run.sh

三种模式:

./docker-run.sh          # 交互式编译 shell
./docker-run.sh sdimg     # --privileged 打包 SD 卡镜像
./docker-run.sh fix       # 修复宿主机 sudo 造成的文件权限污染

编译

# 容器内
./build.sh nanopi_m6

一键完成 install_toolchain → build_all → build_sdimg。

步骤 耗时
U-Boot + toolchain 安装 ~10 分钟
Kernel ~20 分钟
Buildroot(含交叉工具链 + 全部软件包) ~30 分钟
sd-img 打包 ~1 分钟
总计 约 1 小时

产出:out/buildroot_*_nanopi-m6_arm64_sd.img(7.4GB)。

烧录

NanoPi M6 的关键注意事项

USB-C 口仅供电,不支持数据通信。 进 MaskROM 擦除 eMMC 必须用 USB-A 转 USB-A 线连接电脑和板子的蓝色 USB 3.0 口

RK3588 启动优先级:SPI NOR → eMMC → SD 卡。eMMC 有旧 bootloader 时不会从 SD 卡启动。

擦除 eMMC

# 进入 MaskROM:断电 → A-to-A 线连电脑 → 按住 MASK 键 → USB-C 上电 → 等 4 秒松手

sudo upgrade_tool ld   # 确认 Maskrom Mode

sudo upgrade_tool ef rk3588_spl_loader_v1.18.113.bin

Linux 不需要额外驱动,upgrade_tool 通过 libusb 直连设备。

烧录镜像

sudo dd if=out/buildroot_*_nanopi-m6_arm64_sd.img bs=1M of=/dev/sdX status=progress

串口:1500000-8-N-1,minicom -D /dev/ttyUSB0 -b 1500000

踩坑记录

  1. cpioxz-utilsunzipkmod 缺失——内核 CONFIG_IKHEADERS 用 cpio/xz 打包头文件,depmod 需要 kmod,Buildroot 解压源码包需要 unzip。已补进 Dockerfile。

  2. rm -rf /var/lib/apt/lists/* 清掉 apt 索引——标准 Docker 优化但导致脚本内 apt install 找不到包。改为只 apt-get clean

  3. GitHub TLS 连接失败——国内网络 docker build 时无法克隆 FriendlyElec 的 repo 工具。源码在宿主机管理,容器不需要 repo,直接删掉这步。

  4. liblz4-tool 废弃——jammy 中改为 lz4

  5. which 不是独立包——由 debianutils 提供,基础镜像自带。

  6. SD 卡槽非弹簧式——需把卡完全推入至与 PCB 边缘齐平。

  7. USB-C 不支持数据通信——NanoPi M6 的 USB-C 仅供电,MaskROM 必须用 USB-A to A 线。

  8. 宿主机 sudo 权限污染——宿主机 sudo ./build.sh 生成的文件归 root,容器内用户删不掉。解决:编译和打包全部在容器内完成,提供 docker-run.sh fix 修复。

启动成功

root@rk3588:/# ls
bin  etc  lib  media  opt  root  sbin  tmp  var
dev  lib64  mnt  proc  run  sys  usr

登录:root / rockchip。镜像 1.31 GB,相比官方方案精简 60%+。

posted @ 2026-06-06 14:47  BorisDimitri  阅读(27)  评论(0)    收藏  举报