LuckFox Lyra Plus RK3506G2 buildroot开发工作流

本文涵盖从零搭建 Docker 开发环境、编译 Buildroot 系统、烧录、以太网直连 SSH 的完整流程。阅读本文后你将得到一个可以通过 SSH 登录的 Linux 系统。进阶内容(AMP 多核异构部署)见 AMP 开发记录

环境

项目 说明
开发板 Luckfox Lyra Plus (RK3506G2)
宿主机 Ubuntu x86_64 + Docker
SDK Luckfox_Lyra_SDK_250815 (kernel 6.1, buildroot 2024.02)
连接 USB-TTL × 1 + 以太网直连 + USB-C

硬件需求:一条网线、一条全功能 USB-C 数据线、一个 USB-TTL 串口模块(CH340 等)。

第一步:构建 Docker 镜像

cd ~/Code/LuckFox
docker build -t luckfox-sdk:22.04 .

Dockerfile

FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y \
    git ssh make gcc libssl-dev \
    liblz4-tool expect expect-dev g++ patchelf chrpath gawk texinfo \
    diffstat binfmt-support qemu-user-static live-build bison flex fakeroot \
    cmake gcc-multilib g++-multilib unzip device-tree-compiler ncurses-dev \
    libgucharmap-2-90-dev bzip2 expat gpgv2 cpp-aarch64-linux-gnu libgmp-dev \
    libmpc-dev bc python-is-python3 python2 curl file rsync bsdmainutils scons \
    wget vim \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

RUN ln -sf /usr/bin/python2 /usr/bin/python

ARG UID=1000
ARG GID=1000
RUN groupadd -g ${GID} luckfox && \
    useradd -m -u ${UID} -g ${GID} -s /bin/bash luckfox

WORKDIR /workspace
USER luckfox
CMD ["/bin/bash"]

要点:python → python2(SDK repo 工具依赖),容器 UID 与宿主机一致避免权限问题。

第二步:解压 SDK 并同步

mkdir -p ~/Code/LuckFox/sdk/Lyra-sdk
cd ~/Code/LuckFox/sdk/Lyra-sdk
tar xf ~/Downloads/Luckfox_Lyra_SDK_250815.tar.gz -C .

# repo sync(宿主机 Python 太高导致 repo 无法运行,用 Docker)
docker run -it --rm \
  -v ~/Code/LuckFox/sdk:/workspace \
  -u $(id -u):$(id -g) \
  luckfox-sdk:22.04 \
  bash -c "cd /workspace/Lyra-sdk && .repo/repo/repo sync -l"

第三步:准备离线源码包(GFW 必需)

tar xf ~/Downloads/dl.tar.gz -C ~/Code/LuckFox/sdk/Lyra-sdk/buildroot/

第四步:配置板卡

docker run -it --rm -v ~/Code/LuckFox/sdk:/workspace luckfox-sdk:22.04
cd /workspace/Lyra-sdk
./build.sh lunch   # [1] RK3506G_Luckfox_Lyra_Plus → [0] Buildroot

# 关闭网络检查(GFW 环境)
./build.sh menuconfig
# Others configurations → [ ] RK_NETWORK_CHECK → 取消勾选 → Save

第五步:编译

./build.sh              # 全量
./build.sh uboot        # U-Boot
./build.sh kernel       # Kernel → boot.img
./build.sh rootfs       # rootfs
./build.sh firmware     # 打包

# overlay 修改后必须:
./build.sh clean-rootfs && ./build.sh rootfs && ./build.sh firmware

第六步:烧录

  1. 开发板断电
  2. 按住 BOOT 键不放
  3. USB-C 连接 PC 和开发板 OTG 口
  4. 松开 BOOT 键,进入 Rockchip Loader 模式
cd ~/Code/LuckFox/sdk/Lyra-sdk
sudo ./rkflash.sh update

烧录完成后断电重启。

第七步:以太网直连 SSH

7.1 快速验证

开发板上电后,手动设置静态 IP 确认硬件链路正常:

# 开发板串口
ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up

# PC 端
sudo ip addr add 192.168.1.200/24 dev enp3s0
sudo ip link set enp3s0 up
ping 192.168.1.100                    # 能通就说明硬件 OK
ssh root@192.168.1.100               # 密码 luckfox

验证通过后再做下面的固化方案,避免硬件问题和配置问题混在一起。

7.2 固化方案(重启仍生效)

只需两步:

① 新建 overlay 脚本 custom/root/etc/init.d/S65static-ip

