伺服器維運

硬碟資料恢復怎麼做:邏輯故障與物理故障的處理步驟

硬碟資料恢復的第一步不是找軟體,而是立刻停止寫入,判斷故障型別。誤刪、格式化、分割槽丟失這類邏輯故障,先用 ddrescue 把整盤做成映象,再在映象上用 TestDisk、PhotoRec 恢復;有異響、不識別、固態掉盤這類物理故障,以及 RAID 的成員盤,不要自己動手,斷電後送專業實驗室。

作者 頂聯產品團隊發布於 9 分鐘閱讀

硬碟壞了,裡面的資料多數情況下能恢復,能恢復多少取決於兩件事:故障屬於哪一類,以及出事之後你做過什麼。邏輯故障(誤刪、格式化、分割槽表丟失、檔案系統損壞)盤本身是好的,按“停止寫入、整盤映象、在副本上恢復”的順序操作,成功率通常很高;物理故障(磁頭、電機、電路板、固態主控壞了)需要潔淨間和專用裝置,自己能做的只有斷電、記錄現象、送修。真正讓資料無法挽回的,往往不是故障本身,而是故障之後的誤操作:繼續寫入、在原盤上跑修復、照提示格式化、反覆通電。

先判斷:邏輯故障還是物理故障

現象 故障型別 第一步
誤刪檔案、清空了目錄 邏輯 立即停止往這個分割槽寫入
誤格式化、誤重灌了系統 邏輯 同上;如果是固態盤,先看後文 TRIM 一節
分割槽不見了,磁碟管理裡顯示“未分配” 邏輯,分割槽表損壞 不要新建分割槽,用 TestDisk 找回
Windows 顯示 RAW、提示需要格式化;Linux 掛載報 wrong fs type 或 bad superblock 邏輯,檔案系統後設資料損壞 不要格式化,不要直接對原盤跑 chkdsk 或 fsck
能識別,但讀取極慢,dmesg 裡大量 I/O error,SMART 待對映扇區持續增長 物理,壞道,但盤還能讀 儘快用 ddrescue 做映象,不要再跑全盤自檢
通電後有咔噠聲、週期性敲擊聲,或者電機不轉 物理,磁頭或電機故障 立即斷電,送實驗室
BIOS 或陣列卡里看不到這塊盤;或容量變成很小的數字、型號變成奇怪的名字 物理,固態盤主控或韌體故障,也可能是機械盤韌體故障 斷電,送實驗室
固態盤能讀不能寫 部分固態盤壽命耗盡後進入唯讀保護 趁還能讀,立刻把資料拷出來
RAID 虛擬盤離線,多塊成員盤報錯 陣列故障 停止一切陣列操作,見後文

型號變成奇怪的名字,一個典型例子是部分群聯主控的固態盤在韌體出錯後,會被識別成 SATAFIRM S11。這是主控韌體故障的表現,資料並沒有被清空,但需要專業裝置處理韌體才可能讀出來。

還有一點和平時排查硬碟不同:平時判斷硬碟好壞,會跑一次 SMART 長自檢讓盤把全盤讀一遍;但資料要緊、盤又已經在報錯時,長自檢會讓本來就吃力的磁頭把每個扇區都讀一遍,等於在做映象之前先消耗掉一部分“剩餘壽命”。順序應該是先映象,後自檢。

千萬別做的操作

  1. 繼續往這塊盤寫東西。包括把恢復軟體裝到這塊盤上、把恢復出來的檔案存回原盤、讓資料庫和日誌服務繼續執行。每一次寫入都可能覆蓋掉要找的資料。
  2. 直接在原盤上執行 fsck、chkdsk 或 xfs_repair。修復程式會改寫檔案系統的後設資料,修對了萬事大吉,修錯了就回不去。要修,在映象副本上修。
  3. 照提示格式化。Windows 彈出“需要將其格式化”的對話方塊時點取消;格式化會重寫後設資料,在固態盤上還會對整個分割槽執行 TRIM。
  4. 在固態盤上重新建檔案系統試試。mkfs.ext4 和 mkfs.xfs 在支援 TRIM 的裝置上,預設會先對整個目標分割槽或裝置執行丟棄(discard),命令一回車,盤上的資料基本就沒有了。
  5. 反覆給異響的機械盤通電。磁頭有問題的盤,每次通電都可能在碟片上劃出新的劃痕,劃傷的區域永久無法讀取。敲打、冷凍這些網上流傳的“偏方”同樣不要試。
  6. 自己開盤,或者換一塊同型號的電路板。開盤必須在潔淨環境裡進行;現在的硬碟把這塊盤專屬的支援引數存放在電路板的 ROM 晶片裡,直接換上別的電路板通常不能用,還可能造成新的損壞。
  7. 對故障陣列執行重建、初始化、清除配置或新建虛擬盤。陣列故障後最常見的“二次事故”就是這幾步。
  8. 對故障固態盤升級韌體、做安全擦除,或對有壞道的盤跑“壞道修復”工具。前兩步可能清掉固態盤內部的位址對映表,讓資料再也無法還原;壞道修復工具會反覆讀寫壞區,加速機械盤磁頭的損壞。

