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 环境中存在一些问题。
要解决此错误,请按照以下步骤操作:
- 备份逻辑卷上的所有数据。
- 停止所有包含 LVM 资源的服务(以便可以卸载卷并停用卷组)。
该服务不应在集群中的任何节点上运行(如果在集群上报告了错误)。 - 使用命令“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
- 激活卷组。
# vgchange -ay vg_root
1 logical volume(s) in volume group "vg_root" now active
- 运行“pvscan”命令以验证我们现在是否可以看到“校验和错误”。
# pvscan
- 重新启用在 vgcfgrestore 之前停止的所有服务。
总结
使用 vgcfgrestore 可以将 LVM 元数据的备份从损坏发生之前恢复到 LVM 物理卷。
我们可以使用 /etc/lvm/backup 中的默认备份文件从旧备份中恢复元数据。
如果我们在其他位置有备份文件,我们还可以使用 vgcfgrestore 命令指定备份文件,如下所示。
# vgcfgrestore -f /path/to/backup/file vgname
THE END