Partition

嘗試打開分區時的短讀

  • February 4, 2020

在我執行 Kubuntu Linux 13.04 的個人家用電腦上,我無法安裝對我來說非常重要的分區。我的備份策略是大約每月執行一次備份,所以我確實從 8 月開始備份 :)。有沒有辦法恢復這個驅動器上的個人文件?

該驅動器是一個 1.5 年曆史的 1000 GiB 西部數據綠色驅動器,家庭安裝在 上/dev/sdc2,文件系統根目錄在 上/dev/sdc6,媒體文件在 上/dev/sdc3。因此,當然sdc2會是一個去!據我所知,在驅動器的生命週期內沒有停電或其他此類事件。我通過執行 Kubuntu LiveCD 設法獲得了這些資訊:

kubuntu@kubuntu:~$ sudo fdisk -l

Disk /dev/sdc: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes                                                                                                                                                                                                       Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00008044

 Device Boot      Start         End      Blocks   Id  System
/dev/sdc1   *        4094    88066047    44030977    5  Extended
/dev/sdc2        88066048  1419266047   665600000   83  Linux
/dev/sdc3      1419266048  1953523711   267128832   83  Linux
/dev/sdc5            4096     6146047     3070976   82  Linux swap / Solaris
/dev/sdc6         6148096    47106047    20478976   83  Linux
/dev/sdc7        47108096    88066047    20478976   83  Linux


kubuntu@kubuntu:~$ sudo mount -t ext4 /dev/sdc2 c1
mount: wrong fs type, bad option, bad superblock on /dev/sdc2,
 missing codepage or helper program, or other error
 In some cases useful info is found in syslog - try
 dmesg | tail  or so


 kubuntu@kubuntu:~$ sudo debugfs -c /dev/sdc2 
debugfs 1.42.5 (29-Jul-2012)

/dev/sdc2: Attempt to read block from filesystem resulted in short read while opening filesystem
debugfs:  quit


kubuntu@kubuntu:~$ sudo fsck /dev/sdc2
fsck from util-linux 2.20.1
e2fsck 1.42.5 (29-Jul-2012)
fsck.ext4: Attempt to read block from filesystem resulted in short read while trying to open /dev/sdc2
Could this be a zero-length partition?


kubuntu@kubuntu:~$ sudo fsck.ext4 -v /dev/sdc2
e2fsck 1.42.5 (29-Jul-2012)
   fsck.ext4: Attempt to read block from filesystem resulted in short read while trying to open /dev/sdc2
Could this be a zero-length partition?


kubuntu@kubuntu:~$ dmesg | tail
[ 2684.532855] Descriptor sense data with sense descriptors (in hex):
[ 2684.532858]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
[ 2684.532876]         05 3f c8 b0 
[ 2684.532885] sd 5:0:0:0: [sdc]  
[ 2684.532893] Add. Sense: Unrecovered read error - auto reallocate failed
[ 2684.532898] sd 5:0:0:0: [sdc] CDB: 
[ 2684.532902] Read(10): 28 00 05 3f c8 b0 00 00 08 00
[ 2684.532917] end_request: I/O error, dev sdc, sector 88066224
[ 2684.532927] Buffer I/O error on device sdc2, logical block 22
[ 2684.532973] ata6: EH complete

幫助我 Unix 和 Linux,你是我們唯一的希望。

可能仍有希望,但您的驅動器似乎有硬體問題(我對dmesg輸出中讀取錯誤的解釋)。

您應該嘗試將可從該分區恢復的內容複製到另一個驅動器(以最大程度地減少磁碟訪問)。使用ddrescue它,它可能需要一段時間,但如果不是全部的話,它會獲取分區的大部分可恢復數據。

如果可能的話,從另一張光碟、Live CD 啟動,或者將驅動器連接到另一台有自己的 Linux 啟動的電腦。我這樣做的原因是讀取錯誤ddrescue可能會影響其他分區上的磁碟訪問速度。

獲得該副本後,我們將其稱為原始副本,作為另一張光碟上的文件,製作該副本的副本。然後嘗試對該副本進行文件系統檢查。如果該恢復擾亂了副本,您可以從原始副本開始,然後再試一次,其他的。

(我知道這是一個老問題,我自己也遇到了這個問題,並且沒有 FS 讓我的 FS 起死回生ddrescue,所以我會為遇到這個問題的其他人分享經驗)

Ext文件系統儲存超級塊的備份——就像這樣的一個場合。

首先,確定備份的位置(**確保您有 -n 選項!**否則這將用新的文件系統擦除文件系統):

mke2fs -n /dev/sdxx

這是 FS 創建常式的測試執行(即不寫入)。如果它正在創建文件系統,它將讓您知道*它將放置超級塊備份的位置的偏移量。*如果您知道您的 FS 塊大小不是 4096,您還必須指定參數-b {blocksize}以獲得正確的數字。

對於 4096 大小的塊,第一個備份超級塊將位於32768. 如果以下操作失敗並顯示有關壞超級塊/短讀取的相同錯誤消息,請嘗試從列表中mke2fs為您提供的下一個超級塊備份。

接下來,您可以像這樣使用備份超級塊掛載文件系統

mount -o sb=32768 /dev/sdxx /mnt/sdxx

然後從文件管理器中探索 FS,複製未損壞的文件等。

或者,要實際修復 FS,您可以fsck像這樣使用備份超級塊執行

e2fsck -fy -b 32768 /dev/sdxx

-f即使磁碟不髒,它也可以掃描磁碟,並對有關-y修復內容的所有查詢回答“是”。該-b選項除了指定備份超級塊外,還會使用備份中的資訊更新原始超級塊。

在此之後,您應該恢復文件系統。

如果 e2fsck 無法寫入主超級塊 如果超級塊因為壞扇區而損壞,e2fsck將完成執行,嘗試更新超級塊,並給您以下錯誤消息:

Error writing block 1 (Attempt to write block from filesystem resulted in short write)

顯然,主超級塊沒有更新,整個e2fsck執行都是徒勞的。

您需要提示磁碟重新映射該扇區 - 通過向其寫入零。感謝@Keith 指出這一點:如果輸入錯誤,下一個命令可能會造成很多混亂,因此在執行前請三重檢查。這是魔術:

dd if=/dev/zero of=/dev/sdxx bs=4096 count=1 seek=0

這將在偏移量 0 處將 1 個 4096 大小的零塊寫入sdxx。如果是這種情況,請不要忘記考慮不同的塊大小。

之後,您將能夠寫入超級塊(這將對您透明地位於不同的物理扇區)。現在,您e2fsck再次執行上面的命令,它應該會成功寫入允許您正常掛載 FS 的超級塊。

不言而喻現在您應該將關鍵數據備份到另一個物理驅動器,如果您仍打算使用文件系統,請執行

e2fsck -fccy /dev/sdxx

PS感謝@Nemo 在此發現上:如果您的 FS 的超級塊的所有備份都已損壞,mke2fs/mkfs請使用*-S*選項重新創建超級塊和組描述符,就像創建新文件系統一樣,而無需觸及其他任何東西. 但是你絕對必須確保你的塊大小是正確的,並且手冊頁說你應該追隨e2fsck它,並且不能保證留下數據以供救援。閱讀手冊頁並在此答案上加分。

引用自:https://unix.stackexchange.com/questions/114429