问题描述:
故障卷组原来是由5个10T的PV(sdc-sdg)组成,由于卷组里的LV容量不足需要进行扩容,于是使用另外5块磁盘(sdh-sdl)创建PV,在将PV加入卷组时发生错误,新加的PV状态为”MISSING“状态。使用”vgreduce --removemissing VG --force“命令将新加的PV从VG中移除,结果导致VG上的LV被删除,VG不可使用。
恢复过程:
1. 检查现状
查看现有PV和VG的状态,发现其中1个PV(/dev/sdc)已经不在VG中(可能是使用vgreduce --removemissing命令时将些PV从VG中移除了出去),VG目前只包含4个PV和0个LV,如下所示:
注:出现问题后,现场人员给sdc创建了GPT的分区表,正常情况下不需要给PV创建分区表(出现故障时需要保持冷静,不要乱操作,特别是涉及到数据的安全时,千万不能随意操作)。
2.找出备份配置文件
使用”vgcfgrestore --list VG“列出VG的备份配置文件(最近的一份配置存放在/etc/lvm/backup目录下,/etc/lvm/archive目录下保存着历史的备份配置)。
3.恢复PV
在备份的配置文件中找到sdc对应的PVID信息:
执行“pvcreate --test -uuid ‘磁盘的UUID’ --restorefile ‘VG备份配置文件’ /dev/sdc”命令,使用原来的UUID信息测试恢复PV时报出错误:“Couldn’t find device with uuid”和“Device /dev/sdc excluded by a filter.”。
如前所述,正常情况下PV都不需要创建分区表,由于现场人员在前面为sdc创建了gpt类型的分区表,于是利用parted重新创建了msdos类型的分区表(可以利用wipefs删除分区表,但是担心数据安全,没有这么做)。
重新执行恢复PV的命令,命令提示删除分区表标记,删除标记后PV恢复成功。
4.恢复VG
在恢复PV后,测试恢复VG,报出错误:“Cannot restore volume group VG with 1 PVS marked as missing”,而且此时pvs和vgs等LVM命令的输出全部为空。
对系统进行重启,重启后发现磁盘由原来的sdc-sdg变成了sdh-sdl,而扩容新增加的磁盘则从sdh-sdl变成了sdc-sdg,因此此次故障很大可能是系统出错导致新扩容的磁盘名称与原有的磁盘名称冲突引起。
重启前输出:
重启后输出:
编辑VG的备份配置文件,将VG下5个PV的device名称更改为新的磁盘名称sdh-sdl,同时将VG中原来缺失的PV sdc的flags选项里的”MISSING“删除(在执行最后一次自动备份前sdc名称发生了冲突导致在备份的配置文件中PV sdc被设置为unknown和MISSING)。
利用更改后的配置文件测试恢复,没有报错输出,于是去掉test选项正式恢复VG的配置,完成后激活卷组,检查数据的完整性。
参考文档:
5 easy steps to recover LVM2 partition, PV, VG, LVM metdata in Linux