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