Linux 服务器 ext4/XFS 文件系统数据恢复:inode、superblock、日志、AG 结构,误删、格式化、文件系统损坏的恢复原理与方法。
ext4 是 Linux 最主流的文件系统。每个文件对应一个 inode(存元数据:大小、时间戳、数据块位置),目录项记录「文件名 → inode」的映射,另有 journal 日志记录元数据变更。误删文件后,inode 和数据块只是被标记空闲,底层数据仍在,直到被覆盖。
XFS 面向大容量高性能场景(数据库、日志服务器),把磁盘分成多个 AG(分配组),用 B+ 树管理 inode 和空闲空间。XFS 的元数据分散在各 AG,损坏后可能只影响局部,比集中式文件系统更「扛坏」,但一旦 superblock 或 AG 头损坏,恢复难度也更高。
ext4 误删:先查 journal 日志回放元数据,再扫描残留 inode 定位文件。XFS 误删:XFS 的删除会清空 inode 的块映射(比 ext4 更彻底),恢复主要靠数据区特征扫描(按文件签名找 JPEG/PDF/数据库页)。格式化:快速格式化只重建元数据,数据区不动,可恢复。
1)superblock 损坏:ext4 有备份 superblock(块组 1、3、5…),可用备份恢复;XFS 的 superblock 损坏需重建。2)journal 损坏:可丢弃日志强制挂载或修复。3)RAID 之上的文件系统:先保证阵列重组正确,再做文件系统层修复,顺序不能反。
Q: Linux 服务器 ext4 误删能恢复吗?
A: 能。ext4 删除后 inode 和数据块只是标记空闲,journal 日志可回放元数据,扫描残留 inode 可恢复文件。未覆盖的情况下成功率很高。
Q: XFS 格式化后能恢复吗?
A: 能但难度高于 ext4。快速格式化只重建元数据,数据区不动,可通过数据区特征扫描恢复;XFS 删除会更彻底清空 inode 映射,恢复主要靠文件签名扫描。
Q: Linux 文件系统损坏(superblock 错误)能修吗?
A: 能。ext4 有备份 superblock,可用 e2fsck 指定备份块恢复;XFS 用 xfs_repair 修复。修复前务必先做只读镜像,避免修复操作二次破坏。
Q: 服务器文件系统恢复多少钱?
A: 逻辑故障(误删/格式化/superblock)800 元起,涉及 RAID 阵列重组或物理坏道的按检测报价。免费检测。
ext4 和 XFS 的元数据布局完全不同,恢复策略也不同:ext4 的超级块有备份,inode 表位置固定; XFS 没有 inode 表,inode 跟着分配组走,靠 AG 头和 B 树索引定位。下面是可以直接核对的常量。
| 项目 | 取值 / 位置 | 说明 |
|---|---|---|
| ext4 超级块位置 | 偏移 1024 字节,魔数 0xEF53 在超级块内 +0x38 | 文件开头 1024 字节是引导块,不是超级块 |
| ext4 备份超级块 | 块组 1、3、5、7… 的组内备份 | 主超级块坏了先找备份,不要直接 fsck |
| ext4 inode 大小 | 通常 256 字节(sb 中 s_inode_size) | 决定 inode 表步进 |
| ext4 extent 魔数 | 0xF30A,位于 inode 的 i_block 区 | extent 树完好时不用扫全盘 |
| XFS 超级块 | 偏移 0,魔数 `XFSB` | 每个分配组(AG)开头都有自己的 AG 头 |
| XFS inode 魔数 | `IN`(0x494E) | inode 分散在各 AG,不能按固定步进扫 |
| XFS 日志 | 内部日志是文件系统内的保留区,外部日志单独设备 | 先回放日志还是先镜像,取决于日志是否完整 |
# ext4:读超级块与备份位置(-h 只打印头部信息)
dumpe2fs -h /cases/ext4.img
dumpe2fs /cases/ext4.img | grep -i "Backup superblock"
# ext4:只读方式列目录、导出 inode
debugfs -R "ls -l /" /cases/ext4.img
debugfs -R "stat <2>" /cases/ext4.img # 根目录 inode
# XFS:只读打开,不写回任何东西
xfs_db -r -c "sb 0" -c "p magicnum" -c "p blocksize" /cases/xfs.img
xfs_db -r -c "agi 0" -c "p" /cases/xfs.img # AG 头里的 inode 计数
ext4 的恢复窗口比 XFS 宽:inode 表结构固定,即使目录项被清空,仍能按 inode 号把 extent 树还原成文件。XFS 更依赖日志完整度——日志被覆盖后,即使数据块还在, 没有 inode 索引也很难拼回目录结构,通常只能按 B 树残留做块级回收。
2026-10-23 实测:200 个「写一半掉电」崩溃点。日志式不一致率 0.0%,就地更新 100.0% —— 断言成立。第一版把整份文件随机截断,等于测数据丢失不是测崩溃一致性,两种引擎都是 100% 不一致,已改正。
| 指标 | 实测值 |
|---|---|
| log_inconsistent | 0.0 |
| inplace_inconsistent | 1.0 |
判定:结论成立。实验脚本:~/lab/crash-consistent-cache/experiment.py,可复跑复现。