硬碟資料恢復怎麼做:邏輯故障與物理故障的處理步驟
硬碟資料恢復的第一步不是找軟體,而是立刻停止寫入,判斷故障型別。誤刪、格式化、分割槽丟失這類邏輯故障,先用 ddrescue 把整盤做成映象,再在映象上用 TestDisk、PhotoRec 恢復;有異響、不識別、固態掉盤這類物理故障,以及 RAID 的成員盤,不要自己動手,斷電後送專業實驗室。
硬碟壞了,裡面的資料多數情況下能恢復,能恢復多少取決於兩件事:故障屬於哪一類,以及出事之後你做過什麼。邏輯故障(誤刪、格式化、分割槽表丟失、檔案系統損壞)盤本身是好的,按“停止寫入、整盤映象、在副本上恢復”的順序操作,成功率通常很高;物理故障(磁頭、電機、電路板、固態主控壞了)需要潔淨間和專用裝置,自己能做的只有斷電、記錄現象、送修。真正讓資料無法挽回的,往往不是故障本身,而是故障之後的誤操作:繼續寫入、在原盤上跑修復、照提示格式化、反覆通電。
先判斷:邏輯故障還是物理故障
| 現象 | 故障型別 | 第一步 |
|---|---|---|
| 誤刪檔案、清空了目錄 | 邏輯 | 立即停止往這個分割槽寫入 |
| 誤格式化、誤重灌了系統 | 邏輯 | 同上;如果是固態盤,先看後文 TRIM 一節 |
| 分割槽不見了,磁碟管理裡顯示“未分配” | 邏輯,分割槽表損壞 | 不要新建分割槽,用 TestDisk 找回 |
Windows 顯示 RAW、提示需要格式化;Linux 掛載報 wrong fs type 或 bad superblock |
邏輯,檔案系統後設資料損壞 | 不要格式化,不要直接對原盤跑 chkdsk 或 fsck |
能識別,但讀取極慢,dmesg 裡大量 I/O error,SMART 待對映扇區持續增長 |
物理,壞道,但盤還能讀 | 儘快用 ddrescue 做映象,不要再跑全盤自檢 |
| 通電後有咔噠聲、週期性敲擊聲,或者電機不轉 | 物理,磁頭或電機故障 | 立即斷電,送實驗室 |
| BIOS 或陣列卡里看不到這塊盤;或容量變成很小的數字、型號變成奇怪的名字 | 物理,固態盤主控或韌體故障,也可能是機械盤韌體故障 | 斷電,送實驗室 |
| 固態盤能讀不能寫 | 部分固態盤壽命耗盡後進入唯讀保護 | 趁還能讀,立刻把資料拷出來 |
| RAID 虛擬盤離線,多塊成員盤報錯 | 陣列故障 | 停止一切陣列操作,見後文 |
型號變成奇怪的名字,一個典型例子是部分群聯主控的固態盤在韌體出錯後,會被識別成 SATAFIRM S11。這是主控韌體故障的表現,資料並沒有被清空,但需要專業裝置處理韌體才可能讀出來。
還有一點和平時排查硬碟不同:平時判斷硬碟好壞,會跑一次 SMART 長自檢讓盤把全盤讀一遍;但資料要緊、盤又已經在報錯時,長自檢會讓本來就吃力的磁頭把每個扇區都讀一遍,等於在做映象之前先消耗掉一部分“剩餘壽命”。順序應該是先映象,後自檢。
千萬別做的操作
- 繼續往這塊盤寫東西。包括把恢復軟體裝到這塊盤上、把恢復出來的檔案存回原盤、讓資料庫和日誌服務繼續執行。每一次寫入都可能覆蓋掉要找的資料。
- 直接在原盤上執行 fsck、chkdsk 或 xfs_repair。修復程式會改寫檔案系統的後設資料,修對了萬事大吉,修錯了就回不去。要修,在映象副本上修。
- 照提示格式化。Windows 彈出“需要將其格式化”的對話方塊時點取消;格式化會重寫後設資料,在固態盤上還會對整個分割槽執行 TRIM。
- 在固態盤上重新建檔案系統試試。
mkfs.ext4和mkfs.xfs在支援 TRIM 的裝置上,預設會先對整個目標分割槽或裝置執行丟棄(discard),命令一回車,盤上的資料基本就沒有了。 - 反覆給異響的機械盤通電。磁頭有問題的盤,每次通電都可能在碟片上劃出新的劃痕,劃傷的區域永久無法讀取。敲打、冷凍這些網上流傳的“偏方”同樣不要試。
- 自己開盤,或者換一塊同型號的電路板。開盤必須在潔淨環境裡進行;現在的硬碟把這塊盤專屬的支援引數存放在電路板的 ROM 晶片裡,直接換上別的電路板通常不能用,還可能造成新的損壞。
- 對故障陣列執行重建、初始化、清除配置或新建虛擬盤。陣列故障後最常見的“二次事故”就是這幾步。
- 對故障固態盤升級韌體、做安全擦除,或對有壞道的盤跑“壞道修復”工具。前兩步可能清掉固態盤內部的位址對映表,讓資料再也無法還原;壞道修復工具會反覆讀寫壞區,加速機械盤磁頭的損壞。
邏輯故障:先用 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:什麼時候必須送實驗室
出現異響、不轉、不識別、電路板燒蝕、摔落進水這些情況,自己能做的是:斷電,記下故障現象和出事前的操作,把盤裝進防靜電袋,送去有潔淨間的資料恢復實驗室。
伺服器上更常見的是陣列故障。陣列裡壞盤的數量超過了冗餘能力,或者在重建過程中又壞了一塊,這時要做的是儲存現場,而不是繼續嘗試:
- 記錄陣列配置。硬體 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,這兩條唯讀取資訊,不改動任何東西。 - 給每塊盤貼上槽位號,同時記下序列號,掉線的盤、熱備盤也算在內。
- 全部成員盤一起送,連同上面匯出的配置。實驗室會先給每塊盤做映象,再在映象上按記錄的引數把陣列虛擬重組出來,不在原盤上做任何寫入。
送修之前,除了前面“千萬別做”裡列出的陣列操作,也不要強制把掉線的盤上線後讓它重建,或者對原來的成員盤執行 mdadm --create:這些操作都會改寫成員盤上的後設資料或資料。
託管或租用在機房裡的伺服器,硬碟裡是客戶的資料。服務商不要在沒有客戶書面授權的情況下把盤交給任何第三方,送修過程中盤在誰手裡、什麼時候交接的,都要有記錄。
恢復成功率和費用怎麼判斷
能恢復到什麼程度,要等實驗室檢測後才有結論,下表只作定性參考:
| 情況 | 恢復可能性 | 主要取決於 |
|---|---|---|
| 機械盤誤刪、快速格式化、分割槽表丟失 | 高 | 之後寫入了多少、是否新建過分割槽 |
| 檔案系統損壞、RAW | 較高 | 是否在原盤上跑過修復 |
| 機械盤有壞道但還能識別 | 中到高 | 壞道的數量和分佈、磁頭狀態 |
| 機械盤異響、不轉 | 中 | 碟片是否劃傷、能否找到匹配的配件盤 |
| RAID 壞盤超過冗餘 | 中到高 | 故障後是否做過重建、初始化等操作 |
| 固態盤主控或韌體故障 | 不確定 | 主控型號是否有成熟方案、資料是否加密 |
| 碟片大面積劃傷 | 低 | 劃傷範圍 |
| 固態盤誤刪且已 TRIM,或在固態盤上重新格式化 | 很低 | — |
費用一般由幾部分構成:檢測費(有的機構不收,或恢復成功後抵扣);恢復服務費,這是主體,按故障型別和難度定價,大致從低到高依次是邏輯故障、壞道映象、開盤換磁頭、多盤陣列,容量越大、壞道越多耗時越長;開盤需要的配件盤,型號越冷門越難找;存放恢復結果的目標盤,可以自己提供;此外還可能有加急費,以及資料不能離開機房時請工程師上門的現場服務費。報價因機構、地區和故障情況差別很大,以檢測後的書面報價為準。
選機構、簽約前確認三件事:
- 先檢測、說清故障原因再報價。
- 書面約定什麼算成功。“不成功不收費”很常見,但要寫明標準,例如指定目錄完整恢復、指定的資料庫能正常開啟;恢復後先給檔案清單,或讓你抽驗幾個關鍵檔案,確認可用再付款。
- 全程不對原盤寫入,並籤保密協議。
在管理系統裡怎麼落地
資料恢復是最後的手段,代價高、結果不確定,機房日常要做的是讓它儘量用不上:重要資料至少保留三份,放在兩種不同的介質上,其中一份放在異地;硬碟的 SMART 和陣列狀態納入監控,出現待對映扇區或陣列降級就及早換盤,不要等到壞第二塊。
換盤這件事本身也要管起來。在 Toplink DCIM 裡,硬碟是機櫃與資產中按批次入庫管理的部件:伺服器上裝的是哪幾塊盤,由下發的採集指令碼自動寫入台帳,每次採集都留檔;故障盤登記返修,誰在什麼時候換了什麼都有據可查。有了批次和返修記錄,哪一批硬碟返修多、哪台機器頻繁換盤,查記錄就知道,提前替換,比壞了再找人恢復資料划算得多。
常見問題
機械硬碟壞了能修嗎?
能修到把資料讀出來,但不值得修好繼續用。實驗室換磁頭、修韌體,目的是把資料完整讀一次,讀完這塊盤就不再可靠;伺服器上應該換新盤,資料從映象或備份恢復。
固態硬碟壞了還能修嗎?
掉盤、容量顯示異常多是主控或韌體故障,修好繼續用的意義不大。走廠商保修通常是寄回原盤、換一塊新盤,原盤裡的資料也就拿不回來了;資料重要的話,先交給恢復機構處理,再決定是否走保修。
PhotoRec 恢復出來的檔案打不開是怎麼回事?
PhotoRec 按檔案頭特徵找資料,假定檔案在磁碟上是連續存放的。大檔案寫入時被分散存放、檔案所在區域有壞道,或者 SSD 上的資料已經被 TRIM 清零,找回來的檔案就會殘缺。檔名和目錄結構丟失則是這種方式的正常現象。