我的 LVM 中有一个驱动器发生故障,现在显示为未知。卷组“vmimages”设置为镜像
WARNING: Device for PV BejWGq-OBoi-RQ03-2pJU-ow0e-KORt-MbkW8F not found or rejected by a filter.
--- Physical volume ---
PV Name [unknown]
VG Name vmimages
PV Size <2.73 TiB / not usable 4.46 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 715396
Free PE 692353
Allocated PE 23043
PV UUID BejWGq-OBoi-RQ03-2pJU-ow0e-KORt-MbkW8F
--- Physical volume ---
PV Name /dev/sde1
VG Name vmimages
PV Size 651.92 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 166892
Free PE 143852
Allocated PE 23040
PV UUID CC5Aif-KJRz-ZrmB-FfLD-ge6o-cJvR-s8zPwX
--- Physical volume ---
PV Name /dev/sdc1
VG Name vmimages
PV Size <652.86 GiB / not usable 0
Allocatable yes
PE Size 4.00 MiB
Total PE 167131
Free PE 167131
Allocated PE 0
PV UUID Vmo1s7-8LYw-uuNq-B4QE-CSSi-QEK8-Sf1oo4
--- Physical volume ---
PV Name /dev/sdb
VG Name main
PV Size <5.46 TiB / not usable <2.59 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 1430791
Free PE 7153
Allocated PE 1423638
PV UUID 1CyYd3-AzTO-2nez-BsdC-7k5I-W2GV-5j9b6A
--- Physical volume ---
PV Name /dev/sdd
VG Name main
PV Size <7.28 TiB / not usable <1.34 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 1907721
Free PE 484084
Allocated PE 1423637
PV UUID eCe1ep-zSLG-w6XE-p9QI-eUY5-46ZH-EQNmEW
None of the logical volumes in the VG are available
$ sudo lvdisplay vmimages
WARNING: Device for PV BejWGq-OBoi-RQ03-2pJU-ow0e-KORt-MbkW8F not found or rejected by a filter.
--- Logical volume ---
LV Path /dev/vmimages/unifi
LV Name unifi
VG Name vmimages
LV UUID 4sxn41-4ZO2-Ivkw-Jeq3-xITu-jRSl-Zqod0k
LV Write Access read/write
LV Creation host, time maus, 2018-06-22 03:06:17 +0000
LV Status NOT available
LV Size 30.00 GiB
Current LE 7680
Mirrored volumes 2
Segments 1
Allocation inherit
Read ahead sectors auto
--- Logical volume ---
LV Path /dev/vmimages/gateway
LV Name gateway
VG Name vmimages
LV UUID 9MXECi-m5bP-0RuN-4Ihs-rDhO-RMTJ-uPrac8
LV Write Access read/write
LV Creation host, time maus, 2018-06-23 17:39:32 +0000
LV Status NOT available
LV Size 30.00 GiB
Current LE 7680
Mirrored volumes 2
Segments 1
Allocation inherit
Read ahead sectors auto
--- Logical volume ---
LV Path /dev/vmimages/homeassistant
LV Name homeassistant
VG Name vmimages
LV UUID 44xHsi-EW4q-xrLz-fzYF-RCGd-3FSE-802Mab
LV Write Access read/write
LV Creation host, time maus, 2018-07-08 19:53:47 +0000
LV Status NOT available
LV Size 30.00 GiB
Current LE 7680
Mirrored volumes 2
Segments 1
Allocation inherit
Read ahead sectors auto
我尝试以降级模式启动我的一个 LV,但没有任何效果。手册页表明这不适用于镜像,但没有提供替代方案或解释原因。
$ sudo lvchange -ay --activationmode degraded /dev/vmimages/unifi
WARNING: Device for PV BejWGq-OBoi-RQ03-2pJU-ow0e-KORt-MbkW8F not found or rejected by a filter.
Refusing activation of partial LV vmimages/unifi. Use '--activationmode partial' to override.
我的理解是,我不应该使用“部分”来激活 Lv
我仔细检查了一下,我发现其中一个 PV 上有一个完整的副本
$ sudo pvs /dev/sde1 --segments -o +lv_name +lv_size
Failed to find device for physical volume "+lv_size".
WARNING: Device for PV BejWGq-OBoi-RQ03-2pJU-ow0e-KORt-MbkW8F not found or rejected by a filter.
PV VG Fmt Attr PSize PFree Start SSize LV
/dev/sde1 vmimages lvm2 a-- 651.92g 561.92g 0 7680 [unifi_mimage_0]
/dev/sde1 vmimages lvm2 a-- 651.92g 561.92g 7680 7680 [gateway_mimage_0]
/dev/sde1 vmimages lvm2 a-- 651.92g 561.92g 15360 7680 [homeassistant_mimage_0]
/dev/sde1 vmimages lvm2 a-- 651.92g 561.92g 23040 143852
我也尝试过将镜像转换为非镜像。如果不先激活,则无法完成此操作。我还尝试过删除丢失的设备。然后 LVM 告诉我需要修复 LV(我不知道这是什么意思)或删除(显然不是我想要的)。
我不知道该怎么做。如何让 LVM 激活我的逻辑卷,然后使用我的新 PV /dev/sdc1 重新镜像数据?我假设我的数据实际上位于 /dev/sde1 上,但处于不确定状态
答案1
这里存在同样的问题,使用某种有点黑客的方式解决了dd
。
我们有 三年前在 LVM 上设置了 root。现在其中一个物理磁盘彻底失效了:
pier41:~# hdparm -I /dev/sdb
/dev/sdb:
HDIO_DRIVE_CMD(identify) failed: Input/output error
有一个LVM镜像恢复说明内容如下:
对镜像卷的任何写入活动都会导致 LVM 检测到镜像故障。发生这种情况时,LVM 会将镜像转换为单个线性卷。
不幸的是,这个说法似乎是错误的,至少对于我们的 Debian 10 Buster 内核版本 4.19 来说是这样。自动转换没有发生,/dev/vg0/root
仍然是镜像。由于内核页面缓存,从卷中读取某些文件是可行的,读取其他一些文件会导致 I/O 错误。我能够保存/etc/lvm/lvm.conf
并/etc/lvm/backup/vg0
。最后系统无法使用,不得不艰难地重新启动echo b > /proc/sysrq-trigger
。
我已经在另一台机器上准备好了替换磁盘:
# fdisk /dev/sdX
# pvcreate --uuid [for sdb2 in ./lvm.conf] --restorefile backup/vg0 /dev/sdX2
用替换磁盘替换故障磁盘并尝试启动 - 没有成功,无法挂载根。 好的,从救援闪存启动。
pier41:~# lvdisplay -m /dev/vg0/root
--- Logical volume ---
LV Path /dev/vg0/root
LV Name root
VG Name vg0
LV UUID xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
LV Write Access read/write
LV Creation host, time pier41, 2019-01-21 15:25:14 +0300
LV Status NOT available
LV Size <20.29 GiB
Current LE 5194
Mirrored volumes 2
Segments 1
Allocation inherit
Read ahead sectors auto
--- Segments ---
Logical extents 0 to 5193:
Type raid1
Monitoring
Raid Data LV 0
Logical volume root_rimage_0
Logical extents 0 to 5193
Raid Data LV 1
Logical volume root_rimage_1
Logical extents 0 to 5193
Raid Metadata LV 0 root_rmeta_0
Raid Metadata LV 1 root_rmeta_1
其他(非镜像)LV 都有LV Status available
。从镜像 LV 转换
/dev/vg0/root
为普通 LV 确实不起作用:
# lvconvert -m0 /dev/vg0/root
vg0/root must be active to perform this operation
# lvchange -ay --activationmode degraded /dev/vg0/root
device-mapper: reload ioctl on (253:122) failed: Invalid argument
但是我们可以使用报告的映射手动lvdisplay -m
从健康的底层 PV(/dev/sda2)复制数据。创建一个新的 LV/dev/vg0/root3
来将数据复制到:
# lvcreate -n root3 -l 5194 vg0 /dev/sdb3
我们明确指定目标 PV(/dev/sdb3
),以免 LVM 尝试在故障 PV 上创建 LV。
PV 的结构很简单:它以元数据区域开始,然后是从 0 开始编号的大量 PE 数组。我们可以使用 找到 PE 大小,pvdisplay
并使用 找到到 PE_0 的偏移量pvck
:
pier41:~# pvdisplay /dev/sda2 | grep 'PE Size'
PE Size 4.00 MiB
pier41:~# pvck /dev/sda2
Found label on /dev/sda2, sector 1, type=LVM2 001
Found text metadata area: offset=4096, size=1044480
pier41:~> expr 4096 + 1044480
1048576
1048576字节的偏移量正好是2^20 = 1MiB,所以我们可以方便地按1MiBdd
块进行操作:
# dd < /dev/sdb2 > /dev/vg0/root3 bs=1M skip=1 count=20776
其中 20776=5194*4 是root
LV 大小(以 1MiB 块为单位)。鉴于只有这一个段需要复制,我们也可以省略count=
,直接复制至/dev/vg0/root3
满为止。
完成后dd
,确认我们复制的数据确实是一个文件系统:
# fsck /dev/vg0/root3
此时我已经使用/etc/lvm
从恢复的root3
LV 完成替换磁盘上的元数据重建:
# mount /dev/vg0/root3 /mnt
# vgcfgrestore --file /mnt/etc/lvm/backup/vg0 vg0
# umount /mnt
最后,我重命名了 LV 以便从恢复的 LV 启动:
# lvrename vg0 root rootfail
# lvrename vg0 root3 root
# reboot
现在系统启动正常了。下一步是恢复所有非镜像 LV 中的数据,由于与问题无关,因此省略。
更新
在重新创建镜像设置时,我发现了一个更简单的解决方案:大胆删除“不可用”的镜像 LV,然后在健康 PV 上的同一位置重新创建线性 LV:
pier41:~# lvremove /dev/vg0/rootfail
Logical volume "rootfail" successfully removed
pier41:~# lvcreate -Zn -Wn -n root4 -l 5194 vg0 /dev/sda2:0-5193
WARNING: Logical volume vg0/root4 not zeroed.
Logical volume "root4" created.
pier41:~# fsck /dev/vg0/root4
(journal replay, minor corrections, OK)
选项-Zn
和-Wn
禁用清零 LV 的前 4KB 以及文件系统签名检测和擦除(lvcreate
通常会这样做)(请参阅man lvcreate
)。如果您忘记了它们,fsck
会抱怨很多,但无论如何都会应付,不会丢失任何文件。
此解决方案不需要额外的空间(root3
)来复制文件系统。