RK3506 Linux6.1 fstab分区调整及残留问题排查一、问题现象为了关掉系统自动挂载 OEM、UserData 分区的逻辑我在30-fstab.sh的分区遍历代码前面加了exit 0提前结束脚本运行本意是直接禁用这两个分区的自动写入fstab逻辑。改完脚本后我只单独跑了./build.sh rootfs增量编译结果发现/etc/fstab里依旧存在 oem、userdata 两条 PARTLABEL 挂载怎么改脚本都去不掉。PARTLABELoem /oem ubifs defaults 0 2 PARTLABELuserdata /userdata ubifs defaults 0 2预期效果加了 exit 0 截断代码后新编译出来的fstab不会再有这两个分区挂载。实际效果分区生成代码已经被禁用了但这两条挂载条目一直残留在文件里删不掉。二、脚本修改说明本次修改思路很简单在额外分区生成逻辑执行前直接退出脚本彻底不让OEM、UserData的挂载逻辑跑起来代码截断位置是没问题的。# 省略前文根文件系统初始化、基础虚拟分区挂载逻辑 # 人工新增提前退出禁用下方所有额外分区生成逻辑 exit 0 # 以下分区遍历代码完全失效不会执行 for idx in $(seq 1 $(rk_extra_part_num)); do DEV$(rk_extra_part_dev $idx) MOUNTPOINT$(rk_extra_part_mountpoint $idx) FS_TYPE$(rk_extra_part_fstype $idx) if rk_extra_part_builtin $idx; then del_part $DEV $MOUNTPOINT $FS_TYPE continue fi fixup_device_part $DEV $MOUNTPOINT $FS_TYPE \ $(rk_extra_part_options $idx) done三、问题根本原因最终定位经过加日志调试、对比文件变化确认问题不是代码改得不对也不是工具偷偷二次注入。真正原因很简单没清工程产物就增量编译旧的fstab残留文件一直存在被重复复用了。3.1 完整问题链路历史编译最开始脚本没加exit 0分区循环正常运行自动生成了oem、userdata的PARTLABEL挂载并且固化在了output输出目录的fstab中脚本修改后新增exit 0截断逻辑新版脚本已经不会主动生成这两个分区挂载了编译操作失误改完脚本后没有执行 ./build.sh cleanall 清空工程只单独编译了rootfsBuildroot机制增量编译不会删除target目录下的旧文件只会增量更新之前生成的旧fstab会被直接沿用脚本本身短板原脚本只用touch $FSTAB初始化文件这个命令只会刷新文件时间不会清空内容清理不了历史残留配置最终现象旧fstab的挂载条目被继承下来给人一种“脚本改了不生效”的错觉。四、辅助排查验证为了验证确实是文件残留导致的问题我在脚本开头加了强制删除fstab 分段打印日志的调试逻辑逐段观察fstab内容变化精准定位问题mkdir-p$TARGET_DIR/etcrm-f$TARGET_DIR/etc/fstabtouch$FSTABecho1111111111111111111111111cat$TARGET_DIR/etc/fstabcase$RK_ROOTFS_TYPEinext[234])fixup_root$RK_ROOTFS_TYPE;;*)fixup_root auto;;esacecho22222222222222222222222222222cat$TARGET_DIR/etc/fstabif[$(readlink$TARGET_DIR/sbin/init)!/lib/systemd/systemd];thenmessageFixup basic partitions for non-systemd init...fixup_basic_part proc /proc fixup_basic_part devtmpfs /dev fixup_basic_part devpts /dev/ptsmode0620,ptmxmode0000,gid5fixup_basic_part tmpfs /dev/shm nosuid,nodev,noexec fixup_basic_part sysfs /sys nosuid,nodev,noexec fixup_basic_part configfs /sys/kernel/config fixup_basic_part debugfs /sys/kernel/debug fixup_basic_part pstore /sys/fs/pstore nosuid,nodev,noexecfiecho3333333333333333333333333333333cat$TARGET_DIR/etc/fstabif[$POST_OSrecovery];thenfixup_device_part /dev/sda1 /mnt/udisk auto fixup_device_part /dev/mmcblk1p1 /mnt/sdcard autofiecho44444444444444444444444444444444cat$TARGET_DIR/etc/fstab# 原本此处加了exit 0增量编译残留导致前期误判foridxin$(seq1$(rk_extra_part_num));doDEV$(rk_extra_part_dev $idx)MOUNTPOINT$(rk_extra_part_mountpoint $idx)FS_TYPE$(rk_extra_part_fstype $idx)ifrk_extra_part_builtin$idx;thendel_part$DEV$MOUNTPOINT$FS_TYPEcontinuefifixup_device_part$DEV$MOUNTPOINT$FS_TYPE\$(rk_extra_part_options $idx)doneecho5555555555555555555555555555555555cat$TARGET_DIR/etc/fstab本次调试对应的完整编译运行 Log 如下可以清晰看到内容变化Fixing up /etc/fstab... 1111111111111111111111111 Fixing up rootfs type: auto 22222222222222222222222222222 Fixup basic partitions for non-systemd init... Fixing up basic partition: proc /proc Fixing up basic partition: devtmpfs /dev Fixing up basic partition: devpts /dev/pts mode0620,ptmxmode0000,gid5 Fixing up basic partition: tmpfs /dev/shm nosuid,nodev,noexec Fixing up basic partition: sysfs /sys nosuid,nodev,noexec Fixing up basic partition: configfs /sys/kernel/config Fixing up basic partition: debugfs /sys/kernel/debug Fixing up basic partition: pstore /sys/fs/pstore nosuid,nodev,noexec 3333333333333333333333333333333 proc /proc proc defaults 0 0 devtmpfs /dev devtmpfs defaults 0 0 devpts /dev/pts devpts mode0620,ptmxmode0000,gid5 0 0 tmpfs /dev/shm tmpfs nosuid,nodev,noexec 0 0 sysfs /sys sysfs nosuid,nodev,noexec 0 0 configfs /sys/kernel/config configfs defaults 0 0 debugfs /sys/kernel/debug debugfs defaults 0 0 pstore /sys/fs/pstore pstore nosuid,nodev,noexec 0 0 44444444444444444444444444444444 proc /proc proc defaults 0 0 devtmpfs /dev devtmpfs defaults 0 0 devpts /dev/pts devpts mode0620,ptmxmode0000,gid5 0 0 tmpfs /dev/shm tmpfs nosuid,nodev,noexec 0 0 sysfs /sys sysfs nosuid,nodev,noexec 0 0 configfs /sys/kernel/config configfs defaults 0 0 debugfs /sys/kernel/debug debugfs defaults 0 0 pstore /sys/fs/pstore pstore nosuid,nodev,noexec 0 0 Fixing up device partition: PARTLABELoem /oem ubifs defaults Fixing up device partition: PARTLABELuserdata /userdata ubifs defaults 5555555555555555555555555555555555 proc /proc proc defaults 0 0 devtmpfs /dev devtmpfs defaults 0 0 devpts /dev/pts devpts mode0620,ptmxmode0000,gid5 0 0 tmpfs /dev/shm tmpfs nosuid,nodev,noexec 0 0 sysfs /sys sysfs nosuid,nodev,noexec 0 0 configfs /sys/kernel/config configfs defaults 0 0 debugfs /sys/kernel/debug debugfs defaults 0 0 pstore /sys/fs/pstore pstore nosuid,nodev,noexec 0 0 PARTLABELoem /oem ubifs defaults 0 2 PARTLABELuserdata /userdata ubifs defaults 0 2Log 关键复盘点1、前期清空fstab后前序所有流程都不会生成 oem/userdata 挂载2、只有尾部分区循环执行后才会打印设备分区修复日志并生成两条 PARTLABEL 挂载3、结合最终结论该现象仅出现在「未cleanall增量编译」场景旧产物残留让我误以为exit0不生效清完工程重新编译后完全正常。五、修复方案方案一全量清理后再编译标准规范做法后续只要改fstab、分区配置、根文件系统相关脚本必须先清工程再编译避免增量编译复用旧文件出问题./build.sh cleanall ./build.sh rootfs方案二脚本内强制清空fstab兜底长效方案优化脚本初始化逻辑不再只用touch弱初始化每次执行脚本都强制重建fstab从代码层面杜绝残留问题mkdir -p $TARGET_DIR/etc # 清空历史残留文件强制重建纯净fstab rm -f $FSTAB touch $FSTAB六、最终结论本次添加的exit 0完全生效已经成功禁用了额外分区自动生成逻辑代码修改本身没有任何问题fstab里残留的两个分区挂载都是之前编译留下来的旧产物并不是本次编译生成的问题核心原因编译流程不规范改完脚本没清工程增量编译复用了旧文件导致配置残留原脚本初始化逻辑有缺陷单纯touch无法重置文件不能自动清理历史残留配置后续修改根文件系统、分区、fstab相关配置务必先cleanall再编译防止旧产物干扰调试结果。
【Rk3506】 fstab分区调整及残留问题排查
发布时间:2026/7/15 19:58:27
RK3506 Linux6.1 fstab分区调整及残留问题排查一、问题现象为了关掉系统自动挂载 OEM、UserData 分区的逻辑我在30-fstab.sh的分区遍历代码前面加了exit 0提前结束脚本运行本意是直接禁用这两个分区的自动写入fstab逻辑。改完脚本后我只单独跑了./build.sh rootfs增量编译结果发现/etc/fstab里依旧存在 oem、userdata 两条 PARTLABEL 挂载怎么改脚本都去不掉。PARTLABELoem /oem ubifs defaults 0 2 PARTLABELuserdata /userdata ubifs defaults 0 2预期效果加了 exit 0 截断代码后新编译出来的fstab不会再有这两个分区挂载。实际效果分区生成代码已经被禁用了但这两条挂载条目一直残留在文件里删不掉。二、脚本修改说明本次修改思路很简单在额外分区生成逻辑执行前直接退出脚本彻底不让OEM、UserData的挂载逻辑跑起来代码截断位置是没问题的。# 省略前文根文件系统初始化、基础虚拟分区挂载逻辑 # 人工新增提前退出禁用下方所有额外分区生成逻辑 exit 0 # 以下分区遍历代码完全失效不会执行 for idx in $(seq 1 $(rk_extra_part_num)); do DEV$(rk_extra_part_dev $idx) MOUNTPOINT$(rk_extra_part_mountpoint $idx) FS_TYPE$(rk_extra_part_fstype $idx) if rk_extra_part_builtin $idx; then del_part $DEV $MOUNTPOINT $FS_TYPE continue fi fixup_device_part $DEV $MOUNTPOINT $FS_TYPE \ $(rk_extra_part_options $idx) done三、问题根本原因最终定位经过加日志调试、对比文件变化确认问题不是代码改得不对也不是工具偷偷二次注入。真正原因很简单没清工程产物就增量编译旧的fstab残留文件一直存在被重复复用了。3.1 完整问题链路历史编译最开始脚本没加exit 0分区循环正常运行自动生成了oem、userdata的PARTLABEL挂载并且固化在了output输出目录的fstab中脚本修改后新增exit 0截断逻辑新版脚本已经不会主动生成这两个分区挂载了编译操作失误改完脚本后没有执行 ./build.sh cleanall 清空工程只单独编译了rootfsBuildroot机制增量编译不会删除target目录下的旧文件只会增量更新之前生成的旧fstab会被直接沿用脚本本身短板原脚本只用touch $FSTAB初始化文件这个命令只会刷新文件时间不会清空内容清理不了历史残留配置最终现象旧fstab的挂载条目被继承下来给人一种“脚本改了不生效”的错觉。四、辅助排查验证为了验证确实是文件残留导致的问题我在脚本开头加了强制删除fstab 分段打印日志的调试逻辑逐段观察fstab内容变化精准定位问题mkdir-p$TARGET_DIR/etcrm-f$TARGET_DIR/etc/fstabtouch$FSTABecho1111111111111111111111111cat$TARGET_DIR/etc/fstabcase$RK_ROOTFS_TYPEinext[234])fixup_root$RK_ROOTFS_TYPE;;*)fixup_root auto;;esacecho22222222222222222222222222222cat$TARGET_DIR/etc/fstabif[$(readlink$TARGET_DIR/sbin/init)!/lib/systemd/systemd];thenmessageFixup basic partitions for non-systemd init...fixup_basic_part proc /proc fixup_basic_part devtmpfs /dev fixup_basic_part devpts /dev/ptsmode0620,ptmxmode0000,gid5fixup_basic_part tmpfs /dev/shm nosuid,nodev,noexec fixup_basic_part sysfs /sys nosuid,nodev,noexec fixup_basic_part configfs /sys/kernel/config fixup_basic_part debugfs /sys/kernel/debug fixup_basic_part pstore /sys/fs/pstore nosuid,nodev,noexecfiecho3333333333333333333333333333333cat$TARGET_DIR/etc/fstabif[$POST_OSrecovery];thenfixup_device_part /dev/sda1 /mnt/udisk auto fixup_device_part /dev/mmcblk1p1 /mnt/sdcard autofiecho44444444444444444444444444444444cat$TARGET_DIR/etc/fstab# 原本此处加了exit 0增量编译残留导致前期误判foridxin$(seq1$(rk_extra_part_num));doDEV$(rk_extra_part_dev $idx)MOUNTPOINT$(rk_extra_part_mountpoint $idx)FS_TYPE$(rk_extra_part_fstype $idx)ifrk_extra_part_builtin$idx;thendel_part$DEV$MOUNTPOINT$FS_TYPEcontinuefifixup_device_part$DEV$MOUNTPOINT$FS_TYPE\$(rk_extra_part_options $idx)doneecho5555555555555555555555555555555555cat$TARGET_DIR/etc/fstab本次调试对应的完整编译运行 Log 如下可以清晰看到内容变化Fixing up /etc/fstab... 1111111111111111111111111 Fixing up rootfs type: auto 22222222222222222222222222222 Fixup basic partitions for non-systemd init... Fixing up basic partition: proc /proc Fixing up basic partition: devtmpfs /dev Fixing up basic partition: devpts /dev/pts mode0620,ptmxmode0000,gid5 Fixing up basic partition: tmpfs /dev/shm nosuid,nodev,noexec Fixing up basic partition: sysfs /sys nosuid,nodev,noexec Fixing up basic partition: configfs /sys/kernel/config Fixing up basic partition: debugfs /sys/kernel/debug Fixing up basic partition: pstore /sys/fs/pstore nosuid,nodev,noexec 3333333333333333333333333333333 proc /proc proc defaults 0 0 devtmpfs /dev devtmpfs defaults 0 0 devpts /dev/pts devpts mode0620,ptmxmode0000,gid5 0 0 tmpfs /dev/shm tmpfs nosuid,nodev,noexec 0 0 sysfs /sys sysfs nosuid,nodev,noexec 0 0 configfs /sys/kernel/config configfs defaults 0 0 debugfs /sys/kernel/debug debugfs defaults 0 0 pstore /sys/fs/pstore pstore nosuid,nodev,noexec 0 0 44444444444444444444444444444444 proc /proc proc defaults 0 0 devtmpfs /dev devtmpfs defaults 0 0 devpts /dev/pts devpts mode0620,ptmxmode0000,gid5 0 0 tmpfs /dev/shm tmpfs nosuid,nodev,noexec 0 0 sysfs /sys sysfs nosuid,nodev,noexec 0 0 configfs /sys/kernel/config configfs defaults 0 0 debugfs /sys/kernel/debug debugfs defaults 0 0 pstore /sys/fs/pstore pstore nosuid,nodev,noexec 0 0 Fixing up device partition: PARTLABELoem /oem ubifs defaults Fixing up device partition: PARTLABELuserdata /userdata ubifs defaults 5555555555555555555555555555555555 proc /proc proc defaults 0 0 devtmpfs /dev devtmpfs defaults 0 0 devpts /dev/pts devpts mode0620,ptmxmode0000,gid5 0 0 tmpfs /dev/shm tmpfs nosuid,nodev,noexec 0 0 sysfs /sys sysfs nosuid,nodev,noexec 0 0 configfs /sys/kernel/config configfs defaults 0 0 debugfs /sys/kernel/debug debugfs defaults 0 0 pstore /sys/fs/pstore pstore nosuid,nodev,noexec 0 0 PARTLABELoem /oem ubifs defaults 0 2 PARTLABELuserdata /userdata ubifs defaults 0 2Log 关键复盘点1、前期清空fstab后前序所有流程都不会生成 oem/userdata 挂载2、只有尾部分区循环执行后才会打印设备分区修复日志并生成两条 PARTLABEL 挂载3、结合最终结论该现象仅出现在「未cleanall增量编译」场景旧产物残留让我误以为exit0不生效清完工程重新编译后完全正常。五、修复方案方案一全量清理后再编译标准规范做法后续只要改fstab、分区配置、根文件系统相关脚本必须先清工程再编译避免增量编译复用旧文件出问题./build.sh cleanall ./build.sh rootfs方案二脚本内强制清空fstab兜底长效方案优化脚本初始化逻辑不再只用touch弱初始化每次执行脚本都强制重建fstab从代码层面杜绝残留问题mkdir -p $TARGET_DIR/etc # 清空历史残留文件强制重建纯净fstab rm -f $FSTAB touch $FSTAB六、最终结论本次添加的exit 0完全生效已经成功禁用了额外分区自动生成逻辑代码修改本身没有任何问题fstab里残留的两个分区挂载都是之前编译留下来的旧产物并不是本次编译生成的问题核心原因编译流程不规范改完脚本没清工程增量编译复用了旧文件导致配置残留原脚本初始化逻辑有缺陷单纯touch无法重置文件不能自动清理历史残留配置后续修改根文件系统、分区、fstab相关配置务必先cleanall再编译防止旧产物干扰调试结果。