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。
踩坑记录
-
cpio、xz-utils、unzip、kmod缺失——内核 CONFIG_IKHEADERS 用 cpio/xz 打包头文件,depmod 需要 kmod,Buildroot 解压源码包需要 unzip。已补进 Dockerfile。 -
rm -rf /var/lib/apt/lists/*清掉 apt 索引——标准 Docker 优化但导致脚本内apt install找不到包。改为只apt-get clean。 -
GitHub TLS 连接失败——国内网络
docker build时无法克隆 FriendlyElec 的 repo 工具。源码在宿主机管理,容器不需要 repo,直接删掉这步。 -
liblz4-tool废弃——jammy 中改为lz4。 -
which不是独立包——由debianutils提供,基础镜像自带。 -
SD 卡槽非弹簧式——需把卡完全推入至与 PCB 边缘齐平。
-
USB-C 不支持数据通信——NanoPi M6 的 USB-C 仅供电,MaskROM 必须用 USB-A to A 线。
-
宿主机 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%+。

浙公网安备 33010602011771号