为嵌入式 Linux 开发板定制产品镜像
为嵌入式 Linux 开发板定制产品镜像
算法与程序开发到一定程度后,需要发布初版产品供用户测试。其中部署算法时用到了 RDKx3 等嵌入式 Linux 开发板,如果逐一烧录并配置,效率过低。因此需要先定制好镜像,烧录后可以直接运行。
基础
对于树莓派之类的开发板,支持的镜像较多,常见的 如 rpiOS,ubuntu,archlinux 等均可,只需要下载对应架构的磁盘映像,就可以在此基础上进行编辑。
对于 RDK 系列,rk 系列等,程序需要使用板子附带的加速单元用来加速数据处理等,我们需要下载官方的系统磁盘映像进行定制。
我们使用 RDKx3,因此从 D-Robotics 下载系统镜像

下载下来后一般是一个 img.xz 的文件。
配置并挂载到主机
解压镜像
使用 xz 解压镜像,得到 img文件
1 | mkdir -pv ~/workspace/packimg |
映像扩容
官方提供的 img 镜像的大小恰好是系统所需的大小,直接挂载后修改,可能会遇到空间不足的问题,因此挂载之前需要先进行扩容
1 | # 添加 4G 到镜像文件 |
挂载镜像
首先使用 fdisk 查看 rootfs, 将其挂载到主机,一般是更大的那个分区。假设是第二个分区
1 | fdisk -l rdk.img |
挂载回环设备(如果扩容时挂载,就不需要再次挂载)
1 | sudo losetup -Pf rdk.img |
挂载对应分区
1 | mkdir -pv rootfs |
设置网络
/etc/resolv.conf 一般情况是指向/run/systemd/resolve/stub-resolv.conf 的软链接,由于我们后面使用 chroot 进入系统,没有运行 systemd, 因此没有这个源文件。需要手动设置
1 | sudo mv rootfs/etc/resolv.conf{,.bak} # 备份原始链接 |
QEMU 跨架构模拟器
由于板子是 arm64 ,主机是 x86_64, 因此 rootfs 中的程序不能直接运行,需要在主机安装 qemu 来运行
1 | yay -S qemu-user-static |
进入系统
使用 chroot 进入系统
1 | sudo chroot ./rootfs /bin/bash |
设置系统
用户设置
创建用户
生产环境最好不要使用 root 用户,为了安全,也不要使用官方自带的用户。可以自己创建一个普通用户,并禁用 root 用户
1 | /sbin/useradd -m -s /bin/bash newuser |
因为 useradd 命令在 /sbin,chroot 可能没有将其加入 PATH, 因此可以设置 PATH 或写完整路径。
SSH 设置
因为产品涉及网络服务,所以禁用密码登录,防止破解登入。在主机运行命令创建密钥并上传到客户机
1 | mkdir -pv keys |
如果已经有了密钥,可以直接上传:
1 | sudo mkdir -p rootfs/home/newuser/.ssh |
之后在客户机中设置权限:
1 | chown -R newuser:newuser /home/newuser/.ssh |
部署程序
主程序
此步骤没有什么特殊的,使用 apt 和 pip 安装依赖,把代码/程序复制到客户机中。注意需要设置对应的权限,以便普通用户可以直接运行。
系统服务
把service文件上传,设置权限,并激活之
1 | cp my_service.service /etc/systemd/system |
测试
程序部署完成后,可以在 chroot 环境中直接再次测试,确保直接运行无虞
配网
本项目中,需要 RDK 创建 AP 热点,供其他模块连接通信并管理,所以需要创建配置文件
1 | cat >> /etc/NetworkManager/system-connections/Hotspot.nmconnection << EOF |
这个文件保险起见,可以不手写,而是从已经配置好的开发机上复制出来。
其他工作
如果程序的相关运行还需要其他配置,例如蓝牙设置等,可以继续进行设置
重新打包
清理空间
配置过程中安装的依赖、编译文件、临时文件、索引、缓存等,会占用大量空间,因此需要清理后再重新打包
1 | # 先清理apt缓存等所有不需要使用的内容,如果使用了 pip 等包管理器安装了,也要清理对应的缓存 |
清理挂载
把所有的挂载点和回环设备卸载
1 | sudo umount -l ./rootfs/dev/pts |
重新压缩镜像
1 | # -9 最大压缩,-T0 多线程 |
命名并上传
此部分只是这个项目的命名格式,仅供参考
文件命名
命名格式
rdk_x3-os_3.0.3-api_v1.2-inferer_v1.4-py-arm64.img.xz
其中需要体现信息:
适用平台:
rdk_x3rdk_x5raspi4b- …
基于官方系统的版本:
os_x.x.x运行的推理服务的版本:
api_v1.2运行的推理程序的版本:
最终的推理程序主要用 C++ 改写,因此C++版本不带后缀,Python 版本需要后缀
inferer_v1.4-py:Python 推理程序inferer_v1.0: C++ 推理程序
系统架构:
arm64
不同信息之间使用 hyphen - 连接,一个信息内部使用下划线 _
存放目录
镜像如果需要放在服务器上发布,供开发人员随时升降级,则下载中心的文件夹结构可以参考
1 | /home/neolux/Cloud/olist_local/personal/ms365/e3/nlx.m3/projets/pseudomano/ |
烧录系统
SD Card
1 | # xzcat 用来提取数据 |
eMMC
参考官方文档 from d-robotiques: 1.2.1 RDK X3 | RDK DOC
远程登入
1 | nmcli dev wifi connect MyWifi password myappassword |