#!/bin/sh
case "$1" in
    start)
        echo "Waiting for eth0..."
        for i in $(seq 1 10); do
            ip link show eth0 >/dev/null 2>&1 && break
            sleep 1
        done
        echo "Setting static IP for eth0: 192.168.1.100"
        ip addr replace 192.168.1.100/24 dev eth0
        ip link set eth0 up
        ;;
    stop)
        ip link set eth0 down
        ;;
esac
chmod +x custom/root/etc/init.d/S65static-ip

② 修改 SDK 源文件 device/rockchip/common/overlays/rootfs/luckfox-lyra/S60netdevice:删除第 31 行 udhcpc -i eth0 > /tmp/eth0_udhcpc.log 2>&1 &

然后重编烧录:

./build.sh clean-rootfs && ./build.sh rootfs && ./build.sh firmware
sudo ./rkflash.sh update

7.3 PC 端一键连接

~/Code/LuckFox/ssh_connect.sh

#!/bin/bash
BOARD_IP="192.168.1.100"
PC_IP="192.168.1.200"
PC_IFACE="enp3s0"

echo "[INFO] Setting IP $PC_IP on $PC_IFACE..."
sudo ip addr replace "$PC_IP/24" dev "$PC_IFACE"
sudo ip link set "$PC_IFACE" up

echo "[INFO] Checking connection to $BOARD_IP..."
if ping -c 1 -W 2 "$BOARD_IP" > /dev/null 2>&1; then
    echo "[INFO] Board reachable, connecting..."
    ssh "root@$BOARD_IP"
else
    echo "[ERROR] Cannot reach $BOARD_IP. Check cable and board power."
    exit 1
fi

第八步:Overlay 机制与排错

8.1 原理

build.sh rootfs 末尾,90-overlay.sh字母序遍历 overlays/rootfs/ 目录:

① custom         → install.sh → rsync custom/root/ → rootfs/
② luckfox-lyra   → install.sh → install_sysv_service S60netdevice → 覆盖 ①
  • custom:用户 overlay,rsync 整个 root/ 目录到 rootfs
  • luckfox-lyra:板级 overlay,显式安装特定的 init 脚本,在 custom 之后执行
  • 快捷路径 sdk/Lyra-sdk/overlay/custom/root/ 的符号链接
  • 新建脚本需要 chmod +x

关键结论:同名文件会被 luckfox-lyra 覆盖,所以改 custom 里的 S60netdevice 无效,必须改 luckfox-lyra 下的源文件。

8.2 踩坑:为什么简单的 S99 脚本不管用

现象:最初用 S99static-ipifconfig eth0 192.168.1.100),boot log 显示执行了,但登录后 ip a 没有 IP。

排查ps | grep dhcp 发现 udhcpc -i eth0 在后台运行。udhcpc 是 DHCP 客户端,直连无 DHCP 服务器时持续 retry,每次 deconfig 接口冲掉静态 IP。

谁启动的? S60netdevice 硬编码了 udhcpc -i eth0 &,且整个 start() 函数后台运行(start &),时序如下:

S60netdevice → 设 MAC、后台启动 udhcpc -i eth0 &
S65static-ip → ip addr replace 192.168.1.100  ✅
    ↓ 几秒后
udhcpc retry → deconfig eth0 → IP 被清除  ❌

为什么 overlay 覆盖无效? 8.1 节解释过:luckfox-lyracustom 之后执行,覆盖同名文件。

解决方案:删 luckfox-lyra/S60netdevice 源码中的 udhcpc 行 + 用 S65(S60 之后执行)直接 ip addr replace

⚠️ repo sync 可能还原 luckfox-lyra/S60netdevice,记得重新删那一行。

8.3 其他常见问题

问题 原因 解决
Docker registry 不可达 GFW docker.m.daocloud.io
repo sync 失败 Host Python 太新 Docker 内用 Python 2
Buildroot 网络不可达 GFW 下载 dl.tar.gz 离线包
host-m4 configure 失败 增量编译残留 rm -rf buildroot/output/
overlay 未生效 未 clean-rootfs ./build.sh clean-rootfs
overlay 脚本 Permission denied 未加执行权限 chmod +x

8.4 分区布局(非 AMP)

mtd 偏移 内容
u-boot 0x2000 MiniLoaderAll.bin + uboot.img
boot 0x4000 boot.img (kernel + DTB)
rootfs 0x10000 rootfs.img (UBIFS)

下一步AMP 多核异构部署 — Linux + RT-Thread 双系统运行,RPMSG 跨核通信。

posted @ 2026-06-11 16:44  BorisDimitri  阅读(23)  评论(0)    收藏  举报