歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux數據恢復專題——恢復丟失的分區

Linux數據恢復專題——恢復丟失的分區

日期:2017/2/28 16:17:29   编辑:Linux教程

背景
遇到“/dev/hda: device not found”這樣的消息,說明你的硬盤肯定出問題了(廢話-_-)!而這種消息可能是由於不同情況引起的,在這裡介紹屬於磁盤分區表受損時的對策。這種情況下,磁盤數據都還在,只不過暫時無法訪問。

方法
鑒於僅憑記憶手工恢復分區表是不現實的,這裡介紹通過軟件恢復分區表:使用gpart程序掃描指定的磁盤驅動器,標識看似分區簽名的表項。gpart默認只是顯示像是分區的表項,但它也能將表項寫入磁盤,從而重建分區表。注意,這個過程是危險的。不過總比丟失全部數據要強 :)

------------------------------------------------------------------------------------------
在你的硬盤還正常的時候,可以嘗試備份分區表並存放到安全的地方,以供災難恢復:
dd if=/dev/xxx of=filename bs=512 count=1
用於恢復的命令:
dd if=filename of=/dev/xxx bs=1 count=64 skip=446 seek=446
上面的兩條命令中,xxx代表你的磁盤符號,比如hda、sda等;filename為備份文件的文件名。
注:上面的命令同時也備份了MBR和Boot Record ID,但恢復時只恢復了其中的64字節(分區表)。
------------------------------------------------------------------------------------------

gpart默認能識別下面的文件系統:beos,bsddl,ext2&ext3,fat,hpfs,hmlvm,lswap,minix,ntfs,4,rfs,s86dl和xfs。

工作
下面以/dev/hda為例:
gpart /dev/hda
上面的命令會列出gpart猜出來的分區構成,大多數情況下是和實際相符的。確認無誤後,可以使用下面命令重建分區表:
gpart -W /dev/hda /dev/hda
如果不放心,可以在寫前備份現有的MBR:
gpart -b filename -W /dev/hda /dev/hda
其中,filename為備份文件。

總結
磁盤主分區表損壞造成的驅動器無法識別錯誤,一般是比較容易解決的,gpart能夠出色地猜出和重寫磁盤分區表。如果是磁盤因為嚴重損壞而不能掛接,則可以參考本專題第二篇文章——從嚴重損壞的磁盤恢復數據

硬盤故障導致的數據丟失有可能是慘重的,但如果已經發生了,就需要最大程度地將數據恢復出來。本文介紹當磁盤因嚴重問題無法訪問後(但BIOS還能識別),數據的搶救方法,並討論ext2&ext3格式分區的磁盤短讀(short read)錯誤。首先約定:需要手動輸入的字符用黑體字給出,其余的為終端輸出。

如果使用ext2或ext3文件系統,可能會收到類似下面一些警告信息,該警告信息來自e2fsck實用程序:

e2fsck /dev/hda1
e2fsck: Attempt to read block from filesystem resulted in short read

如果看到這個消息,首先想到可能是磁盤的主超級塊損壞。而在創建文件系統的時候,mke2fs已經自動創建了磁盤的超級塊的備份。可以告訴e2fsck程序使用一個備用超級塊檢查文件系統。備用超級塊一般創建於塊8193、16384或32768,取決於磁盤的大小(可以使用mkfs.ext3 -n /dev/hda1查看)。假設是塊大硬盤,則使用:

e2fsck -b 32768 /dev/hda1

如果是超級塊的問題,則程序返回後,備用超級塊被啟用,磁盤恢復正常。如果提示下面的問題:
e2fsck: Attempt to read block from filesystem resulted in short read while checking ext3 journal for /dev/hda1
說明問題不是出在超級塊,出自日志文件系統的日志。此時可以安全地刪除ext3文件系統的日志:

tune2fs -f -O ^has_journal /dev/hda1

這樣就刪除了/dev/hda1文件系統上的日志,這時可以重新嘗試掛載分區,必要的話可以重建日志系統(使用tune2fs -j /dev/xxx)。
如果tune2fs提示下面的錯誤:
tune2fs: Attempt to read block from filesystem resulted in short read while reading journal inode
則說明指向日志的inode壞了,意味著無法清除日志。這時可以嘗試debugfs命令,它是ext2&3文件系統的調試器。也可以再次使用e2fsck,加上-c參數檢查文件系統的壞塊。至此,因為無法檢查或修復問題磁盤上的文件系統,該拿出殺手锏了。

使用ddrescue克隆損壞的磁盤
如果磁盤因為壞塊而妨礙了讀取,可以使用一個原始的磁盤復制實用程序創建磁盤的一個副本。Unix/Linux系統自帶了一個簡單實用程序dd,它把一個文件/分區/磁盤復制到另一個(在第一個專題裡用到過)。前提條件時必須在系統裡添加一塊容量不小於問題磁盤的新硬盤。
新硬盤准備就緒後,輸入下面命令:

dd if=/dev/hda of=/dev/hdb conv=noerror,sync

上面的命令將壞磁盤(/dev/hda)復制到新磁盤(/dev/hdb),忽略讀取時遇到的錯誤(noerror),當遇到不能訪問的塊時用適當數量的空值填充輸出(sync)。
但是dd有幾個缺點:首先是速度太慢;然後是不顯示進度信息,直到完成前它都是沉默的;不重新嘗試失敗的讀取,這會減少能從壞盤恢復的數據量。因此在這裡介紹另一個軟件——ddrescue,可以從 http://www.gnu.org/software/ddrescue/ddrescue.html 獲取最新版(Fedora8用戶可以直接用yum install dd_rescue安裝) 。目前ddrescue最新版本是1.7,直接下載鏈接: http://ftp.gnu.org/gnu/ddrescue/ddrescue-1.7.tar.bz2
編譯、安裝後,可以使用下面命令完成相同的任務:

ddrescue --max-retries=-1 /dev/hda /dev/hdb


其中max-retries=-1參數表示無論遇到多少錯誤都不要停止。程序從hda讀取數據並寫到hdb中時,不斷更新各項數據,可以方便地查看工作進行情況。
在ddrescue結束磁盤復制後,在新硬盤上運行e2fsck,以消除原始磁盤的壞塊引起的文件系統錯誤。由於肯定會有大量錯誤,可以用-y參數運行e2fsck,指示e2fsck對每個問題都回答yes:

e2fsck -y /dev/hdb

此時,可以使用mount命令掛載文件系統,看看數據的恢復情況了。記得檢查驅動器根目錄下的lost+found文件夾,fsck把不能正確鏈接的文件和目錄放在了這個文件夾裡。

Copyright © Linux教程網 All Rights Reserved