某客戶的一台PC服務器連接了一台HP EVA 的FC SAN存儲,划了一個6T的LUN分作一個單獨的VG使用,在某一次異常掉電之后,發現該VG完全丟失,使用vgs/pvs/lvs命令均無法找到此VG及PV、LV,但在/dev下能看到SAN存儲的兩條路徑/dev/sdc和/dev/sdb以及聚合出來的多路徑盤/dev/mpathc。
由於LVM VG已經丟失,數據自然是暫時不可用的,從存儲管理端看到存儲並無任何報錯,於是懷疑是由於系統層面引發的該故障。由於LUN比較大,數據有近6T的大小,考慮到簡單的一次異常關機應該不至於會導致數據全部丟失,考慮到可能是由於存儲在PV上的VG元數據丟失造成的。后面從/etc/lvm/backup下面的vg信息備份文件里面找到了PV的UUID,再使用指定原PV UUID及restorefile的方式重新pvcreate,再執行vgcfgrestore,成功找到數據,驗證了以上的猜測。需要說明的是,類似這種對於VG/PV的底層操作,都可能會造成數據的永久丟失,除非是到萬不得已的情況下,否則一定不要輕易在生產環境嘗試此類危險操作。
下面就來模擬一下故障修復的全過程,模擬方法及環境是,使用虛擬機運行SLES 11,添加一塊2GB大小的虛擬硬盤,將該虛擬硬盤創建為單獨的VG,划分LV之后,格式化LV並掛載,在該LV上寫入一些測試文件。再卸載LV,卸載VG,使用pvremove強制把該虛擬硬盤PV的uuid清除掉,並再次pvcreate該虛擬硬盤以重新分配一個PV UUID,最后再從自動備份的/etc/lvm/backup/下面的文件恢復到原來PV UUID進而恢復原來的所有VG信息。
開始操作之前原有的VG/PV/LV信息
接下來將新加入的2GB大小的虛擬硬盤創建成PV/VG,並划分一個500M的LV,格式化成EXT3。
Sles11 # pvcreate /dev/sdb
Sles11 # vgcreate datavg /dev/sdb
Sles11 # lvcreate datavg –n lv01 –L 500M
// 創建一個500M大小名稱為lv01的LV
Sles11 # mkfs.ext3 /dev/mapper/datavg-lv01
// 格式化為ext3
上面的操作完成之后,再看一下當前的VG/PV/LV信息。
現在把該LV掛載起來,往里面寫入一兩個文件,並記錄下來這些文件的大小(以便后面驗證恢復回來的VG是否會丟失數據)。
接下面開始模擬把該PV的UUID重建。
Sles11 # pvdisplay /dev/sdb
// 查看當前的PV UUID,記錄下面備用
Sles11 # umount /dev/mapper/datavg-lv01
// umount該LV以卸載VG
Sles11 # vgchange –an datavg
// 關閉該VG
Sles11 # pvremove –ff /dev/sdb
// 清除掉該PV的LVM標簽,讓它不再是PV,即抹掉PV UUID
此時,環境全部模擬完成,再次執行vgs&&pvs&&lvs已經完全看不到datavg和/dev/sdb的任何信息。現在整個系統的狀態就跟開始提到的客戶發生的故障完全一致。為了把故障搞得再大再狠一點,我們重新把/dev/sdb手動執行一次pvcreate,重新分配一個新的UUID給它。
注意看到現在的/dev/sdb的PV UUID已經跟之前的UUID完全不一樣了,現在我們就來恢復原來的VG信息及所有的文件信息。
在開始之前,需要提一下,Linux的LVM會默認存儲用戶對PV/VG/LV的每一步操作,並自動把當前的VG的信息備份到一個文件里面,位置是/etc/lvm/backup/VG名。這個文件里面記錄的東西大概跟vgdisplay/pvdisplay/lvdisplay輸出的信息一致,里面也包括了對於恢復VG信息至關重要的PV UUID。這個文件記錄的信息大概就相當於整個VG的元數據,這個文件非常重要,我們就是通過這個文件來恢復整個VG的信息的,下面是這個文件的不完整截圖。
下面開始執行恢復。
Sles11 # pvcreate /dev/sdb -u X4xYDe-VSiw-Gzh3-Ih78-dC08-xBKF-tGWc5s --restorefile /etc/lvm/backup/datavg
// 使用原來的PV UUID來創建PV,並使用自動備份的文件來恢復信息
Sles11 # vgcfgrestore datavg
// 恢復datavg的vg信息
Sles11 # vgs && pvs && lvs
可以看到,執行完以上命令之后,PV及VG/LV都恢復回來了。現在來驗證一下文件是不是都還在。
Sles11 # vgchange –ay datavg
// 激活該vg
掛載上該LV之后,再查看里面的文件信息,發現跟之前的完全一樣,驗證成功。
通過該案例,可以了解到,Linux對於LVM的操作是提供了一些災難恢復的選項的,而通常情況下我們對PV/VG/LV的操作,除了格式化LV外,基本上都不會破壞實際存儲的數據,只是對LVM的元數據進行操作。而此例實質也就是恢復了LVM的元數據而已。
最后再次提醒,在生產環境上執行此類VG的底層命令一定要謹慎再謹慎,畢竟數據無價,要養成經常備份數據的習慣。

