Ubuntu 系统掉电导致分区损坏无法启动修复方案
嵌入式Ubuntu 系统掉电导致分区损坏无法启动修复方案
1. 问题描述
在嵌入式 Ubuntu 系统(RK3568、树莓派等)中,掉电可能导致 /userdata
(ext4)未正常关闭或 journal 损坏,进而下次启动进入 emergency mode:
[FAILED] Failed to start File System Check on /dev/mmcblk0p7.
[DEPEND] Dependency failed for /userdata.
[DEPEND] Dependency failed for Local File Systems.
You are in emergency mode. After logging in, type "journalctl -xb" to view logs.
2. 解决方案概览
1)修改 /etc/fstab
:容错不阻塞启动
2)自动 fsck:开机检测并修复 /userdata
2.1 fstab(防阻塞)
# User data tolerant to errors; don't block boot
/dev/mmcblk0p7 /userdata ext4 defaults,nofail,errors=continue 0 2
2.2 自动 fsck 脚本
/usr/local/bin/auto_fsck.sh
#!/bin/bash
LOG_FILE=/var/log/auto_fsck.log
DEV=/dev/mmcblk0p7
MNT=/userdataecho "[`date`] checking $DEV ..." >> $LOG_FILE
if ! mountpoint -q $MNT; thenecho "[`date`] not mounted, run fsck..." >> $LOG_FILEfsck -yf $DEV >> $LOG_FILE 2>&1mount $MNT >> $LOG_FILE 2>&1
elseecho "[`date`] already mounted, skip." >> $LOG_FILE
fiif [ ! -w $MNT ]; thenecho "[`date`] $MNT is read-only, remount rw..." >> $LOG_FILEmount -o remount,rw $MNT >> $LOG_FILE 2>&1
fi
启用 | Enable:
chmod +x /usr/local/bin/auto_fsck.sh
cat >/etc/systemd/system/auto-fsck.service <<'EOF'
[Unit]
Description=Auto fsck repair for userdata partition
DefaultDependencies=no
After=local-fs-pre.target
Before=multi-user.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/auto_fsck.sh
[Install]
WantedBy=multi-user.target
EOF
systemctl enable auto-fsck.service
3. 模拟掉电导致的文件系统损坏
注意:以下操作将破坏数据,务必在测试分区上进行。不能对
/
分区执行。
3.1 用 dd
人工写坏超级块附近(快速触发 fsck)
3.1.1. 卸载目标分区:
sudo umount /dev/mmcblk0p7
3.1.2. 写入随机垃圾到超级块附近:
sudo dd if=/dev/zero of=/dev/mmcblk0p7 bs=1k count=100
sync
3.1.3. 检查文件系统状态:
sudo fsck -fn /dev/mmcblk0p7
3.1.4. 尝试挂载以确认失败:
sudo mount /dev/mmcblk0p7 /userdata
3.1.5. 重启后验证自动修复:
sudo reboot
4. 总结
-
fstab 容错(
nofail, errors=continue
)让系统在数据分区损坏时仍能启动; -
auto-fsck 在启动阶段自动修复
/userdata
; -
模拟损坏用于验证自修机制在你设备上的实际效果。