3.10.4 文件系统一致性与损坏修复

文件系统一致性问题多由异常断电、内核崩溃、磁盘坏块、控制器超时或硬件重置引起,典型症状为只读挂载、目录项丢失、文件大小异常、日志回放失败。处理原则:先保护数据,再修复一致性,最后恢复服务,避免在未备份前进行破坏性操作。

原理草图(一致性检查链路):

文章图片

常见损坏类型与排查重点:
- 元数据损坏:超级块、inode、位图不一致
- 日志系统回放失败:ext4/jbd2,XFS日志损坏
- 目录项与inode不一致、孤儿文件
- 坏块导致读写错误
- 软RAID/LVM元数据不一致

基础工具安装(按需选择):

# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y e2fsprogs xfsprogs btrfs-progs smartmontools

# RHEL/CentOS
sudo yum install -y e2fsprogs xfsprogs btrfs-progs smartmontools

排查与证据收集(先确认硬件问题):

# 1) 内核日志与存储错误
dmesg -T | egrep -i "I/O error|EXT4|XFS|BTRFS|reset|blk_update_request"

# 2) 系统日志
grep -i "error\|fsck\|xfs_repair" /var/log/messages

# 3) SMART 检查(替换为真实盘符)
sudo smartctl -a /dev/sdb
# 关键字段:Reallocated_Sector_Ct, Current_Pending_Sector, Offline_Uncorrectable

修复前准备(确保一致性修复的安全性):

# 1) 找到设备与挂载点
lsblk -f

# 2) 进入单用户/维护模式或停止业务
systemctl stop myapp.service

# 3) 卸载或只读挂载(示例)
sudo umount /data
# 或临时只读挂载以保护数据
sudo mount -o ro /dev/sdb1 /mnt/readonly

# 4) 备份元数据/块级备份(示例:使用dd)
sudo dd if=/dev/sdb1 of=/backup/sdb1.img bs=4M status=progress

ext4 一致性检查与修复示例(命令解释与预期):

# 只读检查(不修复),预期显示错误数量
sudo e2fsck -n /dev/sdb1

# 自动修复(批处理,可能修改元数据)
sudo e2fsck -y /dev/sdb1

# 使用备用超级块恢复(先查看备用位置)
sudo mke2fs -n /dev/sdb1 | grep -i "superblock"
# 使用某个备用超级块进行恢复
sudo e2fsck -b 32768 /dev/sdb1

XFS 修复示例(需卸载后执行):

# 检查并修复,默认会重建元数据
sudo xfs_repair /dev/sdb1

# 若日志损坏,强制清理日志(可能丢失最近写入)
sudo xfs_repair -L /dev/sdb1

Btrfs 修复示例(谨慎使用 repair):

# 只读检查
sudo btrfs check --readonly /dev/sdb1

# 修复(谨慎使用)
sudo btrfs check --repair /dev/sdb1

坏块扫描与标记(ext 系列示例):

# 扫描坏块并写入文件
sudo badblocks -sv /dev/sdb1 > /tmp/badblocks.list

# 将坏块写入文件系统坏块表
sudo e2fsck -l /tmp/badblocks.list /dev/sdb1

# 结合坏块扫描与修复
sudo e2fsck -c -y /dev/sdb1

常见排错场景与处理:
- 现象:只读挂载
处理:检查 dmesg,确认错误来源;卸载后执行 fsck/xfs_repair,再重新挂载。
- 现象:日志回放失败
处理:ext4 使用 e2fsck 修复;XFS 使用 xfs_repair -L 重建日志。
- 现象:修复后仍报 I/O error
处理:检查 SMART,替换磁盘或下层 RAID/LVM 组件,避免反复修复。

修复后验证流程:

# 重新挂载
sudo mount /dev/sdb1 /data

# 检查文件系统状态
sudo tune2fs -l /dev/sdb1 | egrep "Filesystem state|Errors behavior"
# XFS 可用
sudo xfs_info /data

# 业务关键目录抽检
ls -al /data/app/data | head -n 20

练习:
1) 创建测试分区并模拟只读检查:对 /dev/loop0p1 执行 e2fsck -n,记录发现的错误类型。
2) 使用 xfs_repair -n(只读)对 XFS 分区进行检查,观察输出中“would be”提示。
3) 构造坏块列表(假设 100-105)写入文件系统坏块表,并验证 e2fsck 输出中的坏块统计。

通过建立定期离线校验窗口、启用日志文件系统、合理配置写屏障与缓存,并将关键数据置于具备冗余与快照能力的存储之上,可从源头降低一致性损坏风险。