![LVM:修复失败后如何恢复 LVM 精简池/卷?](https://linux22.com/image/107727/LVM%EF%BC%9A%E4%BF%AE%E5%A4%8D%E5%A4%B1%E8%B4%A5%E5%90%8E%E5%A6%82%E4%BD%95%E6%81%A2%E5%A4%8D%20LVM%20%E7%B2%BE%E7%AE%80%E6%B1%A0%2F%E5%8D%B7%EF%BC%9F.png)
我想要一些有关从损坏的 LVM 精简池/卷中恢复的建议。导致我的LVM变薄的步骤如下:
- 我的精简池元数据已满 (99.4%),因此池冻结。
- 我尝试使用以下 2 个命令扩展池及其元数据:
lvextend -L+50G vg/pool lvextend --poolmetadata +50m vg/pool
- 此时lvs显示元数据仍然停留在99.4%
- 我尝试使用 lvconvert --repair vg/pool 修复元数据
- 现在我的池似乎是空的,lvs 显示池和 lv 的数据为 0%。
- 我尝试在修复之前切换回元数据:
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
,vgs
或pvs
命令挂起并阻止我们使用逻辑卷。在此步骤中,进程将被终止,逻辑卷将进入正确的状态:
$ 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