天天看點

Linux存儲入門:簡易資料恢複方案--分區和LVM實戰資料恢複有沒有簡易方案?預先準備資料恢複的原理和流程症狀和初步排查初次恢複嘗試問題出在哪裡?資料恢複結語參考

我們要用到以下工具

工具

功能

示例

<a href="http://man7.org/linux/man-pages/man1/bc.1p.html">bc</a>

電腦

<code>echo 'ibase=2^3;i=0107000;ibase=2^3+2;i/512' | bc -l</code>

<a href="http://man7.org/linux/man-pages/man1/dd.1.html">dd</a>

檢查或者拷貝磁盤/分區的内容,可以是幾個扇區,也可以是幾個位元組

<code>dd if=/dev/sdb bs=1 count=64 skip=64 2&gt;/dev/null | od -v -tx1</code>

<a href="http://man7.org/linux/man-pages/man1/grep.1.html">grep</a>

搜尋制定字元串

<a href="http://man7.org/linux/man-pages/man1/od.1.html">od</a>

把二進制内容以ascii或者16進制顯示出來,搭配dd使用可以代替二進制編輯器

<a href="http://man7.org/linux/man-pages/man1/strace.1.html">strace</a>

追蹤應用的執行路徑和對資料處理的流程

<code>strace ps</code>

obtaining data/擷取資料

crubbing data/清洗資料

exploring data/探索資料

modeling data/模組化資料

interpreting data/解釋資料

name

<a href="http://man7.org/linux/man-pages/man2/open.2.html">open</a>

打開一個檔案,傳回一個檔案描述符供後續讀寫操作使用

<a href="http://man7.org/linux/man-pages/man2/dup2.2.html">dup/dup2</a>

複制檔案描述符

<a href="http://man7.org/linux/man-pages/man2/lseek.2.html">lseek</a>

将讀寫指針移動到指定位置,後續操作從此指定位置讀寫

<a href="http://man7.org/linux/man-pages/man2/close.2.html">close</a>

關閉檔案描述符

<a href="http://man7.org/linux/man-pages/man2/read.2.html">read</a>

讀操作

我們以大家都熟悉的磁盤作為儲存設備的例子。

具體看看分區的資料結構。以fdisk為例,分區的資料結構定義為

我們看看具體分區的例子,驗證一下資料結構

Linux存儲入門:簡易資料恢複方案--分區和LVM實戰資料恢複有沒有簡易方案?預先準備資料恢複的原理和流程症狀和初步排查初次恢複嘗試問題出在哪裡?資料恢複結語參考

分區使得磁盤上的扇區有了差别。第一個扇區(其實其編号是0),因分區資料記錄其上而扮演特殊角色。明顯,對系統而言,管理和操作分區實際上就是讀寫第一扇區上的對應記錄而已。

系統在磁盤上建立的各個分層結構,都有類似分區結構的資料結構。以lvm結構為例,我們可以把磁盤記錄和lvm工具報告的資料做一對比。lvm資料的從第2個扇區開始,卷組資料在第8個扇區中,可以用dd指令提取相關扇區來驗證lvm的資料結構。

下面是一份完整的lvm中繼資料資訊,有興趣者可以逐一清點各個對象。

系統把磁盤的扇區分成兩種來支援分區:第一扇區和所有其他非第一扇區。并且在第一個扇區上記錄分區資訊,即中繼資料。而其他非第一扇區則供分區層使用,從磁盤的視角看,其他非第一扇區則是資料部分。我們逐層考察下磁盤、分區和lvm結構

Linux存儲入門:簡易資料恢複方案--分區和LVM實戰資料恢複有沒有簡易方案?預先準備資料恢複的原理和流程症狀和初步排查初次恢複嘗試問題出在哪裡?資料恢複結語參考

