删除 LVM 签名并重新创建新大小的分区后挽救实时系统

删除 LVM 签名并重新创建新大小的分区后挽救实时系统

我做了一件蠢事,我马上承认。幸好,这是在测试系统上做的。

我在 ESXi 6.7 主机上的虚拟机中运行 DNS 服务器。DNS 服务器需要更多存储空间,因此我在 VMWare 上对其进行了扩展。

现在是时候调整虚拟机内部的 LVM 大小了。

当我执行删除驱动器的第二个分区的步骤,以新的大小重新创建它时,系统提示我该分区已包含 LVM 签名,并询问我是否要删除它。我虽然很笨,但我还是说是,然后将更改写入分区表。

我很快意识到,我刚刚删除了活动系统实际上需要的 LVM 运行内容,现在它不再识别 LVM 了。

此时,我在 VMWare 中创建了一个快照。我知道早点不创建这个快照是愚蠢的。

一般来说,我可以备份所有数据并根据该快照重新创建机器。

不过,我想知道是否有可能在运行系统上修复我的这个错误,因为我有以下信息/etc/lvm/backup/zeus-vg

# Generated by LVM2 version 2.03.07(2) (2019-11-30): Tue Nov  7 14:26:04 2023

contents = "Text Format Volume Group"
version = 1

description = "Created *after* executing 'pvresize /dev/sda2'"

creation_host = "zeus"  # Linux zeus 5.4.0-146-generic #163-Ubuntu SMP Fri Mar 17 18:26:02 UTC 2023 x86_64
creation_time = 1699363564      # Tue Nov  7 14:26:04 2023

zeus-vg {
        id = "QgSYzW-No1X-88Xm-Bs5J-wK2w-1oGo-Z4UxQH"
        seqno = 7
        format = "lvm2"                 # informational
        status = ["RESIZEABLE", "READ", "WRITE"]
        flags = []
        extent_size = 8192              # 4 Megabytes
        max_lv = 0
        max_pv = 0
        metadata_copies = 0

        physical_volumes {

                pv0 {
                        id = "rAgPpU-iVJg-3wFs-j4Br-0usv-3lew-HTsisM"
                        device = "/dev/sda2"    # Hint only

                        status = ["ALLOCATABLE"]
                        flags = []
                        dev_size = 49276928     # 23.4971 Gigabytes
                        pe_start = 2048
                        pe_count = 6015 # 23.4961 Gigabytes
                }
        }

        logical_volumes {

                root {
                        id = "G8SCiJ-EiuE-42R7-vC84-2fb4-Jjbw-oOVhHm"
                        status = ["READ", "WRITE", "VISIBLE"]
                        flags = []
                        creation_time = 1626286622      # 2021-07-14 20:17:02 +0200
                        creation_host = "zeus"
                        segment_count = 1

                        segment1 {
                                start_extent = 0
                                extent_count = 5770     # 22.5391 Gigabytes

                                type = "striped"
                                stripe_count = 1        # linear

                                stripes = [
                                        "pv0", 0
                                ]
                        }
                }

                swap_1 {
                        id = "3FAmWU-ep0v-yfDH-2D9I-2RFc-W85E-8WR1jU"
                        status = ["READ", "WRITE", "VISIBLE"]
                        flags = []
                        creation_time = 1626286622      # 2021-07-14 20:17:02 +0200
                        creation_host = "zeus"
                        segment_count = 1

                        segment1 {
                                start_extent = 0
                                extent_count = 245      # 980 Megabytes

                                type = "striped"
                                stripe_count = 1        # linear

                                stripes = [
                                        "pv0", 5770
                                ]
                        }
                }
        }

}

出于培训目的,我想知道在这种情况下该怎么做,因为它可能发生在非作为虚拟机运行的系统上。

该系统运行的是 Ubuntu 20.04,以下是该快照的当前状态:

root@zeus:~# blkid
/dev/mapper/zeus--vg-swap_1: UUID="fef217b3-95dd-49ad-8cd5-d8868c34b5a5" TYPE="swap"
/dev/mapper/zeus--vg-root: UUID="5da6e8af-648b-4858-9391-a33e762c78a4" TYPE="ext4"
/dev/sr0: UUID="2020-07-03-15-13-37-00" LABEL="Zentyal 6.2-development amd64" TYPE="iso9660" PTUUID="3b07df6a" PTTYPE="dos"
/dev/sda1: UUID="A21E-6989" TYPE="vfat" PARTUUID="7f5c8fe2-820d-4759-b500-b870a9a87842"
/dev/sda2: UUID="rAgPpU-iVJg-3wFs-j4Br-0usv-3lew-HTsisM" TYPE="LVM2_member" PARTUUID="946b1bc7-09de-a544-ade1-c6bac5f765fb"
root@zeus:~# fdisk -l
Disk /dev/sda: 64 GiB, 68719476736 bytes, 134217728 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D04782E5-7205-40CA-AEB5-E96AAA334C9C

Device       Start       End   Sectors  Size Type
/dev/sda1     2048   1050623   1048576  512M EFI System
/dev/sda2  1050624 134217694 133167071 63.5G Linux LVM


Disk /dev/mapper/zeus--vg-root: 22.55 GiB, 24201134080 bytes, 47267840 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/zeus--vg-swap_1: 980 MiB, 1027604480 bytes, 2007040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
root@zeus:~# vgdisplay // doesn't return anything

答案1

由于我有 LVM 元数据的备份,因此我可以使用它来恢复卷。

它需要启动到新的实时救援环境并在那里创建备份文件。

由于分区表更改和删除 LVM 签名,磁盘的 UUID 发生了变化。

因此我需要删除 LVM 元数据,使用pvremove /dev/sda2

之后,我可以使用原始 UUID 重新创建物理卷: pvcreate --uuid "rAgPpU-iVJg-3wFs-j4Br-0usv-3lew-HTsisM" --restorefile lvm-restore-file /dev/sda2

由于现在已重新创建卷,我可以再次使用备份文件恢复 LVM 元数据: vgcfgrestore -f lvm-restore-file zeus-vg

如果恢复成功,我可以运行vgchange -ay zeus-vg以重新激活救援环境中的卷组。

LVM 现在应该可以挂载了: mount /dev/zeus-vg/root /mnt

恢复 LVM 元数据后,我现在可以执行之前分区出错后无法执行的步骤,即调整 LVM 大小:

  1. 调整物理卷大小pvresize /dev/sda2
  2. 扩展逻辑卷lvextend -l +100%FREE /dev/zeus-vg/root
  3. 调整文件系统大小resize2fs /dev/zeus-vg/root(因为我有一个 ext4 文件系统)

这真是一段相当漫长的旅程。

相关内容