XFS Metadata corruption detected, xfs_repair not able to repair it

环境

  • CentOS 6,7,8
  • LVM
  • 多个系统之间共享存储

问题

我们正在运行 2 个系统,它们都有安装了 RHEL 的本地磁盘,并且可以访问共享 LUN(块设备)。在该 LUN 上,我们有一个分区表、LVM 物理卷 (PV)、一个卷组(不是集群 (CLVM),而是一个普通卷组)和多个卷。这些卷使用 XFS。对于这些 XFS 文件系统之一,出现以下内容:

hostname <kern.info> kernel:XFS (dm-5): Ending clean mount
hostname <kern.alert> kernel:XFS (dm-2): Metadata corruption detected at xfs_agf_read_verify+0x70/0x120 [xfs], block 0x7d00001
hostname <kern.alert> kernel:XFS (dm-2): Unmount and run xfs_repair
hostname <kern.alert> kernel:XFS (dm-2): First 64 bytes of corrupted metadata buffer:
hostname <kern.alert> kernel:ffff881a4d5fa200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
hostname <kern.alert> kernel:ffff881a4d5fa210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
hostname <kern.alert> kernel:ffff881a4d5fa220: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
hostname <kern.alert> kernel:ffff881a4d5fa230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
hostname <kern.alert> kernel:XFS (dm-2): metadata I/O error: block 0x7d00001 ("xfs_trans_read_buf_map") error 117 numblks 1 
hostname <kern.notice> kernel:XFS (dm-2): xfs_do_force_shutdown(0x8) called from line 135 of file fs/xfs/xfs_bmap_util.c.  Return address = 0xffffffffa017a928
hostname <kern.alert> kernel:XFS (dm-2): Corruption of in-memory data detected.  Shutting down filesystem
hostname <kern.alert> kernel:XFS (dm-2): Please umount the filesystem and rectify the problem(s)
hostname <kern.warning> kernel:nr_pdflush_threads exported in /proc is scheduled for removal
hostname <kern.warning> kernel:XFS (dm-2): xfs_log_force: error -5 returned.

xfs_repair无法修复损坏,我们必须从另一个存储卷恢复 XFS 文件系统的备份。是什么缘由造成的?如何预防?

解决

应尝试进行深入调查,尝试了解发生了哪些行为。

  • 当错误报告“清零数据”时,我们应该尝试找出“清零”了多少数据。为此,使用dd调查相关卷的前 1MB 将显示整个卷是否已清零。还可以研究整个块设备的第一部分。例如:

    # dd if=/dev/myvg/volume of=/tmp/file bs=1M count=1
    # hexdump /tmp/file | less
    

  • 应验证通用系统设置。对于所讨论的环境,使用了 2 个 RHEL 系统的非集群卷组。这意味着,必须特别注意,任何时候只有一个系统在磁盘上执行操作。对于 LVM,两个系统中只有一个应该使 VolumeGroup 联机。另外,这两个系统不应运行 lvmetad。 lvmetad 旨在缓存 LVM 数据,并在只有本地系统有权访问可见磁盘的假设下工作。

  • 应调查在相关系统上执行操作的顺序。为此,可以使用 /etc/lvm/backup 和 /etc/lvm/archive 中的 LVM 操作。通过这些文件和时间戳,发目前这种特定情况下执行了以下操作:

    • 第一,共享 LUN 上的 LogicalVolume 从节点 1 开始分多个步骤增加:50GB -> 50GB + X GB -> 50GB + X GB + YGB。这导致 VolumeGroup 中使用了 3 个段。
    • 一段时间后,从其他节点,一样的 LogicalVolume 直接从 50GB -> 50 + X + Y GB 扩展。
    • 这会将 LVM 元数据归零,由于节点 1 创建的最后 2 个段被节点 2 上执行的 lvextend 命令覆盖。
    • lvmetad 使事情变得更加复杂,它缓存数据并且不思考其他系统更改 LVM 数据。

根本缘由

  • 2 个系统正在访问一个共享块设备。每个系统都运行 lvmetad,它的运行假设只有本地系统可以访问该卷。
  • LVM 操作 (lvextend) 是从多个节点执行的,而该操作应该只从一个节点执行。
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容