Data-Recovery

我可以找出給定的 ext4 塊是否在 inode 表中,如果是,我可以手動從沒有標題的日誌中挑選它嗎?

  • December 30, 2016

因此,在從我的舊筆記型電腦到新筆記型電腦的途中,我的舊筆記型電腦的硬碟受到了一些物理損壞。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  +

我使用 debugfsichecktestb命令進行了註釋;所有損壞的塊都標記為已使用。一些超級塊統計數據:

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

所以我的問題是:

  1. 如果不是 inode 條目,我能否準確找出這五個未知塊是什麼?我懷疑它們是 inode 表條目,但icheck不想說。如果是,我可以找出哪些 inode 嗎?
  2. 即使日誌的前 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

如果我不夠奇怪,下載的圖片是:

這些都是朋友在聊天中分享的。

我想我會保持更新?(不像它會有所作為……)我知道我可以恢復一切;唯一的問題是當 =P

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