项目场景:

今天遇到一个很有意思的故障,我用虚拟机来还原了当前的故障场景。
首先来看,系统中只有一个lvn卷组
在这里插入图片描述
我们给系统中添加一块磁盘,使用pvcreate创建物理卷

pvcreate /dev/sdb

并将容量添加到当前的卷组中

在这里插入图片描述
创建一个lvm逻辑卷
在这里插入图片描述
格式化分区并挂载,我这里mnt分区没有用,挂载到mount分区
在这里插入图片描述
查询mylv分区的uuid
在这里插入图片描述
在fstab中做开机自动挂载
在这里插入图片描述
重启机器验证是否正常。

在这里插入图片描述
我们给mylv中添加一部分数据信息进去,复制/etc下的内容到mylv中
下一步,重装系统,模仿pv和vg被破坏的故障场景
(也有可能是共享存储被移动到了其他机器引起,我这里没有存储移动的条件,设备不允许)

注意: 我这里是centos7.9的系统,重装使用的是openEuler20.03,centos会在安装时提示磁盘为一个集合无法安装的报错。

ok,重启挂载你会发现问题,这时候sdb盘是无法挂载成功的。
接下来的步骤由于机器限制,无法用虚拟机还原成功,emmm,都写到这里了,还是决定将它写完。


问题描述

如果物理卷的卷组元数据区域意外覆盖或被破坏,你将收到一条错误消息,表明元数据区域不正确,或者系统无法找到带有特定 UUID 的物理卷。这时候可以通过在物理卷中编写新元数据区域来从物理卷中恢复数据,并指定与丢失的元数据相同的 UUID。


原因分析:

发生该故障的原因就是因为PV和VG的丢失。


解决方案:

明确了故障是由于PV和VG的的丢失引起的,那接下来需要做的就是修复PV和VG。
系统中内置的LVM信息,由于操作系统的覆盖,已无法利用/etc/lvm目录中的记录恢复。

恢复方法:

  1. 找到故障lvm逻辑卷的UUID,通过在 /etc/lvm/archive 目录中记录的信息可以得到UUID信息。查看卷组的最后一个已知有效归档 LVM 元数据的 VolumeGroupName_xxxx.vg 文件。或者通过之前系统的备份文件或其他记录寻找。
# vgchange -an --partial
Partial mode. Incomplete volume groups will be activated read-only.
  Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
  Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
-a|--activate y|n

Change the active state of LVs. An active LV can be used through a block device, allowing data on the LV to be accessed. y makes LVs active, or available. n makes LVs inactive, or unavailable. The block device for the LV is added or removed from the system using device-mapper in the kernel. A symbolic link /dev/VGName/LVName pointing to the device node is also added/removed. All software and scripts should access the device through the symbolic link and present this as the name of the device. The location and name of the underlying device node may depend on the distribution, configuration (e.g. udev), or release version.
翻译过来就是:更改 LV 的活动状态。活动 LV 可以通过块设备使用,允许访问 LV 上的数据。

  • y 使 LV 处于活动状态或可用状态
  • n 使 LV 不活动或不可用。在内核中使用设备映射器从系统中添加或删除 LV 的块设备。指向设备节点的符号链接/dev/VGName/LVName 也被添加/删除。所有软件和脚本都应该通过符号链接访问设备,并将其作为设备的名称。底层设备节点的位置和名称可能取决于发布版本、配置(例如 udev)或发布版本。
-P|--partial

Commands will do their best to activate LVs with missing PV extents. Missing extents may be replaced with error or zero segments according to the missing_stripe_filler setting. Metadata may not be changed with this option.
翻译过来就是:命令将尽最大努力激活缺少 PV 区段的 LV。缺少的区段可以根据 miss _ stripe _ fill 设置用错误或零段替换。此选项不能更改元数据。

  1. 使用 pvcreate 命令的 --uuid--restorefile 参数来恢复物理卷。以下示例将 /dev/sdh1 设备标记为带有上述 UUID 的物理卷,FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk。此命令使用 VG_00050.vg 中包含的元数据信息恢复物理卷标签,这是卷组的最新归档元数据。restorefile 参数指示 pvcreate 命令使新物理卷与卷组中的旧物理卷兼容,或者新元数据不会放置在旧的物理卷包含数据的位置(例如,如果原始 pvcreate 命令使用了控制元数据放置的命令行参数,或者物理卷最初是使用不同默认值的不同软件版本创建的)。pvcreate 命令只覆盖 LVM 元数据区域,不会影响现有数据区域。
# pvcreate --uuid "FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk" --restorefile /etc/lvm/archive/VG_00050.vg /dev/sdh1
Physical volume "/dev/sdh1" successfully created

到这里PV就已经恢复了。

  1. 然后,使用 vgcfgrestore 命令恢复卷组的元数据。
# vgcfgrestore VG
  Restored volume group VG

如果不出意外的话,使用lvs命令查询逻辑卷的具体信息就可以正常显示了。

# lvs -a -o +devices
  LV     VG   Attr   LSize   Origin Snap%  Move Log Copy%  Devices
  stripe VG   -wi--- 300.00G                               /dev/sdh1 (0),/dev/sda1(0)
  stripe VG   -wi--- 300.00G                               /dev/sdh1 (34728),/dev/sdb1(0)

4.确认逻辑卷的激活状态,如果是未激活,使用lvchange -ay /dev/VG_NAME/LV_NAME 命令激活。

# lvchange -ay /dev/VG/stripe
# lvs -a -o +devices
  LV     VG   Attr   LSize   Origin Snap%  Move Log Copy%  Devices
  stripe VG   -wi-a- 300.00G                               /dev/sdh1 (0),/dev/sda1(0)
  stripe VG   -wi-a- 300.00G                               /dev/sdh1 (34728),/dev/sdb1(0)

注意

1.首先要确保发生故障后,磁盘未做格式化等操作;
2.发生故障后没有对数据进行其他方式的强制读取;
3.还是要规范使用LVM,不要把数据盘合到系统盘的卷组中;
4.数据恢复并不保证百分百成功。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