记一次磁盘扩容失败并恢复

邮差的信 提交于 2020-01-28 08:13:11

扩容前:
在这里插入图片描述
在这里插入图片描述

然后准备给home扩容:
扩容前先备份一下:
分两步:
1.备份VG,这个是系统会自动备份的,文件在/etc/lvm/archive/目录下
2.备份superblock
superblock记录了磁盘的格式、已经使用大小等等信息

dd if=/dev/mapper/centos-home of=./backup_before_add bs=4096 count=1

扩容

添加新硬盘后:
在这里插入图片描述
fdisk /dev/sda
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

扩容完成 增加了500M

模拟错误

我遇到的错误是新添加的硬盘离线了,我模拟下把新加入的sdb磁盘删除,重启后显示如下错误:
Warning: Device for PV uuid not found or rejected by a filter
在这里插入图片描述
来分析下原因:
本来名叫centos的vg是有sda2和sdb1共同组成的,共计4.5G,现在sdb磁盘找不到了,sdb1也就找不到了。
通过vi打开/etc/lvm/arichive/下最新的.vg文件可以印证这一点:
在这里插入图片描述

正确处理 Device for PV uuid not found的姿势

先说正确的处理方式:
1.先备份vg和superblock,vg系统自动备份了,superblock的备份还是通过dd命令
dd if=/dev/mapper/centos-home of=./backup_after_add bs=4096 count=1

2.关机,插入之前丢失的硬盘,重新开机
3.如果新硬盘丢失了或数据损坏了也不用担心,因为新硬盘上还没存数据呢,只需要重新格式化新硬盘好了:
a. fdisk /dev/sdb 和上面fdisk一样的参数
b. vg需要指定参数:
pvcreate --uuid 0Zy8yU-58II-TKr2-FSV7-c1tO-Tay4-revC3p --norestore-file /dev/sdb1
其中0Zy8yU-58II-TKr2-FSV7-c1tO-Tay4-revC3p是上文提示miss的uuid
c. pvscan
d. lvchange -ay centos # centos是我的vg名字
e.如果正常,你又可以正常挂载磁盘了

再说我的错误操作及恢复方法

我轻信了网上的文章,执行了:vgreduce --removemissing --force centos
然后变成了这样:
在这里插入图片描述
lvs已经没有了

尝试从备份恢复vg:
先尝试恢复到执行removemissing前的
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200120183251758.png在这里插入图片描述恢复失败,这时应该是用上面pvcreate --uuid 创建好丢失的pv再恢复。

而我当时脑子一热,恢复到了原始的添加硬盘前到pv状态,初看起来一切正常了:
在这里插入图片描述
但是但是,mount出错,提示:
mount: can’t read superblock

什么是superblock呢?简单说就是描述这个分区信息的,比如磁盘大小,是使用的ext4还是xfs分区格式等等。

尝试修复,由于我的分区是xfs格式的,执行xfs_repair,报错
在这里插入图片描述
修复失败,被这个问题困扰很久后,我研究了下xfs的文件系统格式,发现superblock是分散在多个地方的,他有一个ag的概念,简单理解就是把一个大分区等分成N个ag,每个ag独立,superblock在每个ag的开头,添加磁盘空间会增加ag,上面这个错误就是新加的ag在新磁盘上,而现在新磁盘丢失了,导致读取不到第4个ag的superblock信息。

到目前都还不用担心数据丢失,因为ag是独立的,而且我们没有做删除操作,仅仅是superblock里记录扩容了,而实际没扩容而已,可以证明下superblock是不是存在的:
在这里插入图片描述
使用sb 0读取第0个superblock,是正常的,而且读出agcount是5,默认应该是4,说明superblock已经是扩容后的了。
可以使用dd dump下现在的superblock,跟扩容前的比较下:
在这里插入图片描述
偏移说明:
8-15 Total blocks in file system
88-91 Number of AGs
144-151 Number of free blocks
224-227 CRC32 checksum for superblock
248-263 UUID used if INCOMPAT_META_UUID feature
可以看到主要改了ag数目、总空间大小、剩余空间大小。
我想大部分人是没有扩容前的superblock的备份的,包括我自己。

到了现在,正确的恢复姿势应该还是上面说的添加硬盘:
1.先用上面正确处理的方式来fdisk一块新硬盘,pvcreate创建好
2.pvcreate --uuid 0Zy8yU-58II-TKr2-FSV7-c1tO-Tay4-revC3p --norestore-file /dev/sdb1
3.vgcfgestore恢复到扩容后的状态

恢复的思路是把丢失的磁盘再加回去,让lv能重新找到,而我遇到的情况比较特别,我手上没有空余的磁盘了,之前添加的磁盘已经被我用来备份数据了。

下面介绍的方法是我研究xfs的superblock后手动修复superblock的方法

手动修改superblock到扩容前

前面说过,扩容前后改了superblock中的以下内容:
8-15 Total blocks in file system
88-91 Number of AGs
144-151 Number of free blocks
224-227 CRC32 checksum for superblock
248-263 UUID used if INCOMPAT_META_UUID feature

那我只要把这些内容恢复到修改前就可以了,看起来应该是可行的:
唯一的难点是如何找到修改前的数据
Total blocks in file system = extent_count*1024,extent_count可以在/etc/lvm/archive/下备份的vg文件中找到
在这里插入图片描述
Number of free blocks 这个值我一直没找到找回的方法,可以暂时不修改
crc是需要重新计算的,最后我写了段代码来修改:
方法是先备份

dd if=/dev/mapper/centos-home of=./backup_ag5 bs=4096 count=1

然后用附件代码修改backup_ag5文件,生成backup_ag5_ag4,再导入到分区:

dd of=/dev/mapper/centos-home if=./backup_ag5_ag4 bs=4096 count=1

导入完成后执行xfs_db /dev/mapper/centos-home,不报错了, mount -o ro /dev/mapper/centos-home /home/也正常了,文件也能看到了
唯一的小问题是剩余大小有问题,因为上面我们没修正剩余块数
在这里插入图片描述
而且不能xfs_repaire, 否则又会修复为5个ag。。但数据已经恢复了,赶紧备份出来吧

参考文献:
https://righteousit.wordpress.com/2018/05/21/xfs-part-1-superblock/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!