我可以找出給定的 ext4 塊是否在 inode 表中,如果是,我可以手動從沒有標題的日誌中挑選它嗎?
因此,在從我的舊筆記型電腦到新筆記型電腦的途中,我的舊筆記型電腦的硬碟受到了一些物理損壞。
badblocks
報告 64 個壞扇區。我有一個兩個月大的 Ubuntu GNOME 設置,帶有拆分/
和/home
分區。據我所知,其中的幾個扇區/
已損壞,但這不是問題。另一方面,/home
的分區給了我這個帶註釋的 ddrescue 日誌:# Rescue Logfile. Created by GNU ddrescue version 1.17 # Command line: ddrescue -d -r -1 /dev/sdb2 home.img home.log # current_pos current_status 0x6788008400 - # pos size status 0x00000000 0x6788000000 + 0x6788000000 0x0000A000 - first 10 sectors of the ext4 journal 0x678800A000 0x2378016000 + 0x8B00020000 0x00001000 - inode table entries for /pietro (my $HOME) and a few folders within 0x8B00021000 0x00006000 + 0x8B00027000 0x00001000 - unknown (inode table?) 0x8B00028000 0x00004000 + 0x8B0002C000 0x00001000 - unknown (inode table?) 0x8B0002D000 0x001DC000 + 0x8B00209000 0x00001000 - unknown (inode table?) 0x8B0020A000 0x00090000 + 0x8B0029A000 0x00001000 - unknown (inode table?) 0x8B0029B000 0x4420E65000 +
我使用 debugfs
icheck
和testb
命令進行了註釋;所有損壞的塊都標記為已使用。一些超級塊統計數據:Block size: 4096 Fragment size: 4096 Reserved GDT blocks: 972 Blocks per group: 32768 Fragments per group: 32768 Inodes per group: 8192 Inode blocks per group: 512
所以我的問題是:
- 如果不是 inode 條目,我能否準確找出這五個未知塊是什麼?我懷疑它們是 inode 表條目,但
icheck
不想說。如果是,我可以找出哪些 inode 嗎?- 即使日誌的前 10 個塊失去,我仍然可以手動從日誌中恢復這些 inode 表條目嗎?
我寧願不使用 進行此數據恢復
fsck
,這只會將我所有的文件轉儲到/lost+found
一大堆扁平的目錄結構和重複文件中……謝謝。
好的,所以對於第一個問題,結果證明該
debugfs
stats
命令告訴了組中每個部分的起始塊是什麼。另外,我猜想inumbers必須是連續且遞增的,所以基本將偏移量添加到inode表中,imap
命令給了我第一個inumbers;它也證實了我對最後一個壞扇區的懷疑,我的塊組計算表明它在錯誤的組中。byte address block group what first inumber 0x8B00020000 145752096 4448 inode table block 0 36438017 0x8B00027000 145752103 4448 inode table block 7 36438129 0x8B0002C000 145752108 4448 inode table block 12 36438209 0x8B00209000 145752585 4448 inode table block 489 36445841 0x8B0029A000 145752730 4449 inode table block 122 36448161
由於一個塊是 4096 字節,每個 inode 表條目是 256 字節,因此每個塊有 16 個 inode。因此,我現在按編號失去了所有 80 個 inode 表條目。
現在讓我們轉向期刊。我寫了一個小工具,可以在日誌的每個塊中轉儲資訊。由於缺少日誌超級塊,因此我需要的兩條資訊失去了:
- 日誌是否包含 64 位塊號
- 期刊是否使用了版本 3 校驗和
幸運的是,如果我強制打開這些開關中的一個(或兩個),日誌中的一些描述符塊會溢出它的塊,證明這些標誌沒有設置。
一個 awk 腳本 (
fulllog.awk
) 之後,我有一個表單的日誌0x0002A000 - descriptors 0x0002B000 -> block 159383670 0x0002C000 -> block 159383671 0x0002D000 -> block 0 0x0002E000 -> block 155189280 0x0002F000 -> block 195559440 0x00030000 -> block 47 0x00031000 -> block 195559643 0x00032000 -> block 195568036 0x00033000 -> block 159383672 0x0002B000 - invalid/data block 0x0002C000 - invalid/data block 0x0002D000 - invalid/data block 0x0002E000 - invalid/data block 0x0002F000 - invalid/data block 0x00030000 - invalid/data block 0x00031000 - invalid/data block 0x00032000 - invalid/data block 0x00033000 - invalid/data block 0x00034000 - commit record commit time: 2014-12-25 16:53:13.703902604 -0500 EST
這樣,另一個 awk 腳本 (
dumpallfor.awk
) 會轉儲所有塊:byte address block number of journaled blocks 0x8B00020000 145752096 6 0x8B00027000 145752103 10 0x8B0002C000 145752108 206 0x8B00209000 145752585 1 0x8B0029A000 145752730 0
debugfs
所以最後一個塊真的失去了:(運氣好的話,我可以用’sncheck
命令找出那裡有哪些文件。所以我有一堆積木。而且它們似乎都不同!怎麼辦?
我可以查看吊銷記錄,但我似乎無法有意義地解析該結構。我可以查看送出記錄時間戳,但在嘗試之前,我想看看每個 inode 表塊有何不同。因此,我編寫了另一個快速程序(
diff.go
) 來找出答案。在大多數情況下,確實不同的文件僅在時間戳上有所不同,因此我們可以選擇具有最新時間戳的文件。我們稍後會這樣做。對於所有其他文件,我們得到這個:
36438023 - size differs 36438139 - OSD1 (file version high dword) differs 36438209 - OSD1 differs
嗯,不好……文件大小不一樣會出問題,不知道怎麼處理這兩個OSD1文件。我也嘗試使用
debugfs
’sncheck
查看文件是什麼,但我們沒有匹配。然後我發現哪些塊轉儲現在具有最新的時間戳(相同的 repo,
latest.go
)。需要注意的重要一點是,我按送出時間按時間順序掃描了塊。這不一定與塊號的數字順序相同;日誌並不總是按時間遞增的順序儲存。然而,事實證明,最新的塊(按送出時間)確實是具有最新時間戳的塊!
讓我們試試這些最新的塊,看看我們是否可以從中恢復任何東西。
sudo dd if=BLOCKFILE of=DDRESCUEIMG bs=1 seek=BYTEOFFSET conv=notrunc
之後我的主目錄又回來了!
現在讓我們找出這三個不同的文件是什麼……
Inode Pathname 36438023 /pietro/.cache/gdm/session.log 36438209 /pietro/.config/liferea 36438139 /pietro/.local/share/zeitgeist/fts.index
唯一重要的是 Liferea 的配置目錄,但我不認為它已損壞;它是OSD1 不同的之一。
讓我們找出最後一個塊中的 16 個 inode,即我們無法恢復的那個:
Inode Pathname 36448176 /pietro/k2 36448175 /pietro/Downloads/sOMe4P7.jpg 36448174 /pietro/Downloads/picture.png 36448164 /pietro/Downloads/tumblr_nfjvg292T21s4pk45o1_1280.png 36448169 /pietro/Downloads/METROID Super Zeromission v.2.3+HARD_v2.4.zip 36448165 /pietro/Downloads/tumblr_mrfex1kuxa1sbx6kgo1_500.jpg 36448173 /pietro/Downloads/1*-vuzP4JAoPf9S6ZdHNR_Jg.jpeg 36448162 /pietro/.cache/upstart/gnome-settings-daemon.log.6.gz 36448163 /pietro/.cache/upstart/dbus.log.7.gz 36448171 /pietro/.cache/upstart/gnome-settings-daemon.log.3.gz 36448161 /pietro/.local/share/applications/Knytt Underground.desktop 36448166 /pietro/Documents/Screenshots/Screenshot from 2014-12-03 15:47:29.png 36448170 /pietro/Documents/Screenshots/Screenshot from 2014-12-03 16:51:26.png 36448172 /pietro/Documents/Screenshots/Screenshot from 2014-12-03 19:08:54.png 36448168 /pietro/Documents/transactions/premiere to operating transaction 4305747926.pdf 36448167 /pietro/Documents/transactions/transaction 4315883542.pdf
簡而言之:
- 一個只有一兩件事的文本文件,因為我知道它有一個日期戳,而且我的聊天日誌中也有一些東西,所以我可以通過蠻力找回
- 從網上下載的一些圖片;如果我無法從 Firefox 的歷史記錄中獲取 URL,那麼我可以使用 photorec
- 一個我可以很容易地再次上網的 ROM hack =P
- 日誌文件; 這裡沒有損失
- Steam 遊戲的 .desktop 文件
- 截圖;假設 gnome-screenshot 將日期戳添加為元數據,我可以使用 photorec 取回這些
- 銀行賬戶交易記錄;如果我不能從銀行得到它們,我可能可以將它們與 photorec 一起使用
所以不是沒有傷亡,但也不是完全的損失,而且我在這個過程中了解了更多關於 ext4 的資訊。不管怎麼說,還是要謝謝你!
更新
不妨把這個放在那裡:
NOT YET /pietro/k2 FOUND /pietro/Downloads/sOMe4P7.jpg NOT YET /pietro/Downloads/picture.png FOUND /pietro/Downloads/tumblr_nfjvg292T21s4pk45o1_1280.png GOOGLEIT /pietro/Downloads/METROID Super Zeromission v.2.3+HARD_v2.4.zip FOUND /pietro/Downloads/tumblr_mrfex1kuxa1sbx6kgo1_500.jpg FOUND /pietro/Downloads/1*-vuzP4JAoPf9S6ZdHNR_Jg.jpeg UNNEEDED /pietro/.cache/upstart/gnome-settings-daemon.log.6.gz UNNEEDED /pietro/.cache/upstart/dbus.log.7.gz UNNEEDED /pietro/.cache/upstart/gnome-settings-daemon.log.3.gz UNNEEDED /pietro/.local/share/applications/Knytt Underground.desktop NOT YET /pietro/Documents/Screenshots/Screenshot from 2014-12-03 15:47:29.png NOT YET /pietro/Documents/Screenshots/Screenshot from 2014-12-03 16:51:26.png NOT YET /pietro/Documents/Screenshots/Screenshot from 2014-12-03 19:08:54.png NOT YET /pietro/Documents/transactions/premiere to operating transaction 4305747926.pdf NOT YET /pietro/Documents/transactions/transaction 4315883542.pdf
如果我不夠奇怪,下載的圖片是:
sOMe4P7.jpg
(對法律與秩序標題卡的模仿,添加了“& KNUCKLES”)tumblr_nfjvg292T21s4pk45o1_1280.png
(來自 JK Rowling的這條推文的截圖)tumblr_mrfex1kuxa1sbx6kgo1_500.jpg
(“Windows 未成功關閉。”廣告牌上的錯誤消息的圖片似乎是某項體育賽事)1*-vuzP4JAoPf9S6ZdHNR_Jg.jpeg
(這個漫畫)這些都是朋友在聊天中分享的。
我想我會保持更新?(不像它會有所作為……)我知道我可以恢復一切;唯一的問題是當 =P