root@rk3308-buildroot:/userdata# ls -l total 19512...
Créé le : 16 octobre 2025
Répondu en utilisant GPT-5 Thinking par Chat01
Créé le : 16 octobre 2025
Répondu en utilisant GPT-5 Thinking par Chat01
root@rk3308-buildroot:/userdata# ls -l
total 19512
drwxr-xr-x 2 root root 160 Jan 1 00:00 cfg
-rwxr-xr-x 1 root root 1102928 Oct 15 2025 denoise_simple_24k.onnx
-rwxr-xr-x 1 root root 17909121 Oct 15 2025 libonnxruntime.so
lrwxrwxrwx 1 root root 9 Jan 1 00:00 userdata -> /userdata
-rw-r--r-- 1 root root 962560 Jan 1 00:00 userdata.tar
上面是我正常的userdata目录,为什么我有时候重启的时候userdata目录会变成这样
root@rk3308-buildroot:/userdata# ls -l
total 7100
drwxr-xr-x 2 root root 160 Jan 1 00:00 cfg
-rwxrwxrwx 1 root root 1102928 Sep 19 2025 denoise_simple_24k.onnx
-rwxr-xr-x 1 root root 2528768 Jan 1 00:00 libonnxruntime.so
lrwxrwxrwx 1 root root 9 Jan 1 00:00 userdata -> /userdata
-rw-r--r-- 1 root root 3633152 Jan 1 00:00 userdata.tar
相关命令打印
root@rk3308-buildroot:/userdata# df -h /userdata
Filesystem Size Used Available Use% Mounted on
ubi2:userdata 53.1M 8.9M 44.2M 17% /userdata
root@rk3308-buildroot:/userdata# mount | grep userdata
ubi2:userdata on /userdata type ubifs (rw,relatime,assert=read-only,ubi=2,vol=0)
我的初始化脚本
#XBH_PATCH_START
mount -o rw,remount /;
ubimkvol /dev/ubi1 -N oem -m
ubiattach -p /dev/mtd7
mkdir -p /oem
mount -t ubifs ubi1:oem /oem
ubimkvol /dev/ubi2 -N userdata -m
ubiattach -p /dev/mtd8
mkdir -p /userdata
mount -t ubifs ubi2:userdata /userdata
ln -s /userdata /data
mount -t debugfs none /sys/kernel/debug
mount -o ro,remount /;
:
#XBH_PATCH_END
root@rk3308-buildroot:/etc/init.d#
看起来这是 UBI/UBIFS 初始化脚本写法导致的“挂错盘/被恢复默认” 问题,不是文件自己“变小/变大”。你偶发地把 /userdata
挂到了另一套同名卷上,或者被某个恢复脚本用 tar 包覆盖了一部分内容,所以同一目录在不同次重启后看到的是两套不一样的文件。
顺序和设备号都不对:
你的脚本是先 ubimkvol /dev/ubi2 ...
再 ubiattach -p /dev/mtd8
。正确顺序应当是 先 attach -> 再 mkvol -> 再 mount。另外你把 UBI 设备号硬编码成 ubi1/ubi2
,但 UBI 设备号是运行时动态分配 的(取决于其他分区何时被 attach)。启动顺序稍有变化,ubi2
可能就不再对应 /dev/mtd8
,结果你 mount 到了另一块带有同名 userdata
的卷,于是文件集“看起来变了”。
不该每次都 ubimkvol -m
:
卷只应在“第一次格式化时”创建。你现在每次启动都 ubimkvol
,在设备号漂移时,可能在错误的 UBI 设备上又创建了一个“吃满空间”的卷,或触发其他恢复逻辑,进一步放大了不一致。
疑似有恢复/打包脚本:
目录里有 userdata.tar
,而且大小会变(0.92MB ↔ 3.6MB)。这通常意味着有脚本在首启/异常时会 解包或回滚 /userdata
。这解释了为什么有时候你的 libonnxruntime.so
会从 17.1MB 换成 2.5MB 的旧版本、权限/时间戳也不同。
sh# 看 UBI 设备号与 MTD 的对应关系 dmesg | grep -i -E 'ubi|ubifs' ubinfo -a ubinfo -p /dev/mtd7 ubinfo -p /dev/mtd8 # 当前到底挂了哪个设备号 ls -l /dev/ubi* grep userdata /proc/mounts # 查有没有恢复脚本在解/打包 userdata.tar grep -R "userdata.tar" /etc/init.d /etc/rc* /etc/* 2>/dev/null
方案 A:给每个 MTD 固定 UBI 设备号(简单可靠)
sh# 正确的顺序:先 attach,再(必要时)mkvol,再 mount mount -o rw,remount / # 固定设备号,避免漂移:/dev/mtd7 -> ubi1, /dev/mtd8 -> ubi2 ubiattach -p /dev/mtd7 -d 1 2>/dev/null || true ubiattach -p /dev/mtd8 -d 2 2>/dev/null || true # 只在卷不存在时创建 ubinfo /dev/ubi1 -N oem >/dev/null 2>&1 || ubimkvol /dev/ubi1 -N oem -m ubinfo /dev/ubi2 -N userdata >/dev/null 2>&1 || ubimkvol /dev/ubi2 -N userdata -m mkdir -p /oem /userdata mount -t ubifs ubi1:oem /oem mount -t ubifs ubi2:userdata /userdata ln -sf /userdata /data mount -t debugfs none /sys/kernel/debug mount -o ro,remount /
方案 B:动态获取设备号并用卷名挂载(更通用)
shmount -o rw,remount / # 先 attach,拿到设备号 ubiattach -p /dev/mtd7 2>/dev/null || true OEM_DEV=$(ubinfo -p /dev/mtd7 | awk -F': ' '/UBI device number/ {print $2}') ubiattach -p /dev/mtd8 2>/dev/null || true USR_DEV=$(ubinfo -p /dev/mtd8 | awk -F': ' '/UBI device number/ {print $2}') # 只在缺失时创建卷 ubinfo /dev/ubi${OEM_DEV} -N oem >/dev/null 2>&1 || ubimkvol /dev/ubi${OEM_DEV} -N oem -m ubinfo /dev/ubi${USR_DEV} -N userdata >/dev/null 2>&1 || ubimkvol /dev/ubi${USR_DEV} -N userdata -m mkdir -p /oem /userdata # 用 volname 挂载到刚 attach 的那个设备上 mount -t ubifs -o volname=oem /dev/ubi${OEM_DEV} /oem mount -t ubifs -o volname=userdata /dev/ubi${USR_DEV} /userdata ln -sf /userdata /data mount -t debugfs none /sys/kernel/debug mount -o ro,remount /
注意:不要再把
ubimkvol
放在ubiattach
前面,也不要无条件每次创建卷。固定-d
或动态查询设备号,二选一就能杜绝“挂到别的 UBI 设备”的情况。
/userdata
里这个自指向的软链删掉:rm -f /userdata/userdata
,避免工具递归时出问题。userdata.tar
。ubinfo -p /dev/mtd8
的 “UBI device number” 是否固定mount | grep userdata
是否始终指向同一个 ubiX:userdata
ls -l /userdata/libonnxruntime.so
的大小/时间戳是否再变化按上面改完后,/userdata
每次都会挂到 同一个 UBI 设备上的 同一个 卷,文件内容就不会“时好时坏”了。需要的话我也可以帮你把你现有脚本改成稳态版本(贴上完整脚本我直接给你改好)。
root@rk3308-buildroot:/# dmesg | grep -i -E 'ubi|ubifs'
UBIFS (ubi2:0): un-mount UBI device 2
UBIFS (ubi2:0): background thread "ubifs_bgt2_0" stops
UBIFS (ubi2:0): Mounting in unauthenticated mode
UBIFS (ubi2:0): background thread "ubifs_bgt2_0" started, PID 12796
UBIFS (ubi2:0): UBIFS: mounted UBI device 2, volume 0, name "userdata"
UBIFS (ubi2:0): LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes
UBIFS (ubi2:0): FS size: 60948480 bytes (58 MiB, 480 LEBs), journal size 9023488 bytes (8 MiB, 72 LEBs)
UBIFS (ubi2:0): reserved for root: 0 bytes (0 KiB)
UBIFS (ubi2:0): media format: w4/r0 (latest is w5/r0), UUID 4EB2ECE0-1CDE-4E21-8097-BAEA765D3947, small LPT model
UBIFS (ubi2:0): un-mount UBI device 2
UBIFS (ubi2:0): background thread "ubifs_bgt2_0" stops
ubi: mtd8 is already attached to ubi2
UBIFS (ubi2:0): Mounting in unauthenticated mode
UBIFS (ubi2:0): background thread "ubifs_bgt2_0" started, PID 13747
UBIFS (ubi2:0): UBIFS: mounted UBI device 2, volume 0, name "userdata"
UBIFS (ubi2:0): LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes
UBIFS (ubi2:0): FS size: 60948480 bytes (58 MiB, 480 LEBs), journal size 9023488 bytes (8 MiB, 72 LEBs)
UBIFS (ubi2:0): reserved for root: 0 bytes (0 KiB)
UBIFS (ubi2:0): media format: w4/r0 (latest is w5/r0), UUID 4EB2ECE0-1CDE-4E21-8097-BAEA765D3947, small LPT model
root@rk3308-buildroot:/# ubinfo -a
UBI version: 1
Count of UBI devices: 3
UBI control device major/minor: 10:125
Present UBI devices: ubi0, ubi1, ubi2
ubi0
Volumes count: 1
Logical eraseblock size: 126976 bytes, 124.0 KiB
Total amount of logical eraseblocks: 200 (25395200 bytes, 24.2 MiB)
Amount of available logical eraseblocks: 0 (0 bytes)
Maximum count of volumes 128
Count of bad physical eraseblocks: 0
Count of reserved physical eraseblocks: 20
Current maximum erase counter value: 2
Minimum input/output unit size: 2048 bytes
Character device major/minor: 246:0
Present volumes: 0
Volume ID: 0 (on ubi0)
Type: dynamic
Alignment: 1
Size: 176 LEBs (22347776 bytes, 21.3 MiB)
State: OK
Name: rootfs
Character device major/minor: 246:1
===================================
ubi1
Volumes count: 1
Logical eraseblock size: 126976 bytes, 124.0 KiB
Total amount of logical eraseblocks: 80 (10158080 bytes, 9.6 MiB)
Amount of available logical eraseblocks: 0 (0 bytes)
Maximum count of volumes 128
Count of bad physical eraseblocks: 0
Count of reserved physical eraseblocks: 20
Current maximum erase counter value: 3
Minimum input/output unit size: 2048 bytes
Character device major/minor: 245:0
Present volumes: 0
Volume ID: 0 (on ubi1)
Type: dynamic
Alignment: 1
Size: 56 LEBs (7110656 bytes, 6.7 MiB)
State: OK
Name: oem
Character device major/minor: 245:1
===================================
ubi2
Volumes count: 1
Logical eraseblock size: 126976 bytes, 124.0 KiB
Total amount of logical eraseblocks: 515 (65392640 bytes, 62.3 MiB)
Amount of available logical eraseblocks: 0 (0 bytes)
Maximum count of volumes 128
Count of bad physical eraseblocks: 0
Count of reserved physical eraseblocks: 20
Current maximum erase counter value: 2
Minimum input/output unit size: 2048 bytes
Character device major/minor: 244:0
Present volumes: 0
Volume ID: 0 (on ubi2)
Type: dynamic
Alignment: 1
Size: 491 LEBs (62345216 bytes, 59.4 MiB)
State: OK
Name: userdata
Character device major/minor: 244:1
root@rk3308-buildroot:/# ubinfo -p /dev/mtd7
ubinfo: invalid option -- 'p'
Use -h for help
root@rk3308-buildroot:/# ubinfo -p /dev/mtd8
ubinfo: invalid option -- 'p'
Use -h for help
root@rk3308-buildroot:/#
root@rk3308-buildroot:/# # 当前到底挂了哪个设备号
root@rk3308-buildroot:/# ls -l /dev/ubi*
crw------- 1 root root 246, 0 Jan 1 00:00 /dev/ubi0
crw------- 1 root root 246, 1 Jan 1 00:00 /dev/ubi0_0
crw------- 1 root root 245, 0 Jan 1 00:00 /dev/ubi1
crw------- 1 root root 245, 1 Jan 1 00:00 /dev/ubi1_0
crw------- 1 root root 244, 0 Jan 1 00:00 /dev/ubi2
crw------- 1 root root 244, 1 Jan 1 00:00 /dev/ubi2_0
crw------- 1 root root 10, 125 Jan 1 00:00 /dev/ubi_ctrl
root@rk3308-buildroot:/# grep userdata /proc/mounts
ubi2:userdata /userdata ubifs rw,relatime,assert=read-only,ubi=2,vol=0 0 0
root@rk3308-buildroot:/#
root@rk3308-buildroot:/# # 查有没有恢复脚本在解/打包 userdata.tar
ev/null3308-buildroot:/# grep -R "userdata.tar" /etc/init.d /etc/rc* /etc/* 2>/de
root@rk3308-buildroot:/#
root@rk3308-buildroot:/#
谢谢把日志贴出来!这些信息已经能定位到几个关键点了。
/userdata
当前挂的是 ubi2:userdata,而且确实来自 mtd8:dmesg
里有 “mtd8 is already attached to ubi2”,随后挂载 ubi2:userdata
成功。ubi0(rootfs) / ubi1(oem) / ubi2(userdata)
,每个各 1 个卷,名字和大小都正常。ubi2:0
的记录:先挂、又卸、又挂。说明有不止一个地方在动 userdata 的挂载/attach(你的脚本+系统里别的脚本/内核参数),存在竞态。换句话说:现在这一轮启动看起来是“对”的,但你遇到的“有时文件一套、有时另一套”的现象,很大概率仍然来自 启动顺序/重复 attach 的竞态 + 启动时的恢复/解包动作。你的 init 片段里“先 mkvol 后 attach”的逻辑也会放大这种不稳定。
重复 attach / 重复挂载
dmesg 里明确出现两次挂载+一次“mtd8 已经 attach 到 ubi2”。说明 某个更早的阶段 已经把 mtd8→ubi2 attach 了,你的脚本又再做了一次。多方同时管理 UBI/UBIFS,极易出现时好时坏的最终状态(某次先挂了一个临时/空卷,随后被你的脚本切回,或反之)。
启动时的恢复/回滚动作仍在运行
目录里有 userdata.tar
,之前你 grep 写错了(命令被截断了),建议重查。很多固件会在“首启或判定损坏”时解包这个 tar,覆盖 /userdata
的一部分,导致你偶尔看到旧版 libonnxruntime.so
(2.5MB)替换了新版(17MB)。
/userdata 里那个“自指向”的软链
你目录里有 userdata -> /userdata
的软链,这东西极容易让打包/解包脚本、扫描工具“钻进自身”或产生奇怪路径,别保留它。
sh# 1) 谁在自动 attach?看内核启动参数(有无 ubi.mtd= 之类) cat /proc/cmdline # 2) 这台机子当前每个 UBI 号对应哪个 MTD(不用 ubinfo -p,用 sysfs) for u in /sys/class/ubi/ubi*; do echo "$u: mtd$(cat $u/mtd_num) name=$(cat $u/name)" done # 3) 把“谁在动 /userdata”的脚本揪出来(这次别输错) grep -R "userdata.tar" /etc/init.d /etc/rc* /etc/* 2>/dev/null grep -R "ubimkvol\|ubiattach\|mount -t ubifs\|volname=userdata" /etc/init.d /etc/rc* 2>/dev/null # 4) 清掉那个自指向软链(安全) [ -L /userdata/userdata ] && rm -f /userdata/userdata # 5) 给关键文件打指纹,后面一对比就知道有没有“被换过” sha256sum /userdata/libonnxruntime.so /userdata/denoise_simple_24k.onnx > /userdata/.fingerprint.sha256
思路:
- 永远先 attach,后 mkvol,后 mount
- 只在缺失时创建卷(避免每次都 mkvol)
- 优先用 固定 UBI 设备号(
-d
)或 按卷名挂载(-o volname=
),两种都行- 容错:如果别的地方已 attach,就跳过
方案 A:固定设备号(简单直接)
sh# --- begin: stable-ubi.sh --- mount -o rw,remount / # 固定 mtd7 -> ubi1(oem),mtd8 -> ubi2(userdata) ubiattach -p /dev/mtd7 -d 1 2>/dev/null || true ubiattach -p /dev/mtd8 -d 2 2>/dev/null || true # 只在卷不存在时创建(存在就跳过) ubinfo /dev/ubi1 -N oem >/dev/null 2>&1 || ubimkvol /dev/ubi1 -N oem -m ubinfo /dev/ubi2 -N userdata >/dev/null 2>&1 || ubimkvol /dev/ubi2 -N userdata -m mkdir -p /oem /userdata # 用卷名挂(更稳),即使将来 LEB 数变也不受影响 mountpoint -q /oem || mount -t ubifs -o volname=oem /dev/ubi1 /oem mountpoint -q /userdata || mount -t ubifs -o volname=userdata /dev/ubi2 /userdata ln -sf /userdata /data mount -t debugfs none /sys/kernel/debug mount -o ro,remount / # --- end: stable-ubi.sh ---
方案 B:动态获取设备号(适合不方便固定 -d 的固件)
sh# --- begin: stable-ubi-dyn.sh --- mount -o rw,remount / # 尝试 attach(若已 attach 会报“已 attach”,忽略) ubiattach -p /dev/mtd7 2>/dev/null || true ubiattach -p /dev/mtd8 2>/dev/null || true # 从 sysfs 查出 ubi 号 OEM_DEV=$(for u in /sys/class/ubi/ubi*; do [ "$(cat $u/mtd_num)" = "7" ] && basename "$u" | tr -cd 0-9; done) USR_DEV=$(for u in /sys/class/ubi/ubi*; do [ "$(cat $u/mtd_num)" = "8" ] && basename "$u" | tr -cd 0-9; done) # 卷不存在才创建 ubinfo /dev/ubi${OEM_DEV} -N oem >/dev/null 2>&1 || ubimkvol /dev/ubi${OEM_DEV} -N oem -m ubinfo /dev/ubi${USR_DEV} -N userdata >/dev/null 2>&1 || ubimkvol /dev/ubi${USR_DEV} -N userdata -m mkdir -p /oem /userdata mountpoint -q /oem || mount -t ubifs -o volname=oem /dev/ubi${OEM_DEV} /oem mountpoint -q /userdata || mount -t ubifs -o volname=userdata /dev/ubi${USR_DEV} /userdata ln -sf /userdata /data mount -t debugfs none /sys/kernel/debug mount -o ro,remount / # --- end: stable-ubi-dyn.sh ---
关键变化:
- 不再在
ubiattach
之前ubimkvol
ubimkvol
只有在卷不存在时才运行- 用
-o volname=userdata
挂载,避免硬编码ubiX:Y
失配ubiattach ... || true
,规避“已 attach”导致脚本中断- 用
mountpoint -q
防止重复挂载
你之前的 grep 命令有点打错了(/dev/null
那段被切到前面了)。请用下面两条重新搜:
shgrep -R --line-number "userdata.tar" /etc/init.d /etc/rc* /etc/* 2>/dev/null grep -R --line-number -E "tar .*userdata\.tar|cpio|restore|factory|first.?boot" /etc/init.d /etc/rc* /etc/* 2>/dev/null
如果找到类似 “首启初始化/恢复出厂/异常回滚” 的脚本(常见于 S*factory
、firstboot
、recovery
之类),建议改为只有检测到明确标志文件时才执行,或者你自己放一个“完成标志”,执行一次就跳过,避免每次启动都去覆盖 /userdata
。
/userdata/userdata
这个自指向软链:rm -f /userdata/userdata
grep userdata /proc/mounts
for u in /sys/class/ubi/ubi*; do echo "$u: mtd$(cat $u/mtd_num) name=$(cat $u/name)"; done
sha256sum -c /userdata/.fingerprint.sha256
(是否变化)如果你愿意,把你完整的 /etc/init.d
里那段初始化脚本贴出来(或让我直接按上面的方案 A/B 给你合并进现有脚本)。我会一次性改成“幂等、无竞态、可回滚”的版本,顺手也把恢复逻辑和 userdata.tar
的触发条件规范一下。
rk-multicodecs lango-loopback: control 2:0:0:Receive PATH3 Source Select:0 is already present
rockchip-i2s-tdm ff320000.i2s: ASoC: Failed to add Receive PATH3 Source Select: -16
rockchip-mdais pdm-i2s-dais: ff320000.i2s: Failed to add controls, should add 'sound-name-prefix' in DT
rk-multicodecs lango-loopback: Don't need to map headset detect gpio to irq
ubi0: attaching mtd6
ubi0: scanning is finished
ubi0: attached mtd6 (name "rootfs", size 25 MiB)
ubi0: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
ubi0: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
ubi0: good PEBs: 200, bad PEBs: 0, corrupted PEBs: 0
ubi0: user volume: 1, internal volumes: 1, max. volumes count: 128
ubi0: max/mean erase counter: 2/0, WL threshold: 4096, image sequence number: 797940005
ubi0: available PEBs: 0, total reserved PEBs: 200, PEBs reserved for bad PEB handling: 20
ubi0: background thread "ubi_bgt0d" started, PID 67
input: gpio-keys as /devices/platform/gpio-keys/input/input0
clk: Disabling unused clocks
WARNING: suspend_mode_handler: Not support call: 0x4
rockchip-suspend not set sleep-mode-config for mem-lite
rockchip-suspend not set wakeup-config for mem-lite
rockchip-suspend not set sleep-mode-config for mem-ultra
rockchip-suspend not set wakeup-config for mem-ultra
ALSA device list:
#0: rockchip,ad82120b-codec
#1: rockchip,rk3308-lango-loopback
#7: Loopback 1
UBIFS (ubi0:0): Mounting in unauthenticated mode
UBIFS (ubi0:0): recovery needed
UBIFS (ubi0:0): recovery deferred
UBIFS (ubi0:0): UBIFS: mounted UBI device 0, volume 0, name "rootfs", R/O mode
UBIFS (ubi0:0): LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes
UBIFS (ubi0:0): FS size: 20951040 bytes (19 MiB, 165 LEBs), journal size 9023488 bytes (8 MiB, 72 LEBs)
UBIFS (ubi0:0): reserved for root: 0 bytes (0 KiB)
UBIFS (ubi0:0): media format: w4/r0 (latest is w5/r0), UUID EDC1FDC6-0397-40D5-A164-F55408EA7227, small LPT model
VFS: Mounted root (ubifs filesystem) readonly on device 0:14.
devtmpfs: mounted
Freeing unused kernel memory: 1216K
Run /sbin/init as init process
Start mounting all internal partitions in /etc/fstab
Log saved to /var/log/mount-all.log
Note: Create /.skip_fsck to skip fsck
收到日志了,关键信息都齐了。你的这次失败不是 UBI/UBIFS 坏了,而是挂载方式写错+启动顺序冲突导致的:
mtd6/7/8
依次 attach 成 ubi0/1/2
(日志里已经有 ubi2: attaching mtd8
)。/etc/fstab
)去挂载,但 fstab 里把设备写成 /dev/ubi1
、/dev/ubi2
,这两个是UBI 设备节点,不是卷节点,UBIFS 不能直接 mount 它们 → error -22
。-o volname=
的写法在你这套 busybox/内核组合上不生效(多数情况下也不推荐)。应使用 ubiX:卷名
或者 /dev/ubiX_Y
。下面按“能马上改好”的顺序给出修复方案。
把 /oem
、/userdata
两行改成按卷名挂载(或用卷号设备)——二选一即可。
推荐:按卷名挂载
textubi1:oem /oem ubifs defaults 0 0 ubi2:userdata /userdata ubifs defaults 0 0
备选:按卷号设备挂载
text/dev/ubi1_0 /oem ubifs defaults 0 0 /dev/ubi2_0 /userdata ubifs defaults 0 0
现在你 fstab 里写的是
/dev/ubi1
、/dev/ubi2
(没有_0
),这会触发你看到的wrong fs type
/error -22
。
改完后,先手工验证一把(避免等重启才知道):
shumount /oem 2>/dev/null umount /userdata 2>/dev/null mount -t ubifs ubi1:oem /oem mount -t ubifs ubi2:userdata /userdata # 或者: # mount -t ubifs /dev/ubi1_0 /oem # mount -t ubifs /dev/ubi2_0 /userdata
能成功挂上,这一步就 OK 了。
你的系统已经有“自动 attach”(日志显示 ubi0/1/2: attaching
),再加上你自己的脚本,就会出现重复 attach/重复挂载的竞态。建议:
S03-ubi-attach
),只做 ubiattach
,不要在这里 mount
(把挂载工作交给 fstab)。示例脚本(适配你现在的分区号,不会创建卷,只 attach,且可重入):
sh#!/bin/sh # /etc/init.d/S03-ubi-attach mount -o rw,remount / # 固定 mtd7->ubi1, mtd8->ubi2(若已attach会打印“already attached”,可忽略) ubiattach -p /dev/mtd7 -d 1 2>/dev/null || true ubiattach -p /dev/mtd8 -d 2 2>/dev/null || true mount -o ro,remount / exit 0
卷的创建(
ubimkvol
)只在第一次量产/刷机后做一次即可,不要在每次开机做。你现在系统里已经有:
- ubi1 卷名
oem
- ubi2 卷名
userdata
不需要再 mkvol 了。
/userdata/userdata -> /userdata
这个自指向软链(容易让打包/扫描脚本绕圈):
sh[ -L /userdata/userdata ] && rm -f /userdata/userdata
grep
命令被截断了,重新查有没有“恢复/回滚”逻辑在解 userdata.tar
(这会让文件版本偶尔被换回旧的):
如果有,将其改成仅在检测到明确标志文件时才执行一次,平时不要覆盖shgrep -R --line-number "userdata.tar" /etc/init.d /etc/rc* /etc/* 2>/dev/null grep -R --line-number -E "tar .*userdata\.tar|factory|first.?boot|restore" /etc/init.d /etc/rc* /etc/* 2>/dev/null
/userdata
。/dev/ubi1
、/dev/ubi2
,导致第一次挂载直接失败(error -22
)。-o volname=
用法在你这套环境上不通用(很多系统更稳的方式是 ubiX:卷名
或 /dev/ubiX_Y
),所以我现在改成标准、最兼容的两种写法之一。sh# 1) 映射关系(确认 ubi 编号绑定到哪个 mtd) for u in /sys/class/ubi/ubi*; do echo "$u: mtd$(cat $u/mtd_num) name=$(cat $u/name)" done # 2) 当前挂载 grep -E 'oem|userdata' /proc/mounts # 3) 给关键文件做指纹,看启动后是否被谁篡改 sha256sum /userdata/libonnxruntime.so /userdata/denoise_simple_24k.onnx > /userdata/.fingerprint.sha256 # 重启后: sha256sum -c /userdata/.fingerprint.sha256
ASoC ... should add 'sound-name-prefix' in DT
是音频驱动/DT 的提示,和 UBI 无关。UBIFS (ubi0:0) recovery needed/deferred
是 rootfs 的正常恢复流程(异常关机后常见),与你的数据卷挂载问题无直接关系。如果你愿意,把你现在的 /etc/fstab
两行发我(或直接贴整个 fstab);我帮你改成最终版,并给出和现有启动顺序匹配的 S03-ubi-attach
(或者把 mount-all 里对应条目注释掉,改为在一个脚本里完成 attach+mount——两种都可以,我会按你系统的启动顺序给最稳的那版)。