记一次磁盘扩容失败并恢复
擴容前:
然后準備給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是需要重新計算的,最后我寫了段代碼來修改:
方法是先備份
然后用附件代碼修改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/
總結
以上是生活随笔為你收集整理的记一次磁盘扩容失败并恢复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: harmonyos源码下载,1.7.Op
- 下一篇: python plt.subplot_P