LVM 卷组的元数据损坏 Checksum error

问题

在 CentOS/RHEL 服务器上运行 LVM 命令时报告“Checksum error”。

# vgs
 /dev/mapper/cx0009_lun45: Checksum error   《--校验和错误
 /dev/mapper/cx0009_lun48: Checksum error
 VG #PV #LV #SN Attr VSize VFree
 vg00 1 7 0 wz--n- 279.12G 159.12G
 vgcommrmandb 1 6 0 wz--n- 20.00G 44.00M
 vgcotsoracle 1 1 0 wz--n- 20.00G 4.00M
 vgcotsorapit 1 1 0 wz--n- 50.00G 4.00M
...
# lvs
 /dev/mapper/cx0009_lun45: Checksum error
 /dev/mapper/cx0009_lun48: Checksum error
 LV VG Attr LSize Oroirn Snap% Move Log Copy% Convert
 crashvol vg00 -wi-ao 64.00G
 homevol vg00 -wi-ao 4.00G
 oemagentvol vg00 -wi-ao 10.00G
 rootvol vg00 -wi-ao 10.00G
 swapvol vg00 -wi-ao 16.00G
 tmpvol vg00 -wi-ao 8.00G
...
# pvs
 /dev/mapper/cx0009_lun45: Checksum error
 /dev/mapper/cx0009_lun48: Checksum error
 PV VG Fmt Attr PSize PFree
 /dev/cciss/c0d0p2 vg00 lvm2 a-- 279.12G 159.12G
 /dev/mapper/cx0008_lun37 vgeflxwmq lvm2 a-- 5.00G 1.00G
 /dev/mapper/cx0009_lun30 vgeflxjvastb lvm2 a-- 40.00G 8.04G
 /dev/mapper/cx0009_lun31 vgeflxhdb1arch lvm2 a-- 60.00G 20.00M

解决方案

校验和存储在 LVM2 元数据中,以便可以在数据实际损坏之前检测到损坏的存在。
当该校验和与处理元数据后计算的校验和不匹配时,通常会发生此问题。

校验和错误可能有许多不同的原因,其中一些包括以下内容:

  • 如果 2 台主机独立尝试同时更新 LVM2 元数据(即像集群情况)并且集群 LVM (clvm) 未在使用。
  • 更新元数据时发生的 I/O 错误(LVM2 更新不会被记录,因此 I/O 更新中断可能会导致损坏)。
  • 如果底层路径来自 SAN,则 SAN 环境中存在一些问题。

要解决此错误,请按照以下步骤操作:

  1. 备份逻辑卷上的所有数据。
  2. 停止所有包含 LVM 资源的服务(以便可以卸载卷并停用卷组)。
    该服务不应在集群中的任何节点上运行(如果在集群上报告了错误)。
  3. 使用命令“vgcfgrestore”恢复元数据。
    LVM 元数据备份文件存储在 /etc/lvm/backup 和 /etc/lvm/archive 中。
    vgcfgrestore 命令默认使用 /etc/lvm/backup 中的备份文件。
    运行 vgcfgrestore 以恢复 LVM 元数据。
    例如,
# vgcfgrestore vg_root
/dev/mapper/cx0009_lun45: Checksum error
/dev/mapper/cx0009_lun48: Checksum error
Restored volume group vg_root

 

  1. 激活卷组。
# vgchange -ay vg_root
1 logical volume(s) in volume group "vg_root" now active

 

  1. 运行“pvscan”命令以验证我们现在是否可以看到“校验和错误”。
# pvscan

 

  1. 重新启用在 vgcfgrestore 之前停止的所有服务。

总结

使用 vgcfgrestore 可以将 LVM 元数据的备份从损坏发生之前恢复到 LVM 物理卷。
我们可以使用 /etc/lvm/backup 中的默认备份文件从旧备份中恢复元数据。
如果我们在其他位置有备份文件,我们还可以使用 vgcfgrestore 命令指定备份文件,如下所示。

# vgcfgrestore -f /path/to/backup/file vgname
THE END