RK 平台镜像构建: Extra Part 脚本的关键作用

电子说

1.4w人已加入

描述

在瑞芯微(RK)平台嵌入式系统开发中,很多开发者都遇到过这样的诡异问题:镜像烧录后串口疯狂报错、系统无法登录,排查半天却找不到核心原因——大概率是忽略了post-extra-parts.sh这个关键脚本!今天我们就深扒这个脚本的底层逻辑、核心作用,以及如何基于它定制化需求,搞懂它为何是RK镜像完整性的“守护神”。

一、先读懂:post-extra-parts.sh核心代码拆解

先看脚本完整代码(核心片段),我们逐行拆解它的执行逻辑:

脚本

核心执行流程总结

1.环境初始化:声明仅在根文件系统构建阶段执行,引入RK官方辅助函数库(提供分区配置读取、日志输出等能力);

2.分区遍历:根据配置的“额外分区数量”,逐个处理每个分区;

3.清理与目录创建:删除历史构建残留,创建最终挂载点和临时目录,并通过软链接关联,保证路径一致性;

4.内置分区合并:对标记为“builtin”的分区,执行预准备操作后,通过rsync将临时构建目录的内容同步到最终根文件系统的挂载点。

二、致命后果:少了它,系统直接“瘫掉”

很多开发者会误以为这只是“可选的分区拷贝脚本”,但实际测试中,缺失该脚本会导致三大核心问题,直接让系统无法使用:

1. 分区挂载点缺失,系统启动串口报错

RK系统启动时会读取分区表配置,尝试挂载/data、/vendor、/mnt等额外分区,但如果post-extra-parts.sh没有执行:

•根文件系统中缺少对应的挂载点目录(如/data);

•内核挂载分区时会输出mount: can't find /data in /etc/fstab等报错,串口日志刷屏,挂载流程失败。

2. 内置分区数据丢失,系统核心功能异常

标记为“builtin”的分区(如/vendor)包含硬件驱动配置、厂商定制库、系统服务依赖文件:

•缺少rsync的同步逻辑,这些核心文件无法进入根文件系统;

•系统启动后驱动加载失败、服务启动异常,最终卡在登录界面,甚至直接进入emergency紧急模式。

3. 目录权限/结构错乱,无法登录系统

rsync -a参数会保留文件的权限、属主、目录结构,而手动创建目录无法保证一致性:

•缺失该脚本后,即使手动创建挂载点,也可能因权限错误(如/data目录权限不是777)导致应用无法写入;

•系统登录时依赖的用户目录、认证文件缺失/权限错误,最终表现为“密码正确但无法登录”“串口提示authentication failure”。

 

