從 RAID 和磁碟故障中恢復數據 (Linux)
一些背景
我的一個朋友在他的辦公室裡使用一個 NAS Buffalo-LS-WVL,有兩個 1TB 的磁碟。看起來這兩個磁碟是作為 raid 1 掛載的,但是,正如您將看到的那樣,它們可能沒有掛載。NAS出了一些極其慢的問題,然後突然就不行了。我被要求拯救他的數據。兩個磁碟具有完全相同的分區:一個物理分區和 6 個邏輯分區,並且在第 6 個數據中存在(0,95TB 中大約有 80GB)。
磁碟
/dev/sdd
似乎會出現硬體問題(執行緩慢、扇區讀取錯誤等),而 /dev/sde 是物理性能良好的磁碟。目標是提取 NAS 中包含的數據。如果不是所有數據,要提取的數據越多越好。這些數據對我這位朋友的公司至關重要。
我已經嘗試過的
- 第一次嘗試:單獨安裝磁碟
這是第一次嘗試,希望它有效,我嘗試獲取每個磁碟並單獨安裝它,我收到以下消息:
root@ubuntu:~# mount /dev/sdd6 /mnt/n -or- root@ubuntu:~# mount /dev/sde6 /mnt/n
兩者都給了我相同的資訊:
mount: unknown filesystem type 'linux_raid_member'
- 第二次嘗試:創建磁碟陣列 RAID 1 並嘗試掛載它們
好的,如果我不能單獨安裝它們,那麼我需要創建一個磁碟陣列。讓我們假設(最合乎邏輯的)原始配置是 raid 1,並且一次使用一個磁碟:
root@ubuntu:~# mdadm --create --run --level=1 --raid-devices=2 \ /dev/md/md-singolo-e6--create-missing /dev/sde6 missing
給出:
mdadm: /dev/sde6 appears to be part of a raid array: level=raid0 devices=2 ctime=Mon Sep 26 10:23:48 2011 mdadm: Note: this array has metadata at the start and may not be suitable as a boot device. If you plan to store '/boot' on this device please ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md/md-singolo-e6--create-missing started.
所以,原來的raid似乎是0模式而不是1模式。壞新,因為磁碟出現扇區問題。
無論如何,我嘗試掛載新創建的 RAID1 陣列(即使我知道這是沒有意義的):
root@ubuntu:~# mkdir /mnt/md-singolo-e6--create-missing root@ubuntu:~# mount /dev/md/md-singolo-e6--create-missing \ /mnt/md-singolo-a6--create-missing/
給了:
mount: /dev/md127: can't read superblock
對另一個磁碟給出了完全相同的結果。 3. 第三次嘗試:創建磁碟陣列RAID 0並嘗試掛載它們
好的,因為它已經聲明它是 Raid0,讓我們去吧:
root@ubuntu:~# mdadm --create --run --level=0 --raid-devices=2 \ /dev/md/md001hw /dev/sdd6 /dev/sde6
給出:
mdadm: /dev/sdd6 appears to be part of a raid array: level=raid1 devices=2 ctime=Mon Oct 14 16:38:33 2013 mdadm: /dev/sde6 appears to be part of a raid array: level=raid1 devices=2 ctime=Mon Oct 14 17:01:01 2013 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md/md001hw started.
好的,一旦創建我嘗試安裝它:
root@ubuntu:~# mount /dev/md/md001hw /mnt/n mount: you must specify the filesystem type
此時指定的所有 ext2,3,4 都
-t
給出錯誤。 4. 第四次嘗試:創建磁碟映像並使用它們好的,由於磁碟有問題,最好在數據分區的副本(dd)上工作,在塊讀取錯誤(錯誤)的情況下用 0(同步)填充。因此,我創建了兩個圖像:
這一張用於好磁碟(4MB 塊,更快):
root@ubuntu:~# dd bs=4M if=/dev/sde6 of=/media/pietro/4TBexthdd/sde6-bs4M-noerror-sync.img conv=noerror,sync
這一個用於有問題的磁碟(最小塊大小,更安全)
root@ubuntu:~# dd if=/dev/sde6 of=/media/pietro/4TBexthdd/sdd6-noerror-sync.img conv=noerror,sync
獲得這兩個圖像後,我嘗試使用上面指定的命令將它們用作 RAID 0。無事可做,得到的答案是圖像“不是塊設備”並且它不會創建數組。 5. 第 5 次嘗試:逐個字節地挽救一些數據
好的,如果正確的安裝不起作用,讓我們通過逐字節讀取和頁眉和頁腳資訊來提取數據。我在每個磁碟上都使用*foremost * 來完成這項工作:對於磁碟 1:
root@ubuntu:~# foremost -i /dev/sde6 -o /media/pietro/4TBexthdd/foremost_da_sde6/
它創建具有文件副檔名的子文件夾,但其中根本沒有人口。而對於磁碟 2(損壞的磁碟):
root@ubuntu:~# foremost -i /dev/sdd6 -o /media/pietro/4TBexthdd/foremost_da_sdd6_disco2/
子文件夾結構都不是由最重要的。
當我在 RAID 0 陣列上嘗試最重要的結果時,結果相同:
root@ubuntu:~# foremost -i /dev/md/md001hw -o /media/pietro/4TBexthdd/foremost_da_raid_hw/
沒有創建任何子文件夾結構。
我需要幫助的地方/我的問題
- 第一個也是最重要的問題:**如何拯救數據?**有沒有人有任何提示我沒有嘗試過?
- 你們中的任何人都可以提出與我所做的不同的建議嗎?
其他問題:
- 我是新手
mdadm
,我做的一切正確嗎?- 原始陣列實際上是在 2011 年 9 月 26 日以 Raid 0 模式創建的嗎?
- 為什麼我不能使用分區映像來創建陣列?
附錄
這是
dmesg
從故障磁碟 (/dev/sdd
) 讀取時的輸出:[ 958.802966] sd 8:0:0:0: [sdd] Unhandled sense code [ 958.802976] sd 8:0:0:0: [sdd] [ 958.802980] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE [ 958.802984] sd 8:0:0:0: [sdd] [ 958.802987] Sense Key : Medium Error [current] [ 958.802994] sd 8:0:0:0: [sdd] [ 958.802999] Add. Sense: Unrecovered read error [ 958.803003] sd 8:0:0:0: [sdd] CDB: [ 958.803006] Read(10): 28 00 00 d5 c7 e0 00 00 f0 00 [ 958.803021] end_request: critical target error, dev sdd, sector 14010336 [ 958.803028] quiet_error: 36 callbacks suppressed [ 958.803032] Buffer I/O error on device sdd, logical block 1751292 [ 958.803043] Buffer I/O error on device sdd, logical block 1751293 [ 958.803048] Buffer I/O error on device sdd, logical block 1751294 [ 958.803052] Buffer I/O error on device sdd, logical block 1751295 [ 958.803057] Buffer I/O error on device sdd, logical block 1751296 [ 958.803061] Buffer I/O error on device sdd, logical block 1751297 [ 958.803065] Buffer I/O error on device sdd, logical block 1751298 [ 958.803069] Buffer I/O error on device sdd, logical block 1751299 [ 958.803074] Buffer I/O error on device sdd, logical block 1751300 [ 958.803078] Buffer I/O error on device sdd, logical block 1751301 [ 961.621228] sd 8:0:0:0: [sdd] Unhandled sense code [ 961.621236] sd 8:0:0:0: [sdd] [ 961.621238] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE [ 961.621241] sd 8:0:0:0: [sdd] [ 961.621243] Sense Key : Medium Error [current] [ 961.621248] sd 8:0:0:0: [sdd] [ 961.621251] Add. Sense: Unrecovered read error [ 961.621254] sd 8:0:0:0: [sdd] CDB: [ 961.621255] Read(10): 28 00 00 d5 c8 d0 00 00 10 00 [ 961.621266] end_request: critical target error, dev sdd, sector 14010576 [ 964.791077] sd 8:0:0:0: [sdd] Unhandled sense code [ 964.791084] sd 8:0:0:0: [sdd] [ 964.791087] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE [ 964.791090] sd 8:0:0:0: [sdd] [ 964.791092] Sense Key : Medium Error [current] [ 964.791096] sd 8:0:0:0: [sdd] [ 964.791099] Add. Sense: Unrecovered read error [ 964.791102] sd 8:0:0:0: [sdd] CDB: [ 964.791104] Read(10): 28 00 00 d5 c8 00 00 00 08 00 [ 964.791114] end_request: critical target error, dev sdd, sector 14010368 [ 964.791119] quiet_error: 22 callbacks suppressed [ 964.791122] Buffer I/O error on device sdd, logical block 1751296
我討厭成為壞消息的傳遞者,但是…
問:我是 mdadm 的新手,我做的一切都正確嗎?
A: 不。事實上,你幾乎以最具破壞性的方式做了所有事情。您曾經
--create
破壞數組元數據,而不是使用--assemble
可能允許您讀取數據的數組元數據(至少在磁碟能夠這樣做的範圍內)。這樣做會失去關鍵的元數據(特別是磁碟順序、數據偏移量和塊大小)。此外,
--create
可能在關鍵文件系統結構的頂部有亂七八糟的數組元數據。最後,在您的步驟 (3) 中,我看到 mdadm 在兩個磁碟上都抱怨 RAID1 — 我希望這是您在兩個磁碟上分別嘗試 (2) 的結果。我真誠地希望您不要讓 RAID1 開始嘗試同步磁碟(例如,您是否將兩者都添加到同一個 RAID1 陣列中)。
現在做什麼
看起來您終於創建了驅動器的圖像。你應該先做這件事*,*至少在嘗試任何超出基本的東西之前
--assemble
。但無論如何,
- 如果壞驅動器的圖像失去了大多數/所有扇區,請確定是否值得進行專業數據恢復。文件(和文件系統元數據)在 RAID0 中的驅動器之間拆分,因此您確實需要兩者都進行恢復。專業恢復將可能能夠讀取驅動器。
- 如果圖像大部分正常,除了少數扇區,請繼續。
**製作圖像文件的副本。僅處理圖像文件的副本。**我不能強調這一點,您可能會多次破壞這些副本,您需要能夠重新開始。而且您不想再次對磁碟進行映像,尤其是因為其中一個失敗了!
要回答您的其他問題之一:
問:為什麼我不能使用分區映像來創建陣列?
答:要組裝(或創建)一組圖像文件,您需要使用回送設備。使用 .將圖像附加到環回設備
losetup
。閱讀手冊頁,但它會類似於losetup --show -f /path/to/COPY-of-image
. 現在,您mdadm
在循環設備上使用(例如,/dev/loop0
)。確定原始陣列佈局
您需要找出最初用於創建數組的所有 mdadm 選項(因為您
--create
之前已銷毀該元數據)。--create
然後,您可以使用這些選項在兩個環回設備上執行。您需要弄清楚元數據版本 (-e
)、RAID 級別 (-l
, 似乎是 0)、塊大小 (-c
)、設備數量 (-n
, 應該是 2) 以及設備的確切順序。最簡單的方法是獲取兩個新磁碟,然後放入 NAS,然後讓 NAS 在它們上創建一個新陣列。最好與最初使用的 NAS 韌體版本相同。IOW,重複初始設置。然後將磁碟拉出,並
mdadm -E
在其中一個成員上使用。這是一個來自 RAID10 陣列的範例,略有不同。我省略了一堆行來突出顯示您需要的行:Version : 1.0 # -e Raid Level : raid10 # -l Raid Devices : 4 # -n Chunk Size : 512K # -c Device Role : Active device 0 # gets you the device order Array State : AAAA ('A' == active, '.' == missing)
注意:我假設您在這裡使用的是 ext2/3/4;如果沒有,請為 NAS 實際使用的文件系統使用適當的實用程序。
嘗試使用這些選項創建(在環回設備上)。看看
e2fsck -n
能不能認出來。如果沒有,請停止陣列,並以其他順序使用設備再次創建它。再試e2fsck -n
一次。如果兩者都不起作用,您應該回到您認為正確的順序,並嘗試備份超級塊。
e2fsck
聯機幫助頁告訴您要使用的數字;你幾乎可以肯定有一個 4K 塊大小。如果備份超級塊都不起作用,請停止陣列,然後嘗試其他磁碟順序。如果這不起作用,您可能有錯誤的--create
選擇;從圖像的新副本重新開始並嘗試一些不同的選項——我會先嘗試不同的元數據版本。一旦你讓 e2fsck 執行,看看文件系統的損壞程度。如果它完全被丟棄,那可能意味著你有錯誤的塊大小(停止並重新創建數組以嘗試更多)。
把數據複製下來。
我建議讓 e2fsck 嘗試修復文件系統。這確實有破壞文件系統的風險,但是,這就是您要處理副本的原因!然後你可以掛載它,然後複製數據。請記住,某些數據可能已損壞,並且可能會隱藏損壞(例如,文件的頁面可能已替換為 NULL)。
我無法從 NAS 獲取原始參數
那你就麻煩了。您的另一種選擇是進行猜測,直到最終成功,或者充分了解磁碟格式以使用十六進制編輯器進行計算。可能有一兩個實用程序可以幫助解決這個問題;我不知道。
或者,聘請數據恢復公司。