在Linux中恢复LVM2分区,PV,VG,LVM metdata
在本文中,我们将学习
如何恢复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元数据,我们可以使用各种工具,例如wipefs
,dd
等。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/sdb
UUID,然后是我们要用于还原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分区是成功的。