RK平台上不会移植第三方系统?读懂这个脚本,轻松掌握嵌入式系统构建 电子说
在嵌入式开发领域,我们常遇到这样的场景:花了三天编译的系统镜像,启动后却发现摄像头无法工作;明明配置了 SSH 服务,却始终连不上设备;甚至有时候,一句 "构建失败" 的报错能让整个团队卡壳半天。
如果你也曾被这些问题困扰,那今天这篇文章值得深读。我们将通过分析一个真实的嵌入式系统构建脚本,带你看清系统从 0 到 1 的诞生过程,更重要的是 —— 学会在调试时抓住问题的 "七寸"。
先看脚本的核心定位:这是一个基于 Debian 的嵌入式系统构建脚本,负责将基础镜像、驱动模块、应用组件 "缝合" 成可直接烧录的系统镜像。简单说,它是系统的 "接生婆",从基础镜像到最终可用的系统,全流程都由它掌控。

我们可以把它的工作拆解成 5 个关键阶段:
TARGET_ROOTFS_DIR="binary" # 目标根文件系统目录case "${ARCH:-$1}" in # 处理架构参数,支持armhf和arm64arm|arm32|armhf)ARCH=armhf;;*)ARCH=arm64;;esacVERSION=${VERSION:-"release"} # 默认为release版本,支持debug模式
这部分就像施工前的 "图纸设计":明确构建目标(根目录位置)、硬件适配(架构选择)、功能模式(release/debug)。调试时第一个要检查的就是这里—— 如果架构选错,后续所有驱动和软件都会 "水土不服"。
# 检查基础镜像是否存在if [ ! -e linaro-bullseye-alip-*.tar.gz ]; thenecho "�33[36m Run mk-base-debian.sh first �33[0m"exit -1fi# 解压基础镜像sudo tar -xpf linaro-bullseye-alip-*.tar.gz
基础镜像是系统的 "地基",如果这一步出错(比如镜像缺失、解压失败),后续所有操作都是空谈。调试时若遇到 "文件不存在" 的报错,先检查基础镜像是否正确生成(脚本提示要先运行 mk-base-debian.sh)。
这部分是脚本的核心,像搭积木一样往基础系统里填充内容:
# 复制架构相关的软件包sudo cp -rpf packages/$ARCH/* $TARGET_ROOTFS_DIR/packages# 复制系统配置文件(overlay层)sudo cp -rpf overlay/* $TARGET_ROOTFS_DIR/# 复制网卡驱动模块sudo cp ../kernel/drivers/net/ethernet/realtek/r8125.ko $TARGET_ROOTFS_DIR/usr/lib/modules/

这里藏着很多调试关键点:
•如果某个硬件(比如网卡)无法工作,先检查驱动文件(r8125.ko)是否正确复制
•如果系统配置异常(比如启动脚本丢失),大概率是 overlay 目录的文件没复制完整
•不同架构(armhf/arm64)的软件包存在差异,若混用会导致 "无法安装" 的报错
通过 chroot 进入目标根文件系统后,脚本开始执行一系列 "精装修" 操作:
# 设置DNS,解决联网问题echo "nameserver 8.8.8.8" >> /etc/resolv.conf# 安装核心工具(SSH、性能测试工具等)apt-get install -y openssh-server iperf3 stress-ng# 配置串口登录sed -i "s~(^ExecStart=.*)~# 1nExecStart=-/bin/sh -c '/bin/bash -l /dev/%I 2>&1'~" /usr/lib/systemd/system/serial-getty@.service# 安装硬件相关组件(视频、相机、显示服务等)${APT_INSTALL} gstreamer1.0-plugins-bad # 视频处理${APT_INSTALL} cheese v4l-utils # 相机支持${APT_INSTALL} /packages/xserver/*.deb # 显示服务
这部分是调试的重灾区,常见问题包括:
•网络不通:检查 resolv.conf 是否正确配置,软件源是否可用
•SSH 连不上:查看 openssh-server 是否安装,服务是否启用
•硬件功能失效(如相机打不开):检查对应的包(cheese、v4l-utils)是否安装成功
•启动后黑屏:可能是 xserver 或 weston 显示服务配置有误
# 清理缓存和临时文件rm -rf /var/lib/apt/lists/*rm -rf /var/cache/# 打包成最终镜像sudo tar zcf RN01-debian-base-$(date +%Y-%m-%d).tar.gz $TARGET_ROOTFS_DIR
清理步骤能减小镜像体积,如果不清除,镜像会比较大,但如果清理过度(比如误删必要文件),会导致系统启动失败。如果镜像能生成但无法启动,要检查这里是否误删了关键组件。
很多开发者调试时习惯 "头痛医头":摄像头不行就只查摄像头驱动,网络不通就只看网卡配置。但实际上,嵌入式系统的问题往往是 "牵一发而动全身",而这个构建脚本就是串联所有环节的 "主线"。
关注它的 3 个核心价值:
脚本的每一步都有明确输出(比如echo -e "�33[36m Install camera... �33[0m"),构建失败时,最后出现的提示信息就是 "案发现场"。
比如看到 "Install camera..." 后报错,说明相机相关的包安装失败,此时应检查:
•packages 目录下的相机相关 deb 包是否存在
•包的架构是否与目标系统匹配(armhf/arm64 不能混)
•依赖是否满足(可以在 chroot 环境手动执行 apt 安装命令排查)
嵌入式系统的组件依赖极其复杂:比如相机工作不仅需要相机驱动,还依赖视频框架(gstreamer)、显示服务(xserver)、硬件加速库(mpp)。
这个脚本清晰展示了依赖链条:先安装基础系统→再装视频框架→然后装相机应用→最后配置显示服务。当某个功能失效时,顺着脚本的安装顺序倒推,能快速找到缺失的依赖。

很多时候,相同的代码在 A 电脑能构建成功,在 B 电脑却失败,问题往往出在环境差异。这个脚本将所有构建步骤 "代码化",让环境配置变得可追溯:
•是不是忘了复制某个 overlay 配置文件?
•内核驱动的路径是否正确(脚本中是../kernel/drivers/...)?
•debug 版本需要的额外包(如 glmark2)是否在 VERSION=debug 时才安装?
1.善用 echo 输出中间变量
在关键步骤前增加输出,比如在复制驱动前加echo "Copying r8125.ko from $(pwd)/../kernel/...",确认路径是否正确。
2.保留 chroot 环境
脚本最后会退出 chroot 环境,调试时可以注释掉清理和打包步骤,手动进入chroot $TARGET_ROOTFS_DIR,逐条执行命令排查问题。
3.对比成功与失败的构建日志
保存一次成功构建的完整日志,当后续构建失败时,用diff命令对比日志,快速定位差异点。
嵌入式系统构建就像搭积木,而这个脚本就是积木的 "组装说明书"。读懂它,你不仅能快速解决眼前的调试问题,更能理解整个系统的 "骨骼架构"—— 这才是从 "解决问题" 到 "看透本质" 的关键一跃。
下次遇到系统构建问题时,不妨先打开这个脚本,顺着它的步骤一步步排查。很多时候,答案就藏在那些看似平凡的cp、apt-get和sed命令里。
(如果觉得有用,欢迎转发给你的开发伙伴~)
全部0条评论
快来发表一下你的评论吧 !