原始碼分析網上太多了,不寫了,記錄簡單的實踐步驟:
cd /tmpddif=/dev/zero of=ext2-1m.img bs=1024 count=1024
mkfs.ext2 ext2-1m.img
mkdir
ext2
sudo
mount -o loop ext2-1m.img ext2
cd ext2所以超級快的位址為1 * 1024 = 0x400,可以對照著資料結構ext2_super_block來分析檔案內容,通過/sbin/dumpe2fs /dev/loop0來驗證分析是否正確。touch
test
echo
"test content
" > test
第乙個組描述符在第二個block: 0x800,類似的可以對照著資料結構ext2_group_desc來分析檔案內容,通過/sbin/dumpe2fs來驗證結果。
找到了組描述符便可以找到資料快位圖(bg_block_bitmap)、索引節點位圖(bg_inode_bitmap)、索引節點表(bg_inode_table)等結構的位置。
檢視測試檔案的索引節點編號:
每個group裡的索引節點個數為ext2_super_block.s_inodes_per_block,在結構體ext2_super_block中的偏移量40,也就是為0x28,因此在檔案中的位址為0x428:
0x428處的值為0x00000080,也就是128,因此節點編號12(編號從1開始)所在的group為(12 -1 ) / 128 = 0,也就是第乙個group;在inode table中的下標為(12 -1) % 128 = 11。
inode table的位址在ext2_group_desc.bg_inode_table,檔案中位址為0x808,值為0x0008,也就是inode table起始於第八個blcok,位址為1024*8=0x2000。
每個inode大小為128位元組,因此inode table index為11的inode位址為11 * 128 + 0x2000 = 0x002580:
該位址對應結構體ext2_inode:
structi_size為0x0d,i_block偏移量為0x28,檔案中位址為0x0025a8,i_block[0]的值為0x0026:ext2_inode linux1;
struct
hurd1;
struct
masix1;
} osd1;
/*os dependent 1
*/__le32 i_block[ext2_n_blocks];
/*pointers to blocks
*/__le32 i_generation;
/*file version (for nfs)
*/__le32 i_file_acl;
/*file acl
*/__le32 i_dir_acl;
/*directory acl
*/__le32 i_faddr;
/*fragment address
*/union linux2;
struct
hurd2;
struct
masix2;
} osd2;
/*os dependent 2
*/};
《深入理解linux核心》
ext2檔案系統
ext2磁碟結構 ext2分割槽和ext2分組的分布圖 下圖是借用其他部落格的 塊組中的每個塊包含的資訊 超級快 1個塊 描述該分割槽中的整個檔案系統的資訊,包括有多少個快組,每個快組有多少個塊,多少個索引節點等。組描述符塊 n塊 塊點陣圖 1塊 索引節點位圖 1塊 索引節點 n塊 資料塊 n塊 塊...
Ext2檔案系統
ext2檔案系統的總體布局,如下圖。1檔案系統的最小儲存單元是塊 block 塊的大小一般為512bytes,或者是它的整數倍,塊的大小是在格式化是所確定的。不能修改除非重新格式化。上圖中顯示了檔案系統的總體布局,由乙個boot block和對個block group組成,每個block group...
掛載EXT2檔案系統
檔案系統的安裝主要是通用mount命令來實現的,然後通過系統呼叫由使用者態進入到核心態,把某乙個分割槽下的檔案系統掛載到某乙個目錄下,當然掛載也可以能指定掛載的檔案系統。mount函式通過sys mount函式來實現,其具體函式如下 asmlinkage long sys mount char us...