在Linux中恢复LVM2分区,PV,VG,LVM metdata

时间:2020-02-23 14:40:18  来源:igfitidea点击:

在本文中,我们将学习

  • 如何恢复LVM2分区(恢复已删除的LVM)

  • 如何在Linux中还原PV(物理卷)

  • 如何在Linux中还原VG(卷组)

  • 如何在Linux中还原LVM元数据

早些时候,我们遇到了一种情况,其中缺少来自我们CentOS 8节点之一的LVM元数据。
因此,在Linux服务器上看不到映射到该LVM元数据的所有逻辑卷,卷组和物理卷。
因此,我们必须使用vgcfgrestore从备份还原LVM元数据。

将介绍重现该场景的步骤,即手动删除LVM元数据,然后使用vgcfgrestore在Linux中恢复LVM2分区,还原PV,还原VG和还原LVM元数据的步骤。

vgcfgbackup可用于手动创建LVM备份,因为这些备份非常有用,也可用于LVM Disaster Recovery。

创建物理卷

第一步是使用pvcreate创建物理卷

[root@centos-8 ~]# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.

创建卷组

接下来创建一个新的卷组,我们将这个VG命名为test_vg

[root@centos-8 ~]# vgcreate test_vg /dev/sdb
  Volume group "test_vg" successfully created

使用vgs列出可用的卷组。
我目前有两个卷组,其中rhel卷组包含我的系统LVM2分区

[root@centos-8 ~]# vgs
  VG      #PV #LV #SN Attr   VSize   VFree
  rhel      1   2   0 wz--n- <14.50g     0
  test_vg   1   0   0 wz--n-  <8.00g <8.00g  <-- new VG

创建逻辑卷

在我们的新卷组" test_vg"下创建一个新的逻辑卷" test_lv1"。

[root@centos-8 ~]# lvcreate -L 1G -n test_lv1 test_vg
  Logical volume "test_lv1" created.

在逻辑卷上创建文件系统

在这个新的逻辑卷上创建ext4文件系统

[root@centos-8 ~]# mkfs.ext4 /dev/mapper/test_vg-test_lv1
mke2fs 1.44.6 (5-Mar-2019)
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: c2d6eff5-f32f-40d4-88a5-a4ffd82ff45a
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

列出可用的卷组以及映射的存储设备。
如我们所见," test_vg"已映射到"/dev/sdb"

[root@centos-8 ~]# vgs -o+devices
  VG      #PV #LV #SN Attr   VSize   VFree  Devices
  rhel      1   2   0 wz--n- <14.50g     0  /dev/sda2(0)
  rhel      1   2   0 wz--n- <14.50g     0  /dev/sda2(239)
  test_vg   1   1   0 wz--n-  <8.00g <7.00g /dev/sdb(0)

同样,我们可以看到新的逻辑卷" test_lv1"已映射到"/dev/sdb"设备

[root@centos-8 ~]# lvs -o+devices
  LV       VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices
  root     rhel    -wi-ao----  13.56g                                                     /dev/sda2(239)
  swap     rhel    -wi-ao---- 956.00m                                                     /dev/sda2(0)
  test_lv1 test_vg -wi-a-----   1.00g                                                     /dev/sdb(0)  <-- new Logical Volume

向逻辑卷添加一些数据

我们将在下一步中将一些数据放入逻辑卷中,以确保在恢复LVM2分区,恢复PV和使用LVM元数据恢复VG之后没有数据丢失。

[root@centos-8 ~]# mkdir /test
[root@centos-8 ~]# mount /dev/mapper/test_vg-test_lv1 /test/

创建一个虚拟文件并记下该文件的md5sum值

[root@centos-8 ~]# touch /test/file
[root@centos-8 ~]# md5sum /test/file
d41d8cd98f00b204e9800998ecf8427e  /test/file

接下来卸载逻辑卷

[root@centos-8 ~]# umount /test/

如何在Linux中手动删除LVM元数据?

要在Linux中手动删除LVM元数据,我们可以使用各种工具,例如wipefsdd等。
wipefs可以擦除指定设备上的文件系统,raid或者分区表签名(魔术字符串)以使签名对于libblkid。
wipefs不会擦除文件系统本身或者设备中的任何其他数据。

警告:

明智地执行此命令,建议不要在生产环境中执行此命令,因为它将删除设备的所有文件系统签名。

在这个例子中,我们将使用wipefs从/dev/sdb设备中删除LVM元数据。
由于卷组正在使用有问题的设备"/dev/sdb",因此我们必须使用" -f"来强制擦除LVM元数据

[root@centos-8 ~]# wipefs --all --backup -f /dev/sdb
/dev/sdb: 8 bytes were erased at offset 0x00000218 (LVM2_member): 4c 56 4d 32 20 30 30 31