[    7.206308] rk-pcie fe160000.pcie: PCIe Link Fail, LTSSM is 0x0, hw_retries=0[    7.206315] rk-pcie fe160000.pcie: failed to initialize host[    7.336985] dwc3 fc000000.usb: device reset[    7.338242] systemd-journald[386]: Time jumped backwards, rotating.[    7.424531] android_work: sent uevent USB_STATE=CONNECTED[    7.521801] android_work: sent uevent USB_STATE=CONFIGURED[  OK  ] Stopped target emergency.target - Emergency Mode.         Mounting userdata.mount - /userdata...         Starting async-commit.serv…T for Rockchip BSP kernel > 4.4...         Starting modprobe@dm_mod.s…[0m - Load Kernel Module dm_mod...         Starting modprobe@efi_psto…- Load Kernel Module efi_pstore...[    7.716326] EXT4-fs (nvme0n1p5): VFS: Can't find ext4 filesystem         Starting modprobe@loop.ser…e - Load Kernel Module loop...[  OK  ] Stopped emergency.service - Emergency Shell.[FAILED] Failed to mount userdata.mount - /userdata.See 'systemctl status userdata.mount' for details.[DEPEND] Dependency failed for loca…s.target - Local File Systems.[  OK  ] Finished modprobe@dm_mod.s…e - Load Kernel Module dm_mod.[  OK  ] Finished modprobe@efi_psto…m - Load Kernel Module efi_pstore.[  OK  ] Finished modprobe@loop.service - Load Kernel Module loop.[  OK  ] Finished async-commit.serv…MIT for Rockchip BSP kernel > 4.4.[  OK  ] Started emergency.service - Emergency Shell.[  OK  ] Reached target emergency.target - Emergency Mode.[  OK  ] Finished console-setup.ser…[0m - Set console font and keymap.You are in emergency mode. After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or "exit"to boot into default mode.
Cannot open access to console, the root account is locked.See sulogin(8) man page for more details.
Press Enter to continue.

 

三、定制化扩展:基于脚本实现自定义需求

理解脚本逻辑后,我们可以基于它扩展自定义分区需求,以下是3个高频场景的修改示例:

场景1:新增自定义分区(如/mydata)

1.先在RK分区配置中添加mydata分区,标记为builtin;

2.在脚本中增加自定义预准备逻辑(示例):

 

if rk_extra_part_builtin $idx; thenrk_extra_part_prepare $idx
# 新增:针对/mydata分区添加自定义初始化if [ "$MOUNTPOINT" = "/mydata" ]; then# 创建自定义子目录mkdir -p "$OUTDIR/myapp"# 设置专属权限(如仅root可写)chmod 700 "$OUTDIR/myapp"# 拷贝自定义配置文件cp -f "$BUILD_DIR/config/myapp.conf" "$OUTDIR/myapp/"firsync -a "$OUTDIR/" "$TARGET_DIR/$MOUNTPOINT/"fi

 

场景2:过滤不需要同步的文件(如临时日志)

如果某分区临时目录中有不需要同步到镜像的文件(如编译日志),可在rsync前添加过滤:

 

# 新增:排除.log和.tmp临时文件rsync -a --exclude="*.log" --exclude="*.tmp" "$OUTDIR/" "$TARGET_DIR/$MOUNTPOINT/"

 

场景3:非内置分区的自定义处理(如外置SD卡分区)

脚本默认只处理builtin分区,可扩展else逻辑处理外置分区:

 

if rk_extra_part_builtin $idx; then# 原有内置分区逻辑...else# 新增:外置分区(如SD卡)创建默认挂载脚本message "Preparing external partition $MOUNTPOINT"# 在根文件系统中添加自动挂载脚本cat > "$TARGET_DIR/etc/init.d/mount_$MOUNTPOINT" << EOF#!/bin/shmount /dev/mmcblk1p1 $MOUNTPOINTEOFchmod +x "$TARGET_DIR/etc/init.d/mount_$MOUNTPOINT"fi

 

四、避坑小贴士

1.保留核心逻辑:修改时不要删除rm -rf清理、mkdir -p创建目录、rsync同步这三个核心步骤,否则会导致脏数据或分区缺失;

2.测试分区配置:修改后先通过rk_extra_part_num验证分区数量,确保遍历逻辑覆盖所有自定义分区;

3.串口日志调试:如果修改后系统异常,优先查看串口日志中Merging xxx是否输出,确认rsync是否执行成功。

总结

post-extra-parts.sh看似是RK镜像构建中的“小脚本”,实则是额外分区与根文件系统的“桥梁”——它不仅保证了分区挂载点的存在,还完成了内置分区核心数据的同步,是系统启动和登录的“基础保障”。

在实际开发中,既要理解它的核心逻辑避免“删错导致系统瘫痪”,也要掌握其扩展方式,通过自定义分区处理、文件过滤、权限配置等,适配项目的个性化需求。记住:嵌入式系统的“小脚本”往往藏着大乾坤,忽略它就是给系统埋坑!

审核编辑 黄宇

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

全部0条评论

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

×
20
完善资料,
赚取积分