第 6 章 LVM 故障排除第 6 章 LVM 故障排除
本章提供了对不同 LVM 问题进行故障排除的操作方法。
6.1. 故障排除诊断
如果某个命令没有按照预期执行,则可以使用以下方法收集诊断信息:
使用任意命令的 -v、-vv、-vvv 或者 -vvvv 参数提高输出信息的详细程度。
如果问题与逻辑卷激活有关,请在配置文件的‘log’部分设定‘activation=1’,并在运行命令时使用 -vvvv 选项。检查输出结果后,确定将此参数重新设为 0,以防止在机器可用内存较少时出现机器锁定现象。
运行 lvmdump 命令可为诊断提供信息转储。有关详情请参考 lvmdump(8) man page。
执行 lvs -v、pvs -a 或者 dmsetup info -c 命令以获得额外的系统信息。
检查 /etc/lvm/backup 文件中最后的元数据备份和 /etc/lvm/archive> 中的归档版本。
运行 lvm dumpconfig 命令检查现有配置信息。
检查 /etc/lvm 目录中的 .cache 文件,了解包含物理卷设备的记录。
可以使用 lvs 或者 vgs 命令的 -P 参数显示那些没有出现在输出结果中的失败卷的信息。该参数甚至允许一些内部元数据不完全统一时的操作。例如:如果组成卷组 vg 的某个设备失败,vgs 命令可能会显示以下输出信息。
# vgs -o +devices
Volume group "vg" not found
如果已为 vgs 指定了 -P 选项,那么该卷组虽仍然不可用,但可以看到更多有关失败设备的信息。
# vgs -P -o +devices
Partial mode. Incomplete volume groups will be activated read-only.
VG #PV #LV #SN Attr VSize VFree Devices
vg 9 2 0 rz-pn- 2.11T 2.07T unknown device(0)
vg 9 2 0 rz-pn- 2.11T 2.07T unknown device(5120),/dev/sda1(0)
在这个示例中,失败的设备导致卷组中的线性和条带逻辑卷均失败。不带 -P 选项的 lvs 命令会显示以下输出结果。
# lvs -a -o +devices
Volume group "vg" not found
使用 -P 选项显示失败的逻辑卷。
# lvs -P -a -o +devices
Partial mode. Incomplete volume groups will be activated read-only.
LV VG Attr LSize Origin Snap% Move Log Copy% Devices
linear vg -wi-a- 20.00G unknown device(0)
stripe vg -wi-a- 20.00G unknown device(5120),/dev/sda1(0)
下面的例子显示在镜像逻辑卷的一个分支出错时,带 -P 选项的 pvs 和 lvs 命令的输出结果。
# vgs -a -o +devices -P
Partial mode. Incomplete volume groups will be activated read-only.
VG #PV #LV #SN Attr VSize VFree Devices
corey 4 4 0 rz-pnc 1.58T 1.34T my_mirror_mimage_0(0),my_mirror_mimage_1(0)
corey 4 4 0 rz-pnc 1.58T 1.34T /dev/sdd1(0)
corey 4 4 0 rz-pnc 1.58T 1.34T unknown device(0)
corey 4 4 0 rz-pnc 1.58T 1.34T /dev/sdb1(0)
# lvs -a -o +devices -P
Partial mode. Incomplete volume groups will be activated read-only.
LV VG Attr LSize Origin Snap% Move Log Copy% Devices
my_mirror corey mwi-a- 120.00G my_mirror_mlog 1.95 my_mirror_mimage_0(0),my_mirror_mimage_1(0)
[my_mirror_mimage_0] corey iwi-ao 120.00G unknown device(0)
[my_mirror_mimage_1] corey iwi-ao 120.00G /dev/sdb1(0)
[my_mirror_mlog] corey lwi-ao 4.00M /dev/sdd1(0)
本小节提供一个恢复示例,即从由于物理卷底层设备宕机,同时将 mirror_log_fault_policy 参数设定为 remove,从而造成 LVM 镜像卷的一支失败,需要手动恢复的情况。有关设定 mirror_log_fault_policy 参数的详情,请查看 第 6.3 节 “恢复 LVM 镜像错误”。
当一个镜像分支失败时,LVM 将镜像卷转换成线性卷,此时可和以前一样继续操作但没有镜像冗余。此时可以在系统中添加新磁盘来替换物理设备,并重建该镜像。
以下命令创建将作为镜像使用的物理卷。
# pvcreate /dev/sd[abcdefgh][12]
Physical volume "/dev/sda1" successfully created
Physical volume "/dev/sda2" successfully created
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
Physical volume "/dev/sdc1" successfully created
Physical volume "/dev/sdc2" successfully created
Physical volume "/dev/sdd1" successfully created
Physical volume "/dev/sdd2" successfully created
Physical volume "/dev/sde1" successfully created
Physical volume "/dev/sde2" successfully created
Physical volume "/dev/sdf1" successfully created
Physical volume "/dev/sdf2" successfully created
Physical volume "/dev/sdg1" successfully created
Physical volume "/dev/sdg2" successfully created
Physical volume "/dev/sdh1" successfully created
Physical volume "/dev/sdh2" successfully created
以下命令创建卷组 vg 和镜像卷 groupfs。
# vgcreate vg /dev/sd[abcdefgh][12]
Volume group "vg" successfully created
[root@link-08 ~]# lvcreate -L 750M -n groupfs -m 1 vg /dev/sda1 /dev/sdb1 /dev/sdc1
Rounding up size to full physical extent 752.00 MB
Logical volume "groupfs" created
可以使用 lvs 命令验证作为镜像分支的镜像卷及底层设备布局,以及镜像日志。请注意:在第一个示例中,镜像还没有被完全同步。应该在 Copy% 字段显示 100.00 之后才继续操作。
# lvs -a -o +devices
LV VG Attr LSize Origin Snap% Move Log Copy% Devices
groupfs vg mwi-a- 752.00M groupfs_mlog 21.28 groupfs_mimage_0(0),groupfs_mimage_1(0)
[groupfs_mimage_0] vg iwi-ao 752.00M /dev/sda1(0)
[groupfs_mimage_1] vg iwi-ao 752.00M /dev/sdb1(0)
[groupfs_mlog] vg lwi-ao 4.00M /dev/sdc1(0)
[root@link-08 ~]# lvs -a -o +devices
LV VG Attr LSize Origin Snap% Move Log Copy% Devices
groupfs vg mwi-a- 752.00M groupfs_mlog 100.00 groupfs_mimage_0(0),groupfs_mimage_1(0)
[groupfs_mimage_0] vg iwi-ao 752.00M /dev/sda1(0)
[groupfs_mimage_1] vg iwi-ao 752.00M /dev/sdb1(0)
[groupfs_mlog] vg lwi-ao 4.00M i /dev/sdc1(0)
在这个示例中,镜像 /dev/sda1 的主要分支失败。任何镜像卷的写入操作都会让 LVM 探测失败的镜像。出现这种情况后,LVM 会将镜像转换成单一线性卷。在这个示例中是因为执行了 dd 命令。
# dd if=/dev/zero of=/dev/vg/groupfs count=10
10+0 records in
10+0 records out
可以使用 lvs 命令确定该设备现在已经是线性设备了。因为是失败的磁盘,所以会发生 I/O 错误。
# lvs -a -o +devices
/dev/sda1: read failed after 0 of 2048 at 0: Input/output error
/dev/sda2: read failed after 0 of 2048 at 0: Input/output error
LV VG Attr LSize Origin Snap% Move Log Copy% Devices
groupfs vg -wi-a- 752.00M /dev/sdb1(0)
此时应该仍然可以使用逻辑卷,但没有镜像冗余。
要重建镜像卷,则需要替换坏的驱动器,并重新创建该物理卷。如果使用同一个磁盘而不是换一个新磁盘,则在运行 pvcreate 命令时将看到“inconsistent”的警告提示。执行 vgreduce --removemissing 命令即可避免出现该警告。
# pvcreate /dev/sdi[12]
Physical volume "/dev/sdi1" successfully created
Physical volume "/dev/sdi2" successfully created
[root@link-08 ~]# pvscan
PV /dev/sdb1 VG vg lvm2 [67.83 GB / 67.10 GB free]
PV /dev/sdb2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdc1 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdc2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdd1 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdd2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sde1 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sde2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdf1 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdf2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdg1 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdg2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdh1 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdh2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdi1 lvm2 [603.94 GB]
PV /dev/sdi2 lvm2 [603.94 GB]
Total: 16 [2.11 TB] / in use: 14 [949.65 GB] / in no VG: 2 [1.18 TB]
下面可以使用新的物理卷扩展原来的卷组。
# vgextend vg /dev/sdi[12]
Volume group "vg" successfully extended
# pvscan
PV /dev/sdb1 VG vg lvm2 [67.83 GB / 67.10 GB free]
PV /dev/sdb2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdc1 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdc2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdd1 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdd2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sde1 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sde2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdf1 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdf2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdg1 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdg2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdh1 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdh2 VG vg lvm2 [67.83 GB / 67.83 GB free]
PV /dev/sdi1 VG vg lvm2 [603.93 GB / 603.93 GB free]
PV /dev/sdi2 VG vg lvm2 [603.93 GB / 603.93 GB free]
Total: 16 [2.11 TB] / in use: 16 [2.11 TB] / in no VG: 0 [0 ]
将线性卷转换回其原始镜像状态。
# lvconvert -m 1 /dev/vg/groupfs /dev/sdi1 /dev/sdb1 /dev/sdc1
Logical volume mirror converted.
可以使用 lvs 命令验证已恢复到镜像状态。
# lvs -a -o +devices
LV VG Attr LSize Origin Snap% Move Log Copy% Devices
groupfs vg mwi-a- 752.00M groupfs_mlog 68.62 groupfs_mimage_0(0),groupfs_mimage_1(0)
[groupfs_mimage_0] vg iwi-ao 752.00M /dev/sdb1(0)
[groupfs_mimage_1] vg iwi-ao 752.00M /dev/sdi1(0)
[groupfs_mlog] vg lwi-ao 4.00M /dev/sdc1(0)
如果不小心覆盖或者破坏了卷组物理卷元数据区域,则会看到出错信息显示元数据区域不正确,或者系统无法使用特定的 UUID 找到物理卷。此时可能需要通过在物理卷的元数据区域写入新的元数据来恢复物理卷数据,指定相同的 UUID 作为丢失的元数据。
警告
在正常的 LVM 逻辑卷中应该不会进行这个操作过程。如果指定了不正确的 UUID,则会丢失您的数据。
下面的例子显示排序的输出结果,可以看到您的元数据是丢了还是被破坏了。
# lvs -a -o +devices
Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
Couldn't find all physical volumes for volume group VG.
Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
Couldn't find all physical volumes for volume group VG.
...
通过查看 /etc/lvm/archive 目录,应该可以找到被覆盖的物理卷 UUID。在文件 VolumeGroupName_xxxx.vg 中查找该卷组最后的有效归档 LVM 元数据。
另外,还可以找到失活的卷并设定 partial (-P)选项,这样就可以找到丢失的被破坏的物理卷的 UUID。
# vgchange -an --partial
Partial mode. Incomplete volume groups will be activated read-only.
Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
...
使用 pvcreate 的 --uuid 和 --restorefile 选项恢复物理卷。下面的例子使用上述 UUID FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk 将 /dev/sdh1 设备标记为物理卷。这个命令使用 VG_00050.vg 中的元数据信息,即使用该卷组最新的好归档元数据恢复物理卷标签。restorefile 参数让 pvcreate 生成与卷组中旧的物理卷兼容的新物理卷,确保新的元数据不会被放在包含旧的物理卷元数据的区域(这有可能发生。例如:如果原始 pvcreate 命令使用了控制元数据放置位置的命令行参数,或者使用了应用不同默认选项的软件版本创建物理卷时,就会发生这种情况)。pvcreate 命令仅覆盖 LVM 元数据区域,不会影响现有的数据区域。
# pvcreate --uuid "FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk" --restorefile /etc/lvm/archive/VG_00050.vg /dev/sdh1
Physical volume "/dev/sdh1" successfully created
然后就可以使用 vgcfgrestore 命令恢复卷组的元数据。
# vgcfgrestore VG
Restored volume group VG
现在可以显示逻辑卷。
# lvs -a -o +devices
LV VG Attr LSize Origin Snap% Move Log Copy% Devices
stripe VG -wi--- 300.00G /dev/sdh1 (0),/dev/sda1(0)
stripe VG -wi--- 300.00G /dev/sdh1 (34728),/dev/sdb1(0)
下面的命令激活卷并显示激活的卷。
# lvchange -ay /dev/VG/stripe
[root@link-07 backup]# lvs -a -o +devices
LV VG Attr LSize Origin Snap% Move Log Copy% Devices
stripe VG -wi-a- 300.00G /dev/sdh1 (0),/dev/sda1(0)
stripe VG -wi-a- 300.00G /dev/sdh1 (34728),/dev/sdb1(0)
如果磁盘中的 LVM 元数据至少使用了覆盖其数据的空间大小,这个命令可以恢复物理卷。如果覆盖元数据的数据超过了元数据区域,那么就有可能损害到卷中的数据。此时可以使用 fsck 命令修复那些数据。
如果物理卷失败或者需要替换,则可以标记一个新的物理卷来替换那个已经在现有卷组中丢失的物理卷,过程与修复物理卷元数据相同,详见 第 6.4 节 “恢复物理卷元数据”。您可以使用 vgdisplay 命令的 --partial 和 --verbose 选项显示不再出现的物理卷的 UUID 和大小。如果想要使用同样大小的物理卷进行替换,则可以使用 pvcreate 命令,选项为 --restorefile 和 --uuid 初始化与丢失的物理卷有相同 UUID 的新设备。然后就可以使用 vgcfgrestore 命令恢复卷组的元数据。
如果丢失了物理卷,则可以用 vgchange 命令的 --partial 选项激活卷组中剩下的物理卷。可以使用 vgreduce 命令的 --removemissing 选项删除所有使用卷组中那些物理卷的逻辑卷。
建议运行 vgreduce 命令,使用 --test 选项确定要破坏的数据。
如果立即使用 vgcfgrestore 命令将卷组的元数据恢复到之前的状态,则与大多数 LVM 操作一样,vgreduce 命令在某种意义上是可逆的。例如:如果使用 vgreduce 命令的 --removemissing 参数,而不带 --test 参数,就可以找到要保留的已删除逻辑卷。此时仍可用替换物理卷,并使用另一个 vgcfgrestore 命令将卷组返回到之前的状态。
虽然根据 vgdisplay 或者 vgs 命令的输出结果,您认为有足够的扩展,但此时如果创建逻辑卷,则可能得到这样的出错信息“Insufficient free extents(没有足够的可用扩展)”。这是因为这些命令采用十进制处理数字以便提供可读的输出结果。要指定确切的大小,请使用可用物理扩展计数,而不是用字节来计算逻辑卷的大小。
在默认情况下,vgdisplay 命令的输出结果提示可用物理扩展的行。
# vgdisplay
--- Volume group ---
...
Free PE / Size 8780 / 34.30 GB
另外还可以使用 vgs 的 vg_free_count 和 vg_extent_count 参数显示可用扩展和扩展的总数。
# vgs -o +vg_free_count,vg_extent_count
VG #PV #LV #SN Attr VSize VFree Free #Ext
testvg 2 0 0 wz--n- 34.30G 34.30G 8780 8780
有 8780 个可用物理扩展,现在可以运行以下命令,使用小写 l 选项使用扩展而不是字节作为单位:
# lvcreate -l 8780 -n testlv testvg
这样就会使用卷组中的所有可用扩展。
# vgs -o +vg_free_count,vg_extent_count
VG #PV #LV #SN Attr VSize VFree Free #Ext
testvg 2 1 0 wz--n- 34.30G 0 0 8780
另外还可用通过使用 lvcreate 命令的 -l 参数,使用卷组中一定比例的剩余可用空间扩大逻辑卷。详情请参考 第 4.4.1 节 “创建线性逻辑卷”。