邏輯故障:先用 ddrescue 做映象,再在副本上恢復

第一步:停止寫入

systemctl stop mysql nginx         # 先停掉往這塊盤寫資料的服務
fuser -vm /data                    # 看還有哪些程序在用這個掛載點
umount /data || mount -o remount,ro /data   # 解除安裝;卸不掉就改成唯讀掛載
systemctl stop fstrim.timer        # 固態盤:暫停定時 TRIM,原因見後文

如果丟資料的是系統所在的分割槽,系統執行本身就在不斷寫入,應該關機,從救援系統啟動後再操作。租用的伺服器可以在服務商提供的客戶自助端切到救援模式,救援系統是臨時啟動的,不動硬碟上的資料。

第二步:認準源盤和目標盤

lsblk -o NAME,SIZE,MODEL,SERIAL,MOUNTPOINT

按容量、型號和序列號確認哪塊是故障盤,哪塊是用來存映象的目標盤。目標盤的可用空間要大於故障盤的總容量,並且必須是另一塊物理硬碟或網路儲存。

第三步:用 ddrescue 做整盤映象

GNU ddrescue 專門用來從有問題的盤上搶救資料:先讀好讀的區域,跳過難讀的部分,最後再回頭反覆嘗試壞區,進度記錄在對映檔案裡,中斷後可以接著做。Debian、Ubuntu 上的包名是 gddrescue,RHEL 系可以從 EPEL 安裝。

apt-get install gddrescue
# 第一遍:快速讀完好讀的區域,跳過難讀區域
ddrescue -n /dev/sdb /mnt/backup/sdb.img /mnt/backup/sdb.map
# 第二遍:對剩下的難讀區域直接讀盤,每處重試 3 次
ddrescue -d -r3 /dev/sdb /mnt/backup/sdb.img /mnt/backup/sdb.map
# 檢視對映檔案記錄的整體進度
ddrescuelog -t /mnt/backup/sdb.map

幾點注意:引數順序是“源在前、目標在後”,寫反了會把映象寫到故障盤上;要直接克隆到另一塊硬碟時,目標寫成裝置名並加 -f;執行時螢幕上會即時顯示已救出的資料量(rescued)、比例和壞區數量(bad areas)。機械盤在讀壞區的過程中如果開始出現異響,或者讀取速度一路掉到幾乎為零,立即按 Ctrl+C 停止(進度儲存在對映檔案裡),轉為送實驗室處理,不要硬讀。

第四步:在映象上恢復

losetup -fP -r --show /mnt/backup/sdb.img   # 映象唯讀掛成 loop 裝置,輸出如 /dev/loop0,分割槽為 loop0p1 等
mount -o ro /dev/loop0p1 /mnt/recover       # 檔案系統完好時,直接唯讀掛載拷出檔案
testdisk /mnt/backup/sdb.img                # 分割槽丟失或誤刪,用 TestDisk
photorec /mnt/backup/sdb.img                # 按檔案型別找回,恢復結果放到另一塊盤上

映象裡的 ext4 日誌還沒回放時,唯讀掛載會失敗,加上 noload(mount -o ro,noload)即可;XFS 對應的引數是 norecovery。

TestDisk 的流程是選中映象,選擇分割槽表型別(Intel 是傳統 MBR,EFI GPT 是 GPT),然後 Analyse、Quick Search,找不到再 Deeper Search。找到分割槽後按 P 列出檔案,確認是要找的資料,能直接用 c 把檔案或目錄拷出來,就不必把分割槽表寫回去。需要寫回(Write)時,先另外複製一份映象,在複製品上寫。

