最近在巡检一批存量服务器时,遇到一台机器重启后根文件系统挂载失败,直接掉进emergency mode。排查下来是xfs元数据区域出现了损坏,好在最终通过xfs_repair完整恢复了数据,没有走到格式化那一步。
这类问题在Linux运维里不算高频,但一旦碰上就是紧急事故。和ext4不同,xfs的元数据架构、修复工具链、故障表现都有自己的一套逻辑,用惯了fsck的人第一次面对xfs_repair,很容易在参数选择上踩坑。这篇文章就把xfs文件系统元数据故障从原理到实操完整过一遍,包括故障前的预防手段、故障中的排查步骤、xfs_repair的完整操作流程,以及我在多次恢复实战中积累的避坑经验,希望能给同样被xfs故障困住的运维同学一些参考。
1. 内容整体设计与思路拆解
1.1 为什么xfs元数据故障处理思路和ext4完全不同
先厘清一个基本认知:xfs和ext4在元数据管理上是两套完全不同的设计哲学。ext4的元数据分散在块组(block group)中,每个块组都有自己的超级块副本、inode表、块位图,某一个块组的元数据坏了,影响范围通常局部可控,fsck修复时也是按块组逐个扫描。
xfs则采用B+树索引结构,整个文件系统的元数据以AG(Allocation Group,分配组)为基本管理单位,每个AG内部有超级块、AGI(AG Inode信息)、AGF(AG空闲空间信息)、AGFL(AG空闲列表)等元数据结构,AG之间通过B+树互相关联。这种设计的优点是扩展性极强、并发性能好,缺点是元数据之间的耦合度比ext4更高,一旦根节点或关键B+树节点损坏,修复起来复杂度明显上升,一个坏的元数据块可能导致大片区域不可访问。
另一个核心区别是日志机制。xfs的日志(log)区域专门记录元数据变更,挂载时通过日志回放(log replay)保证元数据一致性。如果日志区域本身损坏,或者日志回放过程中遇到坏块,xfs会拒绝挂载,这与ext4的“可能可以忽略日志直接挂载”的表现非常不同。
所以处理xfs故障,核心思路不是“哪里坏了修哪里”,而是“先评估AG结构完整性,再修复B+树,最后清理不一致项”。这也是xfs_repair和fsck在修复策略上的本质差异。
1.2 故障恢复的整体流程设计
我的恢复流程一般按“五步走”推进,顺序非常重要,跳步会带来二次损坏风险:
- 故障确认与现场保护:立即将故障磁盘挂载方式改为只读或直接卸载,禁止任何写操作,避免日志和元数据被进一步覆盖。
- 元数据损坏范围评估:通过dmesg、挂载报错信息、xfs_repair -n(dry-run模式)判断损坏是日志区域、AG头结构、还是inode B+树。
- 日志清除或回放处理:根据损坏类型决定是让日志回放还是使用 -L 参数清空日志。
- 深度修复:执行带参数的 xfs_repair 主修复流程,可能需要多轮运行。
- 挂载验证与数据完整性抽检:修复后先以只读方式挂载,检查关键目录和文件,确认无误后再正常读写挂载。
这套流程的核心原则是:每一步操作都建立在上一步结论的基础上,而不是拿到故障机就盲目执行 xfs_repair。我在实际处理中见过不少二次伤害案例,都是因为上来就直接 -L 清日志,结果把原本可回放的日志直接废弃,丢失了最后一次写入的元数据变更,导致文件丢失范围扩大。
1.3 工具选型:xfs_repair、xfs_db、xfs_metadump如何配合使用
xfs故障恢复不是xfs_repair一把梭,实际工作中需要多个工具配合。我的常用组合是:
| 工具 | 主要用途 | 使用时机 |
|---|---|---|
| dmesg / journalctl | 查看内核报错,定位故障类型 | 故障发生第一时间 |
| mount | 测试挂载,观察具体报错 | 每次修复动作后 |
| xfs_repair -n | 只读扫描,评估损坏范围 | 任何修复动作之前 |
| xfs_repair | 实际修复元数据 | 评估完成后 |
| xfs_db | 底层元数据查询和修改 | 需要精确查看inode、AGF、AGI等结构时 |
| xfs_metadump | 复制元数据镜像 | 需要备份现场或离线分析时 |
| xfs_logprint | 查看日志区域内容 | 判断日志是否可回放时 |
这里特别提一下xfs_metadump,很多人忽略这个工具。它可以把文件系统的元数据导出成一个镜像文件,且默认会模糊化文件名数据,方便在不影响生产环境的前提下做离线分析。如果故障盘可以卸载,我强烈建议先跑一次xfs_metadump留存现场,再开始修复操作,这样万一修复过程出现意外,还能回到原始状态重新分析。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心细节解析与实操要点
2.1 xfs关键元数据结构与故障表现对照
理解了xfs的元数据结构,故障排查才有方向感。我用最通俗的方式来解释这些结构,不堆砌内核源码术语,但要把它们之间的关系讲明白。
分配组(AG):xfs把整个文件系统划分为若干等大的分配组,类似于把一个大仓库分成多个隔间。每个AG内部自己管理自己的inode和空闲空间,这样多个CPU可以同时操作不同AG实现并行IO。查看AG信息可以用 xfs_info 命令,例如 /dev/sda1 的AG数量、AG大小都能看得很清楚。
AGI(AG Inode信息):每个AG的inode分配信息,包含该AG内空闲inode数量、空闲inode的B+树根指针等。AGI损坏通常表现为:某个目录下部分文件消失、创建文件时报“No space left on device”但磁盘实际还有大量空间、ls目录时卡死等。
AGF(AG空闲空间信息):记录该AG内空闲块的数量和B+树根指针。AGF损坏的表现是:写文件时报磁盘满、df看到的空间和实际可用空间严重不符、删除文件后空间不释放。
AGFL(AG空闲列表):AG内部的块分配辅助结构,与AGF配合使用。AGFL问题通常导致挂载失败,报错信息会直接提及AGFL。
inode B+树:xfs的inode查找依赖B+树索引,根在AGI中。B+树某个节点损坏,对应子树下的inode就会“消失”。我遇到过一台数据库备份服务器,某个子目录下600多个文件全部无目录项,但xfs_db直接按inode号查,数据块都还在,就是B+树路径断了导致目录项丢失。
日志(log)区域:记录最近的元数据变更,挂载时回放。日志损坏的典型报错是“Mounting filesystem ... failed: Structure needs cleaning”,或者内核日志里出现libxfs相关告警。判断日志是否可回放可以用 xfs_logprint 查看,如果报错无法解析日志结构,多半需要清日志。
故障表现和元数据结构对照起来看,能快速缩小排查范围:
| 故障现象 | 可能损坏的元数据 |
|---|---|
| 挂载时报Structure needs cleaning | 日志区域异常或AG头结构损坏 |
| 挂载时卡死,IO错误 | AGF/AGI B+树节点损坏 |
| 文件消失但磁盘空间仍被占用 | inode B+树目录项丢失 |
| 磁盘显示满但实际有大量空余 | AGF空闲空间B+树不一致 |
| 写入时报错且无法新建文件 | AGI inode分配信息异常 |
| 系统自动将文件系统切换为只读 | 内核检测到元数据写入错误 |
2.2 故障前的检测与备份手段
恢复做得再多,也不如故障前做好预防。xfs文件系统最有效的保护手段是定期备份元数据信息和完整数据。xfs自带一套比较冷门但实用的工具组合:xfsdump和xfsrestore,专门为xfs设计,支持增量备份和恢复,比直接tar整个目录在元数据一致性上更可靠。
我建议的预防策略分三层:
- 定期执行 xfs_repair -n 做只读巡检。对在线生产环境建议放在业务低峰期执行,虽然不会修改任何数据,但长时间扫描会消耗IO,一台大容量xfs跑一轮只读扫描可能需要几十分钟甚至数小时。
- 使用 xfs_metadump 定期导出一份元数据镜像,保留到独立存储上。这个文件通常比完整数据小得多,但关键时刻能救命,因为很多“文件找不到了”的故障,元数据镜像里还保留着原始inode结构。
- 对核心业务数据,用xfsdump做完整备份或增量备份,备份文件可以存放在另一块磁盘或远程存储上,xfsdump的恢复粒度比格式化后全量找回细得多,能够按目录、按文件精确恢复。
检测方面,xfs文件系统挂载时会自动做日志回放,这本身就是一次元数据一致性检查。如果你注意到以下迹象,就该考虑主动检查了:系统日志中反复出现“I/O error”但磁盘SMART正常、某个目录的文件间歇性消失、曾经在过去48小时内发生过非正常断电或强制重启。这些潜在风险不处理,下一次可能就直接挂载失败了。
2.3 理解日志回放和 -L 参数的风险边界
xfs_repair的 -L 参数是最容易误用的选项。它的含义是“清空日志”,在英文手册里写作“Force log zeroing”,适用于日志区域损坏、无法正常回放的情况。
为什么这个操作有风险?因为日志里记录的是最近一次挂载以来尚未完全落盘的元数据操作。正常情况下挂载时内核会先回放日志,把文件系统恢复到一致状态。如果直接-L清零,等于告诉系统“别管日志了”,那些只在日志里存在、尚未写入实际元数据位置的操作就永久丢失了。典型受影响场景是:断电前刚创建了一批文件,目录项更新还在日志里,-L之后这批文件可能不会出现在目录下,虽然数据块可能还在磁盘上,但找回成本极高。
所以我的经验准则是:
- 先尝试正常挂载,如果日志回放能成功,不需要 -L。
- 如果挂载失败报日志损坏,先跑 xfs_logprint 看能不能读出日志内容。能读出且看起来结构完整,优先考虑让xfs_repair自动处理。
- 只有当 xfs_repair -n 明确报log相关错误,且不使用 -L 无法继续时,才考虑加 -L。
- 使用-L之后,修复完必须从头做一遍完整的数据校验,因为日志丢失的影响范围不一定是局部的。
3. 实操过程与核心环节实现
3.1 环境准备:模拟故障与构建实验环境
很多人不敢在生产环境尝试xfs修复,这可以理解。但xfs修复能力必须通过大量刻意练习才能熟练,我建议在一台独立的测试机上搭建实验环境。
创建实验环境很简单,可以用一块额外磁盘或直接创建一个loop设备文件来模拟。Loop设备的好处是完全隔离,想怎么折腾都不会影响其他数据。
bash复制# 创建一个2GB的镜像文件
dd if=/dev/zero of=/root/xfs_test.img bs=1M count=2048
# 关联为loop设备
losetup /dev/loop0 /root/xfs_test.img
# 格式化为xfs文件系统
mkfs.xfs -f /dev/loop0
# 挂载并制造一些测试文件
mkdir -p /mnt/xfs_test
mount /dev/loop0 /mnt/xfs_test
mkdir -p /mnt/xfs_test/data
for i in $(seq 1 100); do
echo "test file $i content" > /mnt/xfs_test/data/file_$i.txt
done
sync
umount /mnt/xfs_test
挂载路径和文件都准备好后,就是关键的故障模拟环节。最简单可控的方式是直接对元数据区域做破坏性写入。比如用dd覆盖掉AG头或日志区域的部分块:
bash复制# 查看xfs格式化的AG信息
xfs_info /dev/loop0
# 覆盖AG0的头部区域(从第2个扇区开始,写8个扇区)
dd if=/dev/urandom of=/dev/loop0 bs=512 count=8 seek=1 conv=notrunc
做了破坏操作之后,尝试挂载观察故障表现,再用xfs_repair -n扫描,观察报错信息,然后按完整流程修复。这种循环练习做上三五遍,对xfs的故障模式会建立起非常直观的感知。
3.2 从故障到根因:完整诊断链路
假设现在你已经接手一台故障机器,挂载报错看不清方向,按我下面的链路一步步走,基本能找到根因。
第一步,查看系统日志。xfs的故障信息几乎都会出现在这里:
bash复制dmesg | tail -100 | grep -i xfs
journalctl -k --since "1 hour ago" | grep -i xfs
日志里可以看到类似 XFS (sdb1): Corruption of in-memory data detected、XFS (sdb1): metadata I/O error、XFS (sdb1): xfs_imap_to_bp: xfs_imap lookup returned error 一类的信息。这些报错看似专业,但对应到具体元数据位置还需要结合后续工具确认。
第二步,用只读方式测试挂载:
bash复制mount -o ro /dev/sdb1 /mnt/rescue
注意用只读挂载,故障设备上加写操作是大忌。如果只读也挂不上,转入下一步。
第三步,执行xfs_repair -n 评估。这是整个诊断中最关键的一步,它只扫描不写入,输出会指出具体的元数据问题位置和类型:
bash复制xfs_repair -n /dev/sdb1
命令会输出多个阶段的状态:
text复制Phase 1 - find and verify superblock...
Phase 2 - using internal log
Phase 3 - check and repair connected namespace
Phase 4 - check for duplicate blocks
Phase 5 - rebuild AG headers and directory trees
重点观察每个Phase的报错。Phase 2的报错通常指向日志问题,Phase 3和Phase 4的报错多与inode、目录项有关,Phase 5的AG头重建则会在AG结构损坏时触发。
第四步,如果需要进一步精确定位,用xfs_db直接查询元数据结构:
bash复制# 查看超级块信息
xfs_db -r /dev/sdb1
xfs_db> sb 0
xfs_db> p
bash复制# 查看AGF信息
xfs_db -r /dev/sdb1
xfs_db> agf 0
xfs_db> p
xfs_db的-r参数表示只读模式,不会修改任何内容,放心用。
整个诊断链路走完,基本可以确定:损坏发生在日志区域还是AG头,影响范围有多大,需要哪种修复策略。这个时候再动手修复,就是有的放矢。
3.3 xfs_repair标准修复流程与参数选择
诊断明确后,进入正式修复。以下是我修复的完整操作序列,每一步都会说明目的和注意事项。
第一步:再次确认文件系统未挂载
bash复制# 检查挂载状态
mount | grep sdb1
# 如果挂载了就卸载
umount /mnt/data
如果卸载失败,用lsof或fuser找到占用进程,确认没有进程使用后再卸载:
bash复制lsof /mnt/data
fuser -km /mnt/data
umount /mnt/data
第二步:执行xfs_repair基础修复
bash复制xfs_repair -v /dev/sdb1
-v是verbose模式,会输出每个阶段的具体进度,方便判断卡在哪个环节。基础修复能解决大部分AG头、B+树校验和目录树连接问题。
第三步:检查修复结果
修复完成后不要立即挂载,再跑一次只读校验:
bash复制xfs_repair -n /dev/sdb1
如果这次没有报错,说明元数据基本一致了。如果还有报错,根据报错类型决定是否加参数重跑。
第四步:处理日志问题(仅在日志损坏场景)
如果只读校验仍然报日志相关错误,使用:
bash复制xfs_repair -v -L /dev/sdb1
-L 会强制清零日志,风险我在前面已经说明,使用后务必执行完整数据校验。
第五步:挂载验证
先只读挂载:
bash复制mount -o ro /dev/sdb1 /mnt/data
ls /mnt/data
确认目录结构、关键文件可见后可考虑读写挂载:
bash复制mount -o remount,rw /mnt/data
第六步:重点目录数据完整性抽检
数据文件按类型抽查,比如数据库目录下的表文件、用户目录下的文档,确认打开无异常、内容完整。
注意一个细节:xfs_repair的默认行为会保存修复过程中发现的孤立文件(lost+found目录)。这些文件在修复后出现在 /mnt/data/lost+found 下,不要急着删除,先把里面内容和时间戳仔细看一遍,很多“丢失”的数据其实都在这。
3.4 多轮修复的必要性与现场保护
xfs_repair一次跑完报"done"不意味着万事大吉。我遇到的最棘手的一次案例,第一轮修复后挂载成功,但目录访问到某个子目录时IO错误,说明第一轮修复并未覆盖所有损坏区域,存在距离根节点较远的次级B+树节点损坏。
所以我的习惯是:
- 修复完成挂载之前,至少跑两轮 xfs_repair -n,确认两轮输出一致且无新增报错。
- 如果连续两轮 -n 报错信息完全一致,说明修复没有生效,需要检查是不是参数用错或存在硬件层面问题(磁盘坏道导致的元数据区域反复损坏)。
- 每一轮修复之间保留现场,xfs_metadump导出的镜像能帮助对比前后差异。
现场保护在修复中特别容易被忽略。用xfs_metadump保存元数据镜像的操作其实很简单:
bash复制# 卸载后导出元数据镜像
xfs_metadump /dev/sdb1 /root/sdb1_metadump.img
# 不模糊文件名(保留元数据中的文件名字符串)
xfs_metadump -o /dev/sdb1 /root/sdb1_metadump_full.img
导出的镜像可以后续随时分析,分析方式是通过 loop 设备挂载镜像:
bash复制losetup /dev/loop1 /root/sdb1_metadump.img
xfs_repair -n /dev/loop1
万一第一次修复操作不当导致二次损坏,还能回到初始状态重新来。这个习惯帮我挽回过好几次局面,特别是面对重要生产库的时候价值极大。
4. 常见问题与排查技巧实录
4.1 挂载失败报错的快速对照表
实际工作中,xfs故障最让人头大的是各种各样的报错信息,看着像天书,其实每个常见报错背后都有相对固定的根因。我整理了一张高频报错对照表,对应排查路径和常用解决步骤,供碰到问题时直接查阅:
| 错误提示 | 可能原因 | 处理方向 |
|---|---|---|
| mount: /dev/sdb1: can't read superblock | 超级块损坏或设备不可读 | 检查磁盘健康状态,xfs_db读取备用超级块,确认是否为硬件故障 |
| Mounting filesystem failed: Structure needs cleaning | 元数据不一致,日志回放失败 | 执行xfs_repair -n评估,按Phase定位再修复 |
| corruption detected in inode X | inode节点损坏 | 用xfs_db检查该inode状态,交由xfs_repair处理 |
| Metadata I/O error | 磁盘读写失败 | 先排查硬件,SMART检测坏道,修复后重试 |
| failed to read AGFL | AG空闲列表损坏 | xfs_repair会重建AGFL,属较易修复类型 |
| I/O error occurred during replay of log | 日志回放失败 | 判断是日志损坏后考虑-L,但需确认数据损失范围 |
这个表格不是万能的,但能帮你快速定位大致方向,不至于对着报错一头雾水。
4.2 修复完成但数据仍不可见的典型场景
xfs_repair跑完,文件系统也能挂载,但某些文件或目录就是不在原来的位置。这种情况非常常见,不用慌,按下面的思路排查。
首先检查lost+found目录。xfs_repair在Phase 3处理目录树连接时,会把无法恢复原目录结构的孤立inode挂接到lost+found下。这些文件的命名方式是乱序编号,看不出原始路径,但文件内容和时间戳还在,可以通过内容特征判断归属。
其次用xfs_db查询具体inode。如果你知道文件原来的inode号,直接查:
bash复制xfs_db -r /dev/sdb1
xfs_db> inode 328
xfs_db> p
如果inode本身还在,但目录项丢失,可以查看core.nlink和是否存在extent数据块元信息,再决定是否手工重建目录项。
如果inode已经损坏到无法恢复,但数据块还在,元数据层面能做的就很有限了,只能通过按文件内容特征搜索数据块的方式尝试找回。这类场景下,xfs_metadump预留的元数据镜像可能是最后的救命稻草——镜像里保存的原始inode指向可能还能帮助你定位数据块位置。
4.3 两个非xfs_repair手段的补充用法
xfs_repair是主力工具,但不是唯一工具。两个补充手段在某些场景下价值极高。
手段一:利用备份超级块手动恢复超级块
xfs的超级块在每个AG中有副本,主超级块损坏时可以从备份恢复。xfs_db支持直接操作:
bash复制xfs_db -x /dev/sdb1
xfs_db> sb 0
xfs_db> addr sb 1
xfs_db> write
注意这需要-x专家模式,普通模式下无法写。操作前务必先用xfs_metadump留底。实际生产中主超级块损坏的概率低于AG其他元数据损坏,但一旦发生就必须用这个方法。
手段二:使用xfs_logprint解析日志内容
日志损坏不是非黑即白的情况,有时部分日志块仍可解析。执行 xfs_logprint -n /dev/sdb1 能列出日志中的操作记录,判断最后一次完成的事务操作是什么,从而估算丢失了哪些元数据变更。这对决定是否需要 -L、以及如何向业务方汇报数据丢失范围,有非常明确的辅助价值。
bash复制xfs_logprint -n /dev/sdb1 | head -200
输出里会出现 OP_HEADER、OP_INODE、OP_AGF等操作类型。重点看最后一个有效事务的提交时间和类型,就能大概估算断电前完成到哪一步。
4.4 这些坑我踩过,希望你避开
我把自己在xfs恢复实战中踩过最深的几个坑列出来,每一条都是用代价换来的经验。
坑一:在挂载状态下直接跑xfs_repair。 xfs_repair要求文件系统必须完全卸载,如果有进程还在读写,不仅修复无效,还可能造成二次损坏。检查方法用lsof或fuser确认,别只凭“好像没在用”就下手。
坑二:Geom=="sdb1"已损坏还反复尝试挂载。 损坏的元数据区域在每次挂载尝试时都可能被重新写入错误信息,重复挂载操作不仅无益,还可能让原本只读的坏区域产生写IO。正确的做法是第一次挂载失败后立即停止操作,转入诊断流程。
坑三:忽略硬件层面的坏道问题。 xfs元数据故障和磁盘坏道经常同时出现。如果修复完成后再次反复损坏同一位置的元数据,大概率是磁盘物理坏道,需要先做SMART检测或使用badblocks扫描,否则xfs修复得再熟练也只是治标不治本。
坑四:把 -L 当万能选项。 这一点前面反复强调过,但每次遇到真实故障总会有人图省事直接上-L。我的建议是,非日志损坏场景一律不加-L,日志损坏场景也要先确认日志回放确实不可行,再权衡数据损失来决定。
5. xfs故障恢复的日常运维建议
5.1 定期演练:没有演练过的恢复手段等于不存在
这是我在多次真实故障后最深的体会。很多运维团队对xfs恢复的理解是“看过文档”,但没亲手操作过。到了真正故障现场,面对各种不可预期的报错,文档里的步骤根本套不上。
我建议每季度至少做一次xfs故障恢复演练。准备的场景可以覆盖三类:日志区域损坏、AGF/AGI损坏、inode B+树部分失效。每次演练记录实际操作的命令和输出,整理成团队内部手册,再把常见报错和解决步骤沉淀到知识库。真到生产事故来临时,这些积累能大幅缩短恢复时间。
5.2 监控与预警:提前发现元数据异常信号
xfs文件系统元数据故障不会完全无预兆,很多异常信号在故障前几天甚至几周就已经出现在系统日志中。推荐把以下监控项纳入日常巡检:
- dmesg中xfs相关的错误计数,任何一条
XFS (device): metadata I/O error都值得重视。 - 文件系统挂载时间变化,如果挂载时日志回放时间显著变长,说明日志区域可能正在积累异常。
- 定期执行 xfs_repair -n,将扫描耗时和报错次数记录到趋势图表,异常上升时及时处理。
- 监控smartd的磁盘健康状态,尤其关注Pending Sector和Reallocated Sector计数变化。
这些监控项配置起来并不复杂,一条脚本配合系统的日志采集基本就能覆盖,但价值非常大,能把突发故障变成可控处理。
5.3 一个可落地的xfs健康巡检脚本框架
最后分享一个简单的巡检脚本框架,可以加到cron里定期执行。它的逻辑是:检查挂载状态,以只读方式执行修复扫描,把输出保存到日志文件,有异常时输出退出码。
bash复制#!/bin/bash
# xfs_health_check.sh
DEVICE="/dev/sdb1"
LOGFILE="/var/log/xfs_health.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
# 检查是否已挂载
if mount | grep -q "$DEVICE"; then
echo "[$DATE] $DEVICE is mounted, cancel check" >> "$LOGFILE"
exit 0
fi
# 执行只读扫描
echo "[$DATE] Starting xfs_repair -n check on $DEVICE" >> "$LOGFILE"
xfs_repair -n "$DEVICE" >> "$LOGFILE" 2>&1
exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "[$DATE] xfs_repair -n completed successfully" >> "$LOGFILE"
else
echo "[$DATE] xfs_repair -n failed with exit code $exit_code" >> "$LOGFILE"
fi
exit $exit_code
脚本只做只读扫描,不执行任何修复操作,所以即使跑出异常也不会有数据改动风险,可以在cron里放心加入。执行频率建议核心数据盘每天一次,普通数据盘每周一次,扫描耗时会随文件系统大小增长,需要根据实际情况调整。
考虑到xfs文件系统往往承载大量数据,我个人的建议是对于承载核心业务数据的xfs分区,最好搭建一个脚本超时告警机制,一旦扫描耗时长于历史基线两倍以上,自动通知运维团队介入检查,这往往比等待故障发生后再去恢复要有价值得多。
文件系统承载的是整个业务的底层,经历过一次xfs元数据事故之后,我对每个生产节点的xfs都保持着定期巡检的习惯。xfs的元数据设计复杂,真出问题时要稳得住,按流程走,先诊断再修复,每步前置条件确认好,绝大多数故障都能在数据不丢失的情况下恢复。希望这份实践教程里的经验和坑,能帮你在面对xfs元数据故障时少走弯路。