我们使用了--backup,以便在删除LVM元数据之前,wipefs将在执行命令的用户的主文件夹下创建包含LVM元数据的ext4签名的备份。
由于我们使用的是root用户,因此我们的LVM元数据备份存储在root用户的主文件夹下。

[root@centos-8 ~]# ls -l /root/wipefs-sdb-0x00000218.bak
-rw------- 1 root root 8 Apr  5 13:45 /root/wipefs-sdb-0x00000218.bak

提示:

为了从备份中恢复存储在文件系统签名中的lvm元数据,我们可以使用dd if =~/wipefs-sdb-0x00000218.bak of =/dev/sdb seek = $((0x00000218))bs = 1 conv = notrunc

接下来,我们可以验证Linux服务器中是否缺少/dev/sdb的所有逻辑卷,卷组和物理卷部分

[root@centos-8 ~]# lvs -o+devices
  LV   VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices
  root rhel -wi-ao----  13.56g                                                     /dev/sda2(239)
  swap rhel -wi-ao---- 956.00m                                                     /dev/sda2(0)  <--Our Logical volume no more visible
[root@centos-8 ~]# vgs
  VG   #PV #LV #SN Attr   VSize   VFree
  rhel   1   2   0 wz--n- <14.50g    0  <-- test_vg no more visible
[root@centos-8 ~]# pvs
  PV         VG   Fmt  Attr PSize   PFree
  /dev/sda2  rhel lvm2 a--  <14.50g    0  <-- /dev/sdb no more visible

与" lsblk"类似,我们也可以验证在"/dev/sdb"下是否没有LVM2分区。

