IT工程師一般都知道如何操作和使用文件和目錄。但是,對于系統(tǒng)如何構(gòu)建出、抽象出文件和目錄,一般就不熟悉了。至于更下層的概念,可能大家知道最多的就是驅(qū)動了。所以,為了規(guī)避這點,可行的簡易方案之一,就是以黑箱方式使用testdisk等工具,在我們在對底層了解不多甚至一無所知的情況下,進行數(shù)據(jù)恢復(商業(yè)工具,恢復效果估計更好,當然商業(yè)工具的價格也更好)。但是,對于工程師而言,多數(shù)時候,僅僅以黑箱方式依賴某些工具進行數(shù)據(jù)恢復是不夠的。
數(shù)據(jù)恢復,經(jīng)常是突發(fā)事故響應中關(guān)鍵而又耗時的一步。多數(shù)情況下,工程師往往并非專司數(shù)據(jù)恢復,操作環(huán)境往往是生產(chǎn)環(huán)境,趁手工具難以部署,執(zhí)行操作要遵循種種約束,加之業(yè)務中斷的壓力。這種情形下,工程師很可能還需要推定數(shù)據(jù)恢復的結(jié)果/耗時等信息,提供數(shù)據(jù)供決策者使用。很明顯,如果你準備考驗一下自己的細致、耐心、知識和技能,數(shù)據(jù)恢復將是個不錯的課題。當然,有一點是明確的,只是以黑箱方式使用testdisk等工具進行數(shù)據(jù)恢復,解決以上問題是不可能的。那么,有沒有其他簡易方案呢?
這里,我們以一個實際的case為例,討論一下,在只使用UNIX常見工具(dd/grep/strace等)的情況下,如何簡單、快捷的恢復數(shù)據(jù)。
預先準備
工具
我們要用到以下工具
排查和診斷就是數(shù)據(jù)處理
如果對數(shù)據(jù)處理了解不多,請參考OSEMN
1. obtaining data/獲取數(shù)據(jù)
2. crubbing data/清洗數(shù)據(jù)
3. exploring data/探索數(shù)據(jù)
4. modeling data/建模數(shù)據(jù)
5. interpreting data/解釋數(shù)據(jù)
測試環(huán)境
使用Virtualbox,基于CentOS/Fedora/debian/Ubuntu搭建Linux實驗環(huán)境。只需要學會strace工具和如下系統(tǒng)調(diào)用,就足以追蹤系統(tǒng)如何處理諸如LVM物理卷元數(shù)據(jù)這樣過的問題。
數(shù)據(jù)恢復的原理和流程
什么是元數(shù)據(jù)?
我們以大家都熟悉的磁盤作為存儲設(shè)備的例子。
現(xiàn)代操作系統(tǒng)都會在磁盤上建立多個分層結(jié)構(gòu)來管理和控制磁盤。比如,磁盤分區(qū),分區(qū)上建立物理卷,物理卷上建立卷組,卷組上建立邏輯卷,邏輯卷上建立文件系統(tǒng),就是這樣的一個例子。如果你不熟悉LVM,請參考Logical Volume Manager。
這些分層的結(jié)構(gòu)都是很類似的。以磁盤分區(qū)為例。所謂分區(qū),以大家最為熟悉的MBR: Master Boot Record結(jié)構(gòu)為例。其實是第一個扇區(qū)記錄了各個分區(qū)的起始扇區(qū),大小和類型。系統(tǒng)需要時,比如啟動過程中,系統(tǒng)只要從磁盤的第一個扇區(qū)讀取這些數(shù)據(jù)即能拿到各個分區(qū)的數(shù)據(jù)。
具體看看分區(qū)的數(shù)據(jù)結(jié)構(gòu)。以fdisk為例,分區(qū)的數(shù)據(jù)結(jié)構(gòu)定義為
我們看看具體分區(qū)的例子,驗證一下數(shù)據(jù)結(jié)構(gòu)
分區(qū)使得磁盤上的扇區(qū)有了差別。第一個扇區(qū)(其實其編號是0),因分區(qū)數(shù)據(jù)記錄其上而扮演特殊角色。明顯,對系統(tǒng)而言,管理和操作分區(qū)實際上就是讀寫第一扇區(qū)上的對應記錄而已。
類似分區(qū)信息這種系統(tǒng)用以管理某層資源的數(shù)據(jù)就是元數(shù)據(jù)。
系統(tǒng)在磁盤上建立的各個分層結(jié)構(gòu),都有類似分區(qū)結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)。以LVM結(jié)構(gòu)為例,我們可以把磁盤記錄和LVM工具報告的數(shù)據(jù)做一對比。LVM數(shù)據(jù)的從第2個扇區(qū)開始,卷組數(shù)據(jù)在第8個扇區(qū)中,可以用dd命令提取相關(guān)扇區(qū)來驗證LVM的數(shù)據(jù)結(jié)構(gòu)。
下面是一份完整的LVM元數(shù)據(jù)信息,有興趣者可以逐一清點各個對象。
元數(shù)據(jù)和數(shù)據(jù):數(shù)據(jù)損壞分類
系統(tǒng)把磁盤的扇區(qū)分成兩種來支持分區(qū):第一扇區(qū)和所有其他非第一扇區(qū)。并且在第一個扇區(qū)上記錄分區(qū)信息,即元數(shù)據(jù)。而其他非第一扇區(qū)則供分區(qū)層使用,從磁盤的視角看,其他非第一扇區(qū)則是數(shù)據(jù)部分。我們逐層考察下磁盤、分區(qū)和LVM結(jié)構(gòu)
系統(tǒng)啟動時,會逐層讀取各層元數(shù)據(jù),創(chuàng)建各層數(shù)據(jù)結(jié)構(gòu)。如果某一層元數(shù)據(jù)損壞或者丟失,那么系統(tǒng)就沒有辦法完成創(chuàng)建各層數(shù)據(jù)結(jié)構(gòu)的任務。這種情況下,從客戶角度看,很可能就是數(shù)據(jù)損壞了。比如,如果你把第一個扇區(qū)用0覆蓋一遍,那么系統(tǒng)就識別不到分區(qū)內(nèi)容了。當然這種情況下分區(qū)層以上的內(nèi)容,比如物理卷信息,系統(tǒng)也無法處理了。因此,對于數(shù)據(jù)恢復任務而言,如果元數(shù)據(jù)損壞,則修復元數(shù)據(jù)總是必須的,而且往往是第一步。
當然,如果數(shù)據(jù)損壞了,即使元數(shù)據(jù)完好無缺,那么數(shù)據(jù)也是損壞了。比如,你誤刪了一個文件,那么,分區(qū)結(jié)構(gòu)再完好對于文件被刪也于事無補。
基于以上分析,我們可以把數(shù)據(jù)損壞簡單分三類類:元數(shù)據(jù)損壞、數(shù)據(jù)損壞或者前面兩種損壞類型的混合型損壞。
元數(shù)據(jù)修復可以簡易處理
以基于磁盤的分區(qū)、LVM以及文件系統(tǒng)為例。分層結(jié)構(gòu)的數(shù)據(jù)格式都有嚴格的格式(比如分區(qū)的數(shù)據(jù)結(jié)構(gòu)就是一個C的struct),出現(xiàn)位置也固定(有關(guān)分區(qū)的元數(shù)據(jù)記錄在第一個扇區(qū)的446~462字節(jié)之間),而且這些數(shù)據(jù)結(jié)構(gòu)往往都帶有魔數(shù)(比如,分區(qū)的類型83),而且常用的分層結(jié)構(gòu),也不外乎分區(qū)、LVM以及文件系統(tǒng)等幾種。因此,對于元數(shù)據(jù)以及系統(tǒng)如何處理元數(shù)據(jù),我們都容易追蹤和檢查。因此,可以預期,修復元數(shù)據(jù),有簡易方案。
原理
如果有數(shù)據(jù)損壞,那么除非有日志、備份,或者數(shù)據(jù)本身有邏輯可供使用,否則數(shù)據(jù)是不能恢復了。比如,通常的文件刪除操作,系統(tǒng)只是解除了文件名稱和文件內(nèi)容相關(guān)間的聯(lián)系而已。文件本身的內(nèi)容還是記錄再磁盤上。這種情況下,只要重建文件名稱和文件內(nèi)容間的聯(lián)系即可恢復文件。
相對而言,簡單情形的是元數(shù)據(jù)損壞。如果只是元數(shù)據(jù)損壞,而且我們知道正確的元數(shù)據(jù)。因為元數(shù)據(jù)操作,不會觸及數(shù)據(jù)部分,因此,我們只要重建元數(shù)據(jù)部分即可恢復數(shù)據(jù)。如果涉及到多層,則逐層恢復即可。以分區(qū)丟失為例。
比如我們有一塊數(shù)據(jù)盤,整盤我們只是用fdisk分了一個區(qū),現(xiàn)在分區(qū)丟失了。這種情形下,只要用fdsik,按照默認情形,重新分區(qū)就能恢復分區(qū)。
就這種情形,我們給出一個可用的分析流程。
癥狀和初步排查
癥狀
客戶反饋
降配重啟后,系統(tǒng)無法啟動
排查發(fā)現(xiàn)客戶一邏輯卷無法掛載導致重啟失敗。在/etc/fstab中注釋掉邏輯卷的掛載配置,系統(tǒng)啟動成功。
但是客戶的邏輯卷上有重要數(shù)據(jù)。此邏輯卷在數(shù)據(jù)盤上,數(shù)據(jù)盤大小是2TB。此磁盤全部2TB全部分配給一個分區(qū),此分區(qū)上創(chuàng)建有LVM結(jié)構(gòu)。
分區(qū)數(shù)據(jù)如下
初步排查
首先確定分區(qū)上是否有數(shù)據(jù),通過查看一些扇區(qū),我們就會有很大的概率確認這一點。當然也可以逐扇區(qū)確認。
逐扇區(qū)確認,可以用如下命令辦理。假設(shè)磁盤是/dev/vdb。
當然,也可以通過抽樣檢查來確認。這種方法通常是檢查磁盤分區(qū)的前面一部分扇區(qū)。比如,下面的例子,通過檢查前面幾十個扇區(qū),我們可以確認磁盤上確有數(shù)據(jù)。
接下來使用testdisk工具恢復數(shù)據(jù)。嘗試數(shù)次,testdisk工具總是在掃描到2%時停滯,處理過程不能繼續(xù)。
初次恢復嘗試
分區(qū)還在,但是LVM結(jié)構(gòu)丟失,經(jīng)檢查,由LVM工具鏈維護的備份數(shù)據(jù)/etc/lvm/backup/vg_xxxxxx文件還在。因此,這種情形下,按照我們的恢復流程,只要在分區(qū)之上,嘗試重建LVM和文件系統(tǒng),應該就可以解決問題。
根據(jù)備份數(shù)據(jù)恢復LVM結(jié)構(gòu),可以參考Recovering Physical Volume Metadata。可惜的是,我們第一步就折戟沉沙了。
看樣子,分區(qū)的數(shù)據(jù)有些地方出錯了。根據(jù)上面命令報錯的信息,對比LVM的備份數(shù)據(jù)和分區(qū)數(shù)據(jù),很快我們就發(fā)現(xiàn)了問題?,F(xiàn)有分區(qū)記錄的其擁有的扇區(qū)數(shù)目,少于其上LVM卷組記錄的扇區(qū)數(shù)量。
問題出在哪里?
因為種種原因,我們不能確認分區(qū)信息和LVM備份數(shù)據(jù)為何不一致。但是,我們可以進一步從磁盤上提取、分析數(shù)據(jù)。因為有關(guān)分區(qū)的元數(shù)據(jù)在(分區(qū)在),所以我們進一步檢查磁盤上還有沒有有關(guān)LVM的元數(shù)據(jù)?這只要使用下面的命令行
結(jié)果及其結(jié)果分析如下
所以,磁盤上還有有關(guān)LVM的元數(shù)據(jù),但是為什么系統(tǒng)沒有憑借這些數(shù)據(jù)構(gòu)建出LVM結(jié)構(gòu)呢?我們創(chuàng)建一個測試環(huán)境,用strace追蹤下系統(tǒng)處理LVM物理卷元數(shù)據(jù)的執(zhí)行路徑。如下命令即可
當然,更好的辦法是把strace記錄放置到文件中,以備仔細檢查
我們組合使用strace和grep命令來確認系統(tǒng)默認的LVM物理卷位置。如果你沒有耐心分析下面的數(shù)據(jù),請?zhí)^直接看后面的截圖
數(shù)據(jù)清洗結(jié)果如下。如果沒有耐心分析,請?zhí)^直接看下面的分析截圖
很明顯,系統(tǒng)預期LVM元數(shù)據(jù)是在分區(qū)的第8個扇區(qū),但是在需要做數(shù)據(jù)恢復的磁盤上,LVM的元數(shù)據(jù)卻是在第71個扇區(qū),而分區(qū)的起始扇區(qū)是2048,因此,LVM數(shù)據(jù)根本不在分區(qū)內(nèi)。這就是為什么磁盤上還有LVM元數(shù)據(jù),系統(tǒng)卻沒有識別出來LVM的原因。
既然系統(tǒng)是因為有關(guān)LVM的元數(shù)據(jù)所在扇區(qū)不對而導致系統(tǒng)無法識別LVM結(jié)構(gòu),設(shè)想通過重新分區(qū),我們把有關(guān)LVM元數(shù)據(jù)調(diào)整到分區(qū)的第8個扇區(qū)。稍加計算,就會發(fā)現(xiàn),只要把分區(qū)的起始扇區(qū)從第2048個扇區(qū)調(diào)整到第63個扇區(qū)即可。不僅如此,通過調(diào)整分區(qū)大小,我們同樣也解決了磁盤分區(qū)扇區(qū)數(shù)不足的問題
數(shù)據(jù)恢復
較新的fdisk工具,不允許起始扇區(qū)小于2048,因此,我們用parted工具來調(diào)整分區(qū)的起始扇區(qū)。
調(diào)整過程是先刪掉扇區(qū),而后再創(chuàng)建之。而結(jié)果正如我們所預期的,分區(qū)調(diào)整完成,客戶的數(shù)據(jù)立刻恢復了。物理卷、卷組、邏輯卷、文件系統(tǒng)以及數(shù)據(jù),都完好無損。
結(jié)語
從處理這個實際case可以看出,如果知道如何識別各層元數(shù)據(jù),比如分區(qū),LVM和文件系統(tǒng);能夠追蹤系統(tǒng)處理各層元數(shù)據(jù)的邏輯,那么,組合使用UNIX常用的dd、od等工具,足以簡單有效的處理元數(shù)據(jù)損壞的情形,快速恢復數(shù)據(jù)。如果掌握了常見的系統(tǒng)調(diào)用,并且掌握了strace工具,那么對于如何識別元數(shù)據(jù)以及系統(tǒng)如何處理元數(shù)據(jù),完全可以通過簡單分析strace輸出拿到相應答案。
除了易學、簡單、快捷、高效,元數(shù)據(jù)修復方案還有一個優(yōu)點,就是可以確保不會破壞數(shù)據(jù)。這可能是這個方案的最大亮點。
評論