CentOS服务器断电后自检不过,xfs_repair拯救数据记录
机房里啪一声黑,UPS也没撑住,整台CentOS直接硬掉。再上电,系统卡在启动自检,提示“XFS (dm-0): log mount failed”,紧接着进入紧急模式,业务全停。别急着重装,数据还在盘里,只是文件系统头被摔瘸了,xfs_repair能拉一把。

先别慌,确认盘还能认
重启进BIOS,看阵列卡有没有掉盘。若RAID状态显示“Optimal”,硬盘灯常绿,说明物理层没事,问题落在文件系统层。记下出错分区,比如/dev/mapper/centos-root,后面所有操作都围着它转。
挂LiveCD,把盘设为只读
找同版本CentOS镜像,刻U盘启到救援模式。启动后别手贱直接挂载,先lsblk确认逻辑卷,再vgchange -ay激活卷组。此时切记:受损XFS只能以只读检测,任何写入都会让日志回放失败更严重。
第一步:xfs_repair -n 先探伤
执行

xfs_repair -n /dev/mapper/centos-root
参数-n表示“dry run”,只检查不写盘。屏幕刷刷列出“would fix inode 128”之类,说明还有救;若直接报“I/O error”,盘可能真坏,得先做dd镜像再折腾。
第二步:清日志,强行归零
探伤通过,再跑
xfs_repair -L /dev/mapper/centos-root
-L会把日志段清零,等同于告诉文件系统“之前的事全翻篇”。这一步会丢最近几分钟写入,但能把盘挂起来。执行完若看到“done”无error,基本成功一半。

第三步:正式修复,生成新根
去掉-L,直接
xfs_repair /dev/mapper/centos-root
过程分三段:扫描inode、重建btree、验证配额。十分钟级别,SSD会快些。若中途出现“rebuilding directory”,别Ctrl-C,那是把散落的inode重新挂回目录树。
重启验证,业务拉起来
修复完退出Live环境,拔掉U盘,让服务器从硬盘启。系统应正常进入图形或multi-user.target。立刻journalctl -xb | grep -i xfs,确认没有“error”字样。再跑一遍xfsdb -r /dev/mapper/centos-root -c 'sb 0' -c 'p'看超级块状态,若“sbmagic”=0x58465342,说明XFS头已复活。
事后补锅:写个断电保护
1. 给UPS配snmp,断电五分钟后自动发脚本关机
2. 在/etc/fstab里对关键分区加
/dev/mapper/centos-root / xfs defaults,logbufs=8,logbsize=256k 0 0
增大日志缓存,减少掉电损坏概率
3. 每周跑
xfs_admin -u /dev/mapper/centos-root
生成UUID快照,配合rsync做异地备份,下次再摔也不心跳骤停
常见作死现场,别踩
· 直接fsck.ext4往XFS上怼,结果超级块直接被盖
· 看到“repair”就反复跑,日志被反复清零,文件碎片化成渣
· 没做dd镜像就在原盘练手,一旦失手连数据恢复公司都叹气
一句话流程图
LiveCD → lsblk → -n检查 → -L清日志 → 无参数修复 → 重启 → 验日志 → 上监控。七步走完,系统复活,数据保住,老板省下一笔重装+恢复的费用,你也省得通宵写检讨。
这次断电惊魂,再次证明:在Linux世界,手边常备一张CentOS镜像,比任何心灵鸡汤都管用。xfs_repair不是万能,却是XFS文件系统掉链子时最靠谱的那根拐杖。记住流程,下回停电,你也能把自检不过的机器原地救活。