[root@centos-8 ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0   15G  0 disk
├─sda1          8:1    0  512M  0 part /boot
└─sda2          8:2    0 14.5G  0 part
  ├─rhel-root 253:0    0 13.6G  0 lvm  /
  └─rhel-swap 253:1    0  956M  0 lvm  [SWAP]
sdb             8:16   0    8G  0 disk
sr0            11:0    1 1024M  0 rom
sr1            11:1    1 1024M  0 rom

列出备份文件以在Linux中还原LVM元数据

  • 每当对卷组或者逻辑卷进行配置更改时,都会自动创建" LVM元数据备份和归档",除非在" lvm.conf"文件中禁用了此功能。

  • 默认情况下,元数据备份存储在/etc/lvm/backup文件中,元数据档案存储在/etc/lvm/archive文件中。

-/etc/lvm/archive文件中存储的元数据档案的保留时间以及多少档案文件的保留取决于我们可以在lvm.conf文件中设置的参数。

  • 每日系统备份应在备份中包含/etc/lvm目录的内容。

  • 我们可以使用vgcfgbackup命令将LVM元数据手动备份到/etc/lvm/backup文件中。

  • 我们可以使用vgcfgrestore命令恢复LVM元数据。

要列出LVM元数据的可用备份,请使用vgcfgrestore --list
当前,我们有三个备份阶段,其中最后一个备份是在创建" test_lv1"逻辑卷之后进行的。

[root@centos-8 ~]# vgcfgrestore --list test_vg
  File:         /etc/lvm/archive/test_vg_00000-1327770182.vg
  VG name:      test_vg
  Description:  Created *before* executing 'vgcreate test_vg /dev/sdb'
  Backup Time:  Sun Apr  5 13:43:26 2017

  File:         /etc/lvm/archive/test_vg_00001-1359568949.vg
  VG name:      test_vg
  Description:  Created *before* executing 'lvcreate -L 1G -n test_lv1 test_vg'
  Backup Time:  Sun Apr  5 13:44:02 2017

  File:         /etc/lvm/backup/test_vg
  VG name:      test_vg
  Description:  Created *after* executing 'lvcreate -L 1G -n test_lv1 test_vg'
  Backup Time:  Sun Apr  5 13:44:02 2017

因此,我们将使用最后一个备份,即"/etc/lvm/backup/test_vg",将LVM元数据恢复到创建" test_lv1"的阶段。

在Linux中还原PV(物理卷)

重要的提示:

就我而言,物理卷也丢失了,因此我要创建一个新的物理卷,但是如果情况下存在物理卷,并且仅缺少卷组和逻辑卷,则可以忽略此步骤。

在生产环境中执行这些步骤之前,必须执行适当的预检查并备份文件系统,以防止任何数据丢失。

  • "还原PV,使用与先前相同的UUID创建新的PV,这非常重要,否则还原VG并恢复LVM2分区将在接下来的步骤中失败。

  • 我们可以从备份文件/etc/lvm/backup/test_vg中获取物理卷的UUID

  • 以下是备份文件中physical_volumes的示例内容。
    如果我们有多个物理卷,则需要搜索丢失的PV的UUID

  • 在我的情况下," SBJi2o-jG2O-TfWb-3pyQ-Fh6k-fK6A-AslOg1"是缺少的PV的UUID,因此我将使用它在Linux中还原PV

physical_volumes {
                pv0 {
                        id = "SBJi2o-jG2O-TfWb-3pyQ-Fh6k-fK6A-AslOg1"
                        device = "/dev/sdb"     # Hint only
                        status = ["ALLOCATABLE"]
                        flags = []
                        dev_size = 16777216     # 8 Gigabytes
                        pe_start = 2048
                        pe_count = 2047 # 7.99609 Gigabytes
                }
        }

接下来,测试物理卷还原很重要。
我们使用--test模式来验证操作。
使用--test命令将不会更新LVM元数据。
这是通过禁用所有元数据写入,但仍将成功返回调用函数来实现的。

因此,其中我提供了与先前收集的相同的/dev/sdbUUID,然后是我们要用于还原PV的备份文件,然后提供了将用于执行pvcreate的设备名称。
pvcreate命令仅覆盖LVM元数据区域,并且不影响现有数据区域。

[root@centos-8 ~]# pvcreate --test --uuid "SBJi2o-jG2O-TfWb-3pyQ-Fh6k-fK6A-AslOg1" --restorefile /etc/lvm/backup/test_vg /dev/sdb
  TEST MODE: Metadata will NOT be updated and volumes will not be (de)activated.
  WARNING: Couldn't find device with uuid SBJi2o-jG2O-TfWb-3pyQ-Fh6k-fK6A-AslOg1.
  Physical volume "/dev/sdb" successfully created.

在" --test"模式下,我们知道命令执行成功。
因此,我们将在不使用--test的情况下运行相同的命令以实际还原PV。

[root@centos-8 ~]# pvcreate  --uuid "SBJi2o-jG2O-TfWb-3pyQ-Fh6k-fK6A-AslOg1" --restorefile /etc/lvm/backup/test_vg /dev/sdb
  WARNING: Couldn't find device with uuid SBJi2o-jG2O-TfWb-3pyQ-Fh6k-fK6A-AslOg1.
  Physical volume "/dev/sdb" successfully created.

接下来,验证可用物理卷的列表

[root@centos-8 ~]# pvs
  PV         VG   Fmt  Attr PSize   PFree
  /dev/sda2  rhel lvm2 a--  <14.50g    0
  /dev/sdb        lvm2 ---    8.00g 8.00g  <-- Now /dev/sdb is visible

恢复VG以恢复LVM2分区

  • 还原PV之后,下一步是还原VG,它将进一步恢复LVM2分区,也将恢复LVM元数据。

  • 类似于pvcreate,我们将以--test模式执行vgcfgrestore,以检查还原VC是成功还是失败。

  • 该命令将不会更新任何LVM中继日期

[root@centos-8 ~]# vgcfgrestore --test -f /etc/lvm/backup/test_vg test_vg
  TEST MODE: Metadata will NOT be updated and volumes will not be (de)activated.
  Restored volume group test_vg.

如我们所见,在--test模式下的命令执行成功,因此现在我们可以安全地执行命令,以使用vgcfgrestore在Linux中恢复VG和恢复LVM2分区。

[root@centos-8 ~]# vgcfgrestore  -f /etc/lvm/backup/test_vg test_vg
  Restored volume group test_vg.

使用vgs可以检查恢复VG是否成功。

[root@centos-8 ~]# vgs
  VG      #PV #LV #SN Attr   VSize   VFree
  rhel      1   2   0 wz--n- <14.50g     0
  test_vg   1   1   0 wz--n-  <8.00g <7.00g  <-- test_vg is not visible

接下来,验证我们是否能够使用lvs恢复已删除的lvm和恢复LVM2分区。

[root@centos-8 ~]# lvs
  LV       VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root     rhel    -wi-ao----  13.56g
  swap     rhel    -wi-ao---- 956.00m
  test_lv1 test_vg -wi-------   1.00g  <-- our logical volume is also visible

激活卷组

接下来激活卷组" test_vg"

[root@centos-8 ~]# vgchange -ay test_vg
  1 logical volume(s) in volume group "test_vg" now active

验证LVM2分区恢复后的数据丢失

最关键的部分是,在还原PV,还原VG,还原LVM元数据和还原LVM2分区的整个过程中,请确保没有数据丢失。

[root@centos-8 ~]# mount /dev/mapper/test_vg-test_lv1 /test/

如果我们能够挂载逻辑卷,那么"这意味着我们的ext4文件系统签名是完整的"并且没有丢失,否则挂载将会失败。

[root@centos-8 ~]# ls -l /test/
total 16
-rw-r--r-- 1 root root     0 Apr  5 13:45 file
drwx------ 2 root root 16384 Apr  5 13:44 lost+found

我们的测试文件存在,并且md5sum与删除LVM元数据之前我们获取的值匹配

[root@centos-8 ~]# md5sum /test/file
d41d8cd98f00b204e9800998ecf8427e  /test/file  <-- same as earlier

因此,总体还原PV,还原VG,还原LVM元数据和还原LVM2分区是成功的。