按場景選工具:

場景 工具與方法 能恢復到什麼程度
分割槽表丟失、誤刪分割槽 TestDisk 搜尋並重建分割槽表 通常能連同目錄結構和檔名完整找回
NTFS、FAT、exFAT 上誤刪檔案 TestDisk 的檔案恢復功能 檔名和目錄多半還在
ext4、XFS 上誤刪檔案 PhotoRec 按檔案型別找回 ext4 刪除檔案時會清掉 inode 裡記錄的資料塊位置,按原檔名找回很難,多數只能按型別找回內容,檔名變成編號
檔案系統損壞、顯示 RAW 在映象的副本上執行 fsck、chkdsk 或 xfs_repair,或者用 TestDisk 列出檔案後拷出 視損壞範圍而定
LVM 後設資料損壞,邏輯卷不見了 用 vgcfgrestore 從 /etc/lvm/archive 裡的歷史後設資料恢復;/etc 也在這塊盤上時,從映象裡取出這些檔案 後設資料恢復後資料通常完整

PhotoRec 的結果按 recup_dir.1、recup_dir.2 這樣的目錄存放,檔名是 f 加一串數字。找回之後逐個開啟驗證,確認可用再拷到新盤上,不要拷回原來那塊盤。

固態硬碟資料恢復為什麼更難

固態盤的誤刪恢復比機械盤難得多,原因是 TRIM:檔案刪除後,檔案系統會通知固態盤“這些塊不用了”,盤的主控在後台把對應的快閃記憶體塊擦除回收,之後再讀這些位址,多數盤返回的是全零。一旦 TRIM 生效,任何軟體都找不回來。

Linux 上 TRIM 什麼時候發生,取決於掛載方式:

  • 掛載引數裡有 discard,刪除時立即 TRIM,基本沒有挽回餘地;
  • 沒有 discard,靠定時任務批次執行,例如 Ubuntu 預設啟用的 fstrim.timer 每週執行一次。在它下次執行之前停掉它、儘快做映象,誤刪的資料還有機會。
findmnt -no OPTIONS /data            # 看掛載引數裡有沒有 discard
systemctl list-timers fstrim.timer   # 看下一次定時 TRIM 是什麼時候

不少硬體 RAID 卡和 USB 硬碟盒不會把 TRIM 命令傳給後面的固態盤,這種情況下誤刪的資料也還有機會;而在固態盤上誤格式化、誤重灌,能找回的東西很少,因為建檔案系統這一步通常會對整個分割槽執行丟棄。

固態盤物理故障的恢復,難點在主控:不少主控會對寫入快閃記憶體的資料做加密或資料變換,並維護一張邏輯位址到快閃記憶體位置的對映表。主控損壞時,把快閃記憶體顆粒拆下來直接讀,得到的往往是無法還原的資料,只能修復主控或韌體後讓它自己讀出來,能不能成功很大程度上取決於這個主控型號有沒有成熟的方案。

物理故障和 RAID:什麼時候必須送實驗室

出現異響、不轉、不識別、電路板燒蝕、摔落進水這些情況,自己能做的是:斷電,記下故障現象和出事前的操作,把盤裝進防靜電袋,送去有潔淨間的資料恢復實驗室。

伺服器上更常見的是陣列故障。陣列裡壞盤的數量超過了冗餘能力,或者在重建過程中又壞了一塊,這時要做的是儲存現場,而不是繼續嘗試:

  1. 記錄陣列配置。硬體 RAID 用廠商工具匯出控制器、虛擬盤和每塊物理盤的資訊,例如 storcli64 /c0 show all、storcli64 /c0/vall show all、storcli64 /c0/eall/sall show all,重點是 RAID 級別、條帶大小和成員盤的順序。軟 RAID 執行 mdadm --examine /dev/sd[b-e]1 > md-examine.txt 和 cat /proc/mdstat,這兩條唯讀取資訊,不改動任何東西。
  2. 給每塊盤貼上槽位號,同時記下序列號,掉線的盤、熱備盤也算在內。
  3. 全部成員盤一起送,連同上面匯出的配置。實驗室會先給每塊盤做映象,再在映象上按記錄的引數把陣列虛擬重組出來,不在原盤上做任何寫入。

送修之前,除了前面“千萬別做”裡列出的陣列操作,也不要強制把掉線的盤上線後讓它重建,或者對原來的成員盤執行 mdadm --create:這些操作都會改寫成員盤上的後設資料或資料。

