LVM:修复失败后如何恢复 LVM 精简池/卷?

LVM:修复失败后如何恢复 LVM 精简池/卷?

我想要一些有关从损坏的 LVM 精简池/卷中恢复的建议。导致我的LVM变薄的步骤如下:

  1. 我的精简池元数据已满 (99.4%),因此池冻结。
  2. 我尝试使用以下 2 个命令扩展池及其元数据: lvextend -L+50G vg/pool lvextend --poolmetadata +50m vg/pool
  3. 此时lvs显示元数据仍然停留在99.4%
  4. 我尝试使用 lvconvert --repair vg/pool 修复元数据
  5. 现在我的池似乎是空的,lvs 显示池和 lv 的数据为 0%。
  6. 我尝试在修复之前切换回元数据: lvconvert --thinpool vg/pool --poolmetadata pool-meta0 但仍然没有数据。

我还能从中恢复吗?我在这个精简池中有不少我想保存的lv。

非常感谢!

答案1

就我而言,lvextend --poolmetadata不允许进行任何更改,因为它会要求我执行手动修复™。因此,我将描述在我的情况下有效的方法。

在这种情况下,所有系统分区都位于精简配置的逻辑卷中,并且整个LVM 在 LUKS 内加密物理分区。不使用加密的用户可以跳过cryptsetup步骤 2 中的命令。


1.添加一个比系统驱动器具有更多存储容量的额外驱动器,使用操作系统安装介质启动到恢复模式,并且在不安装任何分区的情况下启动 root shell。尝试使用带有精简配置支持和最新内核版本的安装程序的发行版,以增加恢复过程中成功的机会(即 Fedora 优于 CentOS 或 RedHat)。

2.识别并安装您的额外驱动器,执行整个系统的备份映像并安装加密分区:

$ fdisk -l                                   #Identify drives and partitions

(我们将使用/dev/sda对于系统驱动器,/dev/sdb为了额外的驱动力和卷名对于本例中的 LUKS 加密卷名称)

$ mount /dev/sdb1 /mnt                       #Mount the extra drive
$ cd /mnt
$ cat /dev/sda > sda.img                     #Back up the system drive
$ sha256sum /dev/sda > sda.sum
$ sed -i 's/\/dev\/sda/.\/sda.img/g' sda.sum
$ sha256sum -c sda.sum                       #Verify backup integrity
$ cryptsetup open /dev/sda2 volname          #Mount encrypted LVM

3.此时,某些发行版可能会尝试自动激活逻辑卷,这将使lvs,vgspvs命令挂起并阻止我们使用逻辑卷。在此步骤中,进程将被终止,逻辑卷将进入正确的状态:

$ ps aux | grep scan                         #Look for 'lvm pvscan' or similar
root     1234  0.0  0.0    64843  9472 ?    Ss   11:11   0:02 /usr/sbin/lvm pvscan -a ...

$ kill -9 1234                               #Get the PID and kill it with fire
$ pvscan                                     #Scan without activating volumes

(VG池00对应于卷组和精简池名称)

$ lvchange -an vg                            #Deactivate entire volume group
$ lvchange -pr -ay vg/pool00_tmeta           #Activate metadata in readonly mode

4.现在是时候为元数据创建一个新的逻辑卷并修复它了:

$ lvs -a --units m | grep pool00_tmeta       #Get the current metadata size
  [pool00_tmeta]                       vg ewu-ai----    128.00m
    
$ lvcreate -L 256M -n pool00R vg             #Create a larger logical volume
$ lvchange -ay vg/pool00R                   #Activate the new logical volume
$ thin_repair -i /dev/vg/pool00_tmeta -o /dev/vg/pool00R
$ thin_check /dev/vg/pool00R                 #Verify it's been repaired properly

5.最后,我们替换精简池的元数据逻辑卷并删除旧的:

$ lvchange -an vg                            #Deactivate all LVs again
$ lvconvert --thinpool vg/pool00 --poolmetadata vg/pool00R
$ lvs -a --units m | grep pool00_tmeta       #Verify the LVs have been swapped
  [pool00_tmeta]                       vg ewu-ai----    256.00m

$ lvremove vg/pool00R                        #Get rid of the damaged metadata

如果在此过程中出现任何问题,您可以从额外的驱动器恢复备份,如下所示:

$ cat /mnt/sda.img > /dev/sda

相关内容