注意
本文僅理論探討,真實數據恢復,敬請先參考:
《Linux ext4 rm 誤刪,用extundelete恢復失敗/報錯,無數血淚教訓!!!附:ext4誤刪後的正確處理步驟》
https://blog.csdn.net/weixin_42745590/article/details/86418144
基本概念
1扇區(sector)=512字節(byte)
1數據塊(block)=8扇區=4KB(mkfs時指定,默認4KB,可設置爲1KB - 64KB)
Ext4字段使用little-endian順序寫入磁盤;但journal日誌使用big-endian順序寫入磁盤。
ext4文件系統結構
- 塊設備被劃分爲多個group
- Super block在Group 0中, backup super block存放在其它group的頭部
SuperBlock
superblock記錄文件系統的各種信息,例如block總數,inode總數,支持的功能,維護信息等。如果sparse_super置位,則superblock和組描述符的副本僅保留在Group編號爲0或3、5、7……的Group中。如果未設置該標誌,superblock在所有組中均有副本。
Magic signature=0x53EF,位於偏移0x38,即56字節處。UUID位於偏移0x68:
塊組描述段
即Block Group Descriptor,描述本group的inode信息、datablock信息
當block=1kb時,BGD起始於block2
當block>1kb時,BGD起始於block1
本案例中爲block=1kb,則BGD起始了block2
Inodetable位於BGD偏移0x8處,:
inode table
Inode字段定義:
如果文件<=12個block,inode中可以直接存儲其所有block指針。
如果文件的block數據在13個block 至【 ($block_size / 4) ^ 3 + ($block_size / 4) ^ 2 + ($block_size / 4) + 12】個block之間,則需要藉助多級索引來存儲所有數據塊。本案例block=1kb,三線索引inode可存儲16777216+65536+268=16843020byte,大概16MB文件。
inode中有15個指針數組,其中12個是直接索引,後面三個分別是一級索引、二級索引和三級索引。如下圖示:
如果文件大於16MB,則需要inode開啓擴展屬性i_extra_isize,使用Extent Tree,本文不再展開。
Group0的inode table處數值爲0x0124,即block292,即 292*2=584扇區:
datablock
如上圖,文件Inode爲14
- 定位Group:(14-1)/2032=0,位於Group0。(注:此例中,每Group包含2032個inode)
- 定位Group-inode:(14-1)% 2032=13,位於第13個inode
Group0 inode table起始於block 292,
而inode14位於(14-1)*128=1664 byte = 0x680 byte .
Inode偏移60byte=0x3C byte處,記錄了文件的數據塊索引,下圖爲0x000029b7:
第0x000029b7=10679個數據塊,位於:10679*1024byte/512byte=21358扇區,下圖顯示爲文件的真實內容:
Ext4引入 “Extents”概念,可參考《Linux ext4文件系統原理(二)-大文件Extent結構解析及數據恢復實例-rm誤刪恢復》
技術支持
溫馨提示:如重要數據丟失,還請在行動前諮詢專業工程師建議,以免數據遭到二次破壞。