报错是这么冒出来的。腾讯云一块 2T 数据盘掉电后挂载失败,dmesg 里是 EXT4-fs error 和 bad superblock,分区表还在,fsck 提示找不到有效的文件系统超级块。
中间走过弯路,把「分区表被改动过,内核读到的偏移与文件系统实际起始位置不一致」当成主因,改完现象没变。
真正麻烦的地方在于,几个原因的现象几乎一样。主超级块所在块被写坏,内核无法读出文件系统参数。另一种情况是备份超级块分散在各块组开头,位置取决于创建时的块大小与特性。
另外,磁盘存在坏道,恰好落在主超级块所在扇区。
第一件事是确认分区边界没变
fdisk -l /dev/vdb && blockdev --getsize64 /dev/vdb1
再往下按块大小 4096 试备份超级块位置
e2fsck -b 32768 -B 4096 /dev/vdb1
接着列出可用的备份超级块再挑一个
dumpe2fs /dev/vdb1 2>/dev/null | grep -i superblock || mke2fs -n /dev/vdb1
修复完成后挂载并核对数据
mount -o ro /dev/vdb1 /mnt/check && ls /mnt/check | head
恢复的判定其实很直接。e2fsck 提示使用备份超级块并正常走完检查,mount 只读挂载成功,关键目录的文件数量与备份记录一致。
容易忽略的是,用备份超级块修完必须立刻重新备份数据并重建文件系统,主块坏掉说明盘已经不可信;mke2fs -n 只打印不写入,别漏了 -n。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