託管或租用在機房裡的伺服器,硬碟裡是客戶的資料。服務商不要在沒有客戶書面授權的情況下把盤交給任何第三方,送修過程中盤在誰手裡、什麼時候交接的,都要有記錄。

恢復成功率和費用怎麼判斷

能恢復到什麼程度,要等實驗室檢測後才有結論,下表只作定性參考:

情況 恢復可能性 主要取決於
機械盤誤刪、快速格式化、分割槽表丟失 高 之後寫入了多少、是否新建過分割槽
檔案系統損壞、RAW 較高 是否在原盤上跑過修復
機械盤有壞道但還能識別 中到高 壞道的數量和分佈、磁頭狀態
機械盤異響、不轉 中 碟片是否劃傷、能否找到匹配的配件盤
RAID 壞盤超過冗餘 中到高 故障後是否做過重建、初始化等操作
固態盤主控或韌體故障 不確定 主控型號是否有成熟方案、資料是否加密
碟片大面積劃傷 低 劃傷範圍
固態盤誤刪且已 TRIM,或在固態盤上重新格式化 很低 —

費用一般由幾部分構成:檢測費(有的機構不收,或恢復成功後抵扣);恢復服務費,這是主體,按故障型別和難度定價,大致從低到高依次是邏輯故障、壞道映象、開盤換磁頭、多盤陣列,容量越大、壞道越多耗時越長;開盤需要的配件盤,型號越冷門越難找;存放恢復結果的目標盤,可以自己提供;此外還可能有加急費,以及資料不能離開機房時請工程師上門的現場服務費。報價因機構、地區和故障情況差別很大,以檢測後的書面報價為準。

選機構、簽約前確認三件事:

  1. 先檢測、說清故障原因再報價。
  2. 書面約定什麼算成功。“不成功不收費”很常見,但要寫明標準,例如指定目錄完整恢復、指定的資料庫能正常開啟;恢復後先給檔案清單,或讓你抽驗幾個關鍵檔案,確認可用再付款。
  3. 全程不對原盤寫入,並籤保密協議。

在管理系統裡怎麼落地

資料恢復是最後的手段,代價高、結果不確定,機房日常要做的是讓它儘量用不上:重要資料至少保留三份,放在兩種不同的介質上,其中一份放在異地;硬碟的 SMART 和陣列狀態納入監控,出現待對映扇區或陣列降級就及早換盤,不要等到壞第二塊。

換盤這件事本身也要管起來。在 Toplink DCIM 裡,硬碟是機櫃與資產中按批次入庫管理的部件:伺服器上裝的是哪幾塊盤,由下發的採集指令碼自動寫入台帳,每次採集都留檔;故障盤登記返修,誰在什麼時候換了什麼都有據可查。有了批次和返修記錄,哪一批硬碟返修多、哪台機器頻繁換盤,查記錄就知道,提前替換,比壞了再找人恢復資料划算得多。

常見問題

機械硬碟壞了能修嗎?

能修到把資料讀出來,但不值得修好繼續用。實驗室換磁頭、修韌體,目的是把資料完整讀一次,讀完這塊盤就不再可靠;伺服器上應該換新盤,資料從映象或備份恢復。

固態硬碟壞了還能修嗎?

掉盤、容量顯示異常多是主控或韌體故障,修好繼續用的意義不大。走廠商保修通常是寄回原盤、換一塊新盤,原盤裡的資料也就拿不回來了;資料重要的話,先交給恢復機構處理,再決定是否走保修。

PhotoRec 恢復出來的檔案打不開是怎麼回事?

PhotoRec 按檔案頭特徵找資料,假定檔案在磁碟上是連續存放的。大檔案寫入時被分散存放、檔案所在區域有壞道,或者 SSD 上的資料已經被 TRIM 清零,找回來的檔案就會殘缺。檔名和目錄結構丟失則是這種方式的正常現象。

想看看在你的機房裡怎麼用?

從一次產品示範開始,梳理你的業務鏈路。

查看價格
服務熱線 400-112-2951

讓我們聊聊你的 IDC 業務

掃碼新增企業微信,預約產品示範或申請試用。

Toplink 企業微信二維碼

長按儲存或使用企業微信 / 微信掃描

也可致電
400-112-2951
Telegram
@TopLink88