我做了一件蠢事,我马上承认。幸好,这是在测试系统上做的。
我在 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 大小:
- 调整物理卷大小
pvresize /dev/sda2
- 扩展逻辑卷
lvextend -l +100%FREE /dev/zeus-vg/root
- 调整文件系统大小
resize2fs /dev/zeus-vg/root
(因为我有一个 ext4 文件系统)
这真是一段相当漫长的旅程。