系統啟動時,會逐層讀取各層中繼資料,建立各層資料結構。如果某一層中繼資料損壞或者丢失,那麼系統就沒有辦法完成建立各層資料結構的任務。這種情況下,從客戶角度看,很可能就是資料損壞了。比如,如果你把第一個扇區用\0覆寫一遍,那麼系統就識别不到分區内容了。當然這種情況下分區層以上的内容,比如實體卷資訊,系統也無法處理了。是以,對于資料恢複任務而言,如果中繼資料損壞,則修複中繼資料總是必須的,而且往往是第一步。

當然,如果資料損壞了,即使中繼資料完好無缺,那麼資料也是損壞了。比如,你誤删了一個檔案,那麼,分區結構再完好對于檔案被删也于事無補。

基于以上分析,我們可以把資料損壞簡單分三類類:中繼資料損壞、資料損壞或者前面兩種損壞類型的混合型損壞。

Linux存儲入門:簡易資料恢複方案--分區和LVM實戰資料恢複有沒有簡易方案?預先準備資料恢複的原理和流程症狀和初步排查初次恢複嘗試問題出在哪裡?資料恢複結語參考

如果有資料損壞,那麼除非有日志、備份,或者資料本身有邏輯可供使用,否則資料是不能恢複了。比如,通常的檔案删除操作,系統隻是解除了檔案名稱和檔案内容相關間的聯系而已。檔案本身的内容還是記錄再磁盤上。這種情況下,隻要重建檔案名稱和檔案内容間的聯系即可恢複檔案。

相對而言,簡單情形的是中繼資料損壞。如果隻是中繼資料損壞,而且我們知道正确的中繼資料。因為中繼資料操作,不會觸及資料部分,是以,我們隻要重建中繼資料部分即可恢複資料。如果涉及到多層,則逐層恢複即可。以分區丢失為例。

比如我們有一塊資料盤,整盤我們隻是用fdisk分了一個區,現在分區丢失了。這種情形下,隻要用fdsik,按照預設情形,重新分區就能恢複分區。

就這種情形,我們給出一個可用的分析流程。

Linux存儲入門:簡易資料恢複方案--分區和LVM實戰資料恢複有沒有簡易方案?預先準備資料恢複的原理和流程症狀和初步排查初次恢複嘗試問題出在哪裡?資料恢複結語參考

客戶回報

降配重新開機後,系統無法啟動

分區資料如下

首先确定分區上是否有資料,通過檢視一些扇區,我們就會有很大的機率确認這一點。當然也可以逐扇區确認。

逐扇區确認,可以用如下指令辦理。假設磁盤是/dev/vdb。

當然,也可以通過抽樣檢查來确認。這種方法通常是檢查磁盤分區的前面一部分扇區。比如,下面的例子,通過檢查前面幾十個扇區,我們可以确認磁盤上确有資料。

分區還在,但是lvm結構丢失,經檢查,由lvm工具鍊維護的備份資料/etc/lvm/backup/vg_xxxxxx檔案還在。是以,這種情形下,按照我們的恢複流程,隻要在分區之上,嘗試重建lvm和檔案系統,應該就可以解決問題。

看樣子,分區的資料有些地方出錯了。根據上面指令報錯的資訊,對比lvm的備份資料和分區資料,很快我們就發現了問題。現有分區記錄的其擁有的扇區數目,少于其上lvm卷組記錄的扇區數量。

Linux存儲入門:簡易資料恢複方案--分區和LVM實戰資料恢複有沒有簡易方案?預先準備資料恢複的原理和流程症狀和初步排查初次恢複嘗試問題出在哪裡?資料恢複結語參考

因為種種原因,我們不能确認分區資訊和lvm備份資料為何不一緻。但是,我們可以進一步從磁盤上提取、分析資料。因為有關分區的中繼資料在(分區在),是以我們進一步檢查磁盤上還有沒有有關lvm的中繼資料?這隻要使用下面的指令行

結果及其結果分析如下

Linux存儲入門:簡易資料恢複方案--分區和LVM實戰資料恢複有沒有簡易方案?預先準備資料恢複的原理和流程症狀和初步排查初次恢複嘗試問題出在哪裡?資料恢複結語參考

是以,磁盤上還有有關lvm的中繼資料,但是為什麼系統沒有憑借這些資料建構出lvm結構呢?我們建立一個測試環境,用strace追蹤下系統處理lvm實體卷中繼資料的執行路徑。如下指令即可

當然,更好的辦法是把strace記錄放置到檔案中,以備仔細檢查

我們組合使用strace和grep指令來确認系統預設的lvm實體卷位置。如果你沒有耐心分析下面的資料,請跳過直接看後面的截圖

資料清洗結果如下。如果沒有耐心分析,請跳過直接看下面的分析截圖

Linux存儲入門:簡易資料恢複方案--分區和LVM實戰資料恢複有沒有簡易方案?預先準備資料恢複的原理和流程症狀和初步排查初次恢複嘗試問題出在哪裡?資料恢複結語參考

很明顯,系統預期lvm中繼資料是在分區的第8個扇區,但是在需要做資料恢複的磁盤上,lvm的中繼資料卻是在第71個扇區,而分區的起始扇區是2048,是以,lvm資料根本不在分區内。這就是為什麼磁盤上還有lvm中繼資料,系統卻沒有識别出來lvm的原因。

既然系統是因為有關lvm的中繼資料所在扇區不對而導緻系統無法識别lvm結構,設想通過重新分區,我們把有關lvm中繼資料調整到分區的第8個扇區。稍加計算,就會發現,隻要把分區的起始扇區從第2048個扇區調整到第63個扇區即可。不僅如此,通過調整分區大小,我們同樣也解決了磁盤分區扇區數不足的問題

Linux存儲入門:簡易資料恢複方案--分區和LVM實戰資料恢複有沒有簡易方案?預先準備資料恢複的原理和流程症狀和初步排查初次恢複嘗試問題出在哪裡?資料恢複結語參考

調整過程是先删掉扇區,而後再建立之。而結果正如我們所預期的,分區調整完成,客戶的資料立刻恢複了。實體卷、卷組、邏輯卷、檔案系統以及資料,都完好無損。

除了易學、簡單、快捷、高效,中繼資料修複方案還有一個優點,就是可以確定不會破壞資料。這可能是這個方案的最大亮點。

本文提供連結,優先連結内容的嚴謹與可靠性,而非便利性。如連結無法通路,請按照文字自行檢索資料和圖書。

<a href="https://zh.wikipedia.org/wiki/%e6%95%b0%e6%8d%ae%e6%81%a2%e5%a4%8d%e8%bd%af%e4%bb%b6%e5%88%97%e8%a1%a8">資料恢複軟體清單</a>

<a href="https://zh.wikipedia.org/wiki/shred_">shred (unix)</a>

<a href="https://www.ibm.com/developerworks/cn/linux/1312_caoyq_linuxrestore/index.html">使用linux檔案恢複工具</a>

<a href="https://www.ibm.com/developerworks/cn/linux/l-cn-filesrc/index.html">如何恢複 linux 上删除的檔案,第 1 部分</a>

<a href="https://zh.wikipedia.org/wiki/%e7%a1%ac%e7%9b%98%e5%88%86%e5%8c%ba">硬碟分區</a>

<a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/logical_volume_manager_administration/index.html">rhel 6 logical volume manager administration</a>

<a href="https://www.ibm.com/developerworks/cn/linux/l-linux-filesystem/index.html">linux 檔案系統剖析</a>

<a href="http://man7.org/linux/man-pages/">linux man pages online</a>

<a href="https://zh.wikipedia.org/wiki/%e5%85%83%e6%95%b0%e6%8d%ae">中繼資料</a>

<a href="https://www.ibm.com/developerworks/cn/linux/l-cn-fsmeta/index.html">linux檔案系統中中繼資料的加鎖機制與組織方式</a>

繼續閱讀