嘗試打開分區時的短讀
在我執行 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
它,並且不能保證留下數據以供救援。閱讀手冊頁並在此答案上加分。