我有一个逻辑卷 (home64),它跨越多个驱动器,并使用 lvconvert 将其转换为 RAID1。
这很好,当驱动器出现故障时,它会继续运行。现在我正在尝试更换驱动器,但我似乎已经让它进入了某种状态。
我在新驱动器上创建了一个 PV,并使用 vgextend 将其添加到 VG 中。
我一直无法让 LV 使用额外的空间并“降级”它。
我尝试修复它,但似乎需要故障驱动器才能运行。 (不幸的是,我没有这些命令的输出)
# /dev/sda is the new disk.
sudo lvconvert --repair /dev/mapper/prole-home64 /dev/sda
(编辑)我重新运行命令。发生故障的驱动器为 8TB,我已将其替换为另一个 8TB 驱动器,并且其他卷上剩余一些额外空间,应覆盖“8TB”中的舍入错误。
当我开始实施后备计划(位于底部)时,此命令显示的空间更少。
sudo lvconvert --repair /dev/mapper/prole-home64
WARNING: Disabling lvmetad cache for repair command.
WARNING: Not using lvmetad because of repair.
Attempt to replace failed RAID images (requires full device resync)? [y/n]: y
Insufficient free space: 5240758 extents needed, but only 1560 available
Failed to replace faulty devices in prole/home64.
(/编辑)
我尝试更换故障驱动器,但不确定如何引用不存在的驱动器:
# Mc2wIK-... is the PV id as mentioned in /etc/lvm/backup/prole
sudo lvconvert --replace Mc2wIK-qrme-cjBN-LArd-S4je-x2p0-p7qke1 /dev/mapper/prole-home64 /dev/sda
# pv1 is the label of the group in /etc/lvm/backup/prole
sudo lvconvert --replace pv1 /dev/mapper/prole-home64 /dev/sda
这些似乎都没有任何效果。
lvconvert
确实建议我也许想尝试vgreduce --removemissing
所以我做了。由于活动卷而失败。由于驱动器已经出现故障,我强制删除:
sudo vgreduce --removemissing prole
sudo vgreduce --removemissing prole --force
然后我了解到lvchange --syncaction
。我在也受到驱动器故障影响的较小卷上运行它,发现问题并修复它们:
lvchange --syncaction check /dev/mapper/prole-root
# Monitor progress by repeatedly running this:
lvs -a -o name,raid_sync_action,sync_percent
# Get the result with this:
lvs -o name,raid_mismatch_count
# Actually repair the volume
lvchange --syncaction repair /dev/prole/root
这曾是成功的。
然而,当我尝试在大卷上执行此操作时,它会立即“完成”,而不会记录任何错误。
如果我尝试获取卷的运行状况:
sudo lvs -o name,lv_health_status
LV Health
home
home64 refresh needed
root
var
如果我尝试刷新音量:
sudo lvchange --refresh /dev/prole/home64
Failed to remove temporary SubLVs from prole/home64
这说明了一些问题:
sudo lvs -a -o name,segtype,devices
LV Type Devices
home linear /dev/sda(0)
home linear /dev/sde(0)
home linear /dev/sdb(1793)
home64 raid1 home64_rimage_0(0),home64_rimage_1(0)
[home64_rimage_0] error
[home64_rimage_1] linear /dev/sdg(1)
[home64_rimage_1] linear /dev/sdh(0)
[home64_rimage_1] linear /dev/sdf(3330)
[home64_rimage_1] linear /dev/sdf(1428550)
[home64_rimage_1] linear /dev/sdd(1335820)
[home64_rmeta_0] error
[home64_rmeta_1] linear /dev/sdg(0)
root raid1 root_rimage_0(0),root_rimage_1(0)
[root_rimage_0] linear /dev/sdd(1810605)
[root_rimage_1] linear /dev/sdf(1)
[root_rmeta_0] linear /dev/sdd(856646)
[root_rmeta_1] linear /dev/sdf(0)
var raid1 var_rimage_0(0),var_rimage_1(0)
[var_rimage_0] linear /dev/sdb(1)
[var_rimage_1] linear /dev/sdf(2050)
[var_rimage_1] linear /dev/sdf(949475)
[var_rmeta_0] linear /dev/sdb(0)
[var_rmeta_1] linear /dev/sdf(2049)
如何恢复卷的冗余?
(我的后备计划是创建另一个卷,将 home64 卷的内容复制到其中,删除 home64 卷,然后将新卷转换为 RAID1,但一定有更好的方法!)
答案1
pvmove
我意识到我可以通过调用要移动的 PV 和 2 来减少 home64 卷所分布的 PV,从而腾出更多可用空间。这个,再加上我可用的另外 6TB 空间,再加上替换磁盘上的 8TB 空间,给我留下了足够的空间来修复 LV lvchange --syncaction repair /dev/prole/home
。
现在看起来是这样的:
sudo lvs -a -o name,segtype,devices
WARNING: Not using lvmetad because a repair command was run.
LV Type Devices
home64 raid1 home64_rimage_0(0),home64_rimage_1(0)
[home64_rimage_0] linear /dev/sdf(1)
[home64_rimage_0] linear /dev/sda(0)
[home64_rimage_0] linear /dev/sdc2(0)
[home64_rimage_1] linear /dev/sdg(1)
[home64_rimage_1] linear /dev/sdi(0)
[home64_rimage_1] linear /dev/sdb(3842)
[home64_rimage_1] linear /dev/sdd(1335820)
[home64_rmeta_0] linear /dev/sdf(0)
[home64_rmeta_1] linear /dev/sdg(0)
root raid1 root_rimage_0(0),root_rimage_1(0)
[root_rimage_0] linear /dev/sdd(1810605)
[root_rimage_1] linear /dev/sdb(1)
[root_rmeta_0] linear /dev/sdd(856646)
[root_rmeta_1] linear /dev/sdb(0)
var raid1 var_rimage_0(0),var_rimage_1(0)
[var_rimage_0] linear /dev/sdd(0)
[var_rimage_1] linear /dev/sdb(2050)
[var_rmeta_0] linear /dev/sdd(1812653)
[var_rmeta_1] linear /dev/sdb(2049)
健康状况:
sudo lvs -o name,lv_health_status
WARNING: Not using lvmetad because a repair command was run.
LV Health
home64
root
var