RK平台上不会移植第三方系统?读懂这个脚本,轻松掌握嵌入式系统构建

电子说

1.4w人已加入

描述

 

 

在嵌入式开发领域,我们常遇到这样的场景:花了三天编译的系统镜像,启动后却发现摄像头无法工作;明明配置了 SSH 服务,却始终连不上设备;甚至有时候,一句 "构建失败的报错能让整个团队卡壳半天。

 

 

如果你也曾被这些问题困扰,那今天这篇文章值得深读。我们将通过分析一个真实的嵌入式系统构建脚本,带你看清系统从 0 到 的诞生过程,更重要的是 —— 学会在调试时抓住问题的 "七寸"

 

 

一、这到底是个什么脚本?

 

先看脚本的核心定位:这是一个基于 Debian 的嵌入式系统构建脚本,负责将基础镜像、驱动模块、应用组件 "缝合成可直接烧录的系统镜像。简单说,它是系统的 "接生婆",从基础镜像到最终可用的系统,全流程都由它掌控。

嵌入式系统

我们可以把它的工作拆解成 5 个关键阶段:

 

 

1. 环境初始化:定好 "施工图纸"

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
TARGET_ROOTFS_DIR="binary"  # 目标根文件系统目录case "${ARCH:-$1}" in       # 处理架构参数,支持armhf和arm64    arm|arm32|armhf)        ARCH=armhf        ;;    *)        ARCH=arm64        ;;esacVERSION=${VERSION:-"release"}  # 默认为release版本,支持debug模式

这部分就像施工前的 "图纸设计":明确构建目标(根目录位置)、硬件适配(架构选择)、功能模式(release/debug)。调试时第一个要检查的就是这里—— 如果架构选错,后续所有驱动和软件都会 "水土不服"

 

 

2. 基础镜像处理:打好 "地基"

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 检查基础镜像是否存在if [ ! -e linaro-bullseye-alip-*.tar.gz ]; then    echo "�33[36m Run mk-base-debian.sh first �33[0m"    exit -1fi# 解压基础镜像sudo tar -xpf linaro-bullseye-alip-*.tar.gz

基础镜像是系统的 "地基",如果这一步出错(比如镜像缺失、解压失败),后续所有操作都是空谈。调试时若遇到 "文件不存在的报错,先检查基础镜像是否正确生成(脚本提示要先运行 mk-base-debian.sh)。

 

 

3. 组件集成:搭建 "主体结构"

 

这部分是脚本的核心,像搭积木一样往基础系统里填充内容:

 

 

  •  
  •  
  •  
  •  
  •  
  •  
# 复制架构相关的软件包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)的软件包存在差异,若混用会导致 "无法安装的报错

 

 

4. 系统配置:"精装修阶段

 

通过 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 是否安装,服务是否启用

 

 

硬件功能失效(如相机打不开):检查对应的包(cheesev4l-utils)是否安装成功

 

 

启动后黑屏:可能是 xserver 或 weston 显示服务配置有误

 

 

5. 清理与打包:"竣工交房"

 

  •  
  •  
  •  
  •  
  •  
# 清理缓存和临时文件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 个核心价值:

 

 

1. 快速定位 "失败环节"

 

脚本的每一步都有明确输出(比如echo -e "�33[36m Install camera... �33[0m"),构建失败时,最后出现的提示信息就是 "案发现场"

 

 

比如看到 "Install camera..." 后报错,说明相机相关的包安装失败,此时应检查:

 

 

packages 目录下的相机相关 deb 包是否存在

 

 

包的架构是否与目标系统匹配(armhf/arm64 不能混)

 

 

依赖是否满足(可以在 chroot 环境手动执行 apt 安装命令排查)

 

 

2. 理解系统 "依赖关系"

 

嵌入式系统的组件依赖极其复杂:比如相机工作不仅需要相机驱动,还依赖视频框架(gstreamer)、显示服务(xserver)、硬件加速库(mpp)。

 

 

这个脚本清晰展示了依赖链条:先安装基础系统再装视频框架然后装相机应用最后配置显示服务。当某个功能失效时,顺着脚本的安装顺序倒推,能快速找到缺失的依赖

嵌入式系统

3. 排查 "环境配置问题

 

很多时候,相同的代码在 A 电脑能构建成功,在 电脑却失败,问题往往出在环境差异。这个脚本将所有构建步骤 "代码化",让环境配置变得可追溯:

 

 

是不是忘了复制某个 overlay 配置文件?

 

 

内核驱动的路径是否正确(脚本中是../kernel/drivers/...)?

 

 

debug 版本需要的额外包(如 glmark2)是否在 VERSION=debug 时才安装?

 

 

三、给开发者的 3 个调试技巧

 

1.善用 echo 输出中间变量

 

 

在关键步骤前增加输出,比如在复制驱动前加echo "Copying r8125.ko from $(pwd)/../kernel/...",确认路径是否正确。

 

 

2.保留 chroot 环境

 

 

脚本最后会退出 chroot 环境,调试时可以注释掉清理和打包步骤,手动进入chroot $TARGET_ROOTFS_DIR,逐条执行命令排查问题。

 

 

3.对比成功与失败的构建日志

 

 

保存一次成功构建的完整日志,当后续构建失败时,用diff命令对比日志,快速定位差异点。

 

 

写在最后

 

嵌入式系统构建就像搭积木,而这个脚本就是积木的 "组装说明书"。读懂它,你不仅能快速解决眼前的调试问题,更能理解整个系统的 "骨骼架构"—— 这才是从 "解决问题到 "看透本质的关键一跃。

 

 

下次遇到系统构建问题时,不妨先打开这个脚本,顺着它的步骤一步步排查。很多时候,答案就藏在那些看似平凡的cpapt-getsed命令里。

 

 

(如果觉得有用,欢迎转发给你的开发伙伴~)

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分