Linux文件系統(tǒng):minix文件系統(tǒng)二進(jìn)制分析(格式化)
1. minix文件系統(tǒng)二進(jìn)制分析1:剛剛格式化后的文件系統(tǒng)
工作幾年來,用過不少文件系統(tǒng),甚至手把手移植和裁剪過Fatfs文件系統(tǒng),但是卻對文件系統(tǒng)內(nèi)部的存儲方式和玩兒法一直一無所知,于是決定好好把文件系統(tǒng)的運行機制好好研究研究,但是現(xiàn)存文件系統(tǒng)的類型百花齊放,各有千秋,還是決定從minix文件系統(tǒng)入手,這是早期在minix系統(tǒng)上用的一種簡單的文件系統(tǒng),所謂麻雀雖小五臟俱全,正好可以做來了解文件系統(tǒng)之用,從而洞察后來更加復(fù)雜的文件系統(tǒng),萬變不離其宗,深入剖析了minix文件系統(tǒng),理解其他類型的文件系統(tǒng)也就舉一反三手到擒來了。
1.1 創(chuàng)建硬盤
既然要研究文件系統(tǒng),首先我們得找一個u盤,翻了翻我封印已久的抽屜,竟然找不到一個U盤,幸好虛擬機這項技術(shù)的出現(xiàn)方便了像我這樣舍不得花錢買U盤的人…
我們能在Windows系統(tǒng)下的VmWare中安裝一個Ubuntu系統(tǒng),更何況虛擬一個硬盤?本章將在虛擬機里創(chuàng)建一個16M的硬盤作為起點,來一步一步分析minix文件系統(tǒng)。
1.1.1 添加一個16M的塊設(shè)備
在Ubuntu虛擬機中添加一個大小為16M的塊設(shè)備,此時還沒有將其進(jìn)行文件系統(tǒng)格式化

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。∏?00名進(jìn)群領(lǐng)取,額外贈送一份價值699的內(nèi)核資料包(含視頻教程、電子書、實戰(zhàn)項目及代碼)?


1.1.2 格式化塊設(shè)備
在終端輸入 fdisk -l指令查看所有塊設(shè)備信息,可以找到 /dev/sdb設(shè)備即為上一步驟創(chuàng)建的硬盤。

格式化硬盤為minix文件系統(tǒng)

根據(jù)格式化后的信息,我們可以知道,硬盤上的minix文件系統(tǒng)一共有5472個inodes,也就是說最多能在上面創(chuàng)建5472個文件,一共16384個數(shù)據(jù)塊,F(xiàn)irstdatazone=176 表示第一個node節(jié)點位于第176個塊,Maxsize表示每個文件支持的最大長度。
接下來,我們使用hexdump -C /dev/sdb > minix_orig.dat 將硬盤的2進(jìn)制數(shù)據(jù)dump出來,如下圖所示,特備強調(diào),此時的minix文件系統(tǒng)只有一個根目錄,其他什么都沒有,干干凈凈。
00000000 ?00 00 00 00 00 00 00 00 ?00 00 00 00 00 00 00 00 ?|................|
*
00000400 ?60 15 00 40 01 00 02 00 ?b0 00 00 00 00 1c 08 10 ?|`..@............|
00000410 ?8f 13 01 00 00 00 00 00 ?00 00 00 00 00 00 00 00 ?|................|
00000420 ?00 00 00 00 00 00 00 00 ?00 00 00 00 00 00 00 00 ?|................|
*
00000800 ?03 00 00 00 00 00 00 00 ?00 00 00 00 00 00 00 00 ?|................|
00000810 ?00 00 00 00 00 00 00 00 ?00 00 00 00 00 00 00 00 ?|................|
*
00000aa0 ?00 00 00 00 00 00 00 00 ?00 00 00 00 fe ff ff ff ?|................|
00000ab0 ?ff ff ff ff ff ff ff ff ?ff ff ff ff ff ff ff ff ?|................|
*
00000c00 ?03 00 00 00 00 00 00 00 ?00 00 00 00 00 00 00 00 ?|................|
00000c10 ?00 00 00 00 00 00 00 00 ?00 00 00 00 00 00 00 00 ?|................|
*
000013e0 ?00 00 00 00 00 00 00 00 ?00 00 fe ff ff ff ff ff ?|................|
000013f0 ?ff ff ff ff ff ff ff ff ?ff ff ff ff ff ff ff ff ?|................|
00001400 ?ed 41 00 00 40 00 00 00 ?88 09 a1 61 00 02 b0 00 ?|.A..@......a....|
00001410 ?00 00 00 00 00 00 00 00 ?00 00 00 00 00 00 00 00 ?|................|
*
0002c000 ?01 00 2e 00 00 00 00 00 ?00 00 00 00 00 00 00 00 ?|................|
0002c010 ?00 00 00 00 00 00 00 00 ?00 00 00 00 00 00 00 00 ?|................|
0002c020 ?01 00 2e 2e 00 00 00 00 ?00 00 00 00 00 00 00 00 ?|................|
0002c030 ?00 00 00 00 00 00 00 00 ?00 00 00 00 00 00 00 00 ?|................|
*
01000000
1.2 minix文件系統(tǒng)的存儲結(jié)構(gòu)
minix文件系統(tǒng)的存儲結(jié)構(gòu)分為五大部分,其他類型的文件系統(tǒng)也是大同小異


1.2.1 超級塊
超級塊代表了整個文件系統(tǒng),超級塊是文件系統(tǒng)的控制塊,有整個文件系統(tǒng)信息,在格式化操作完成后,超級塊的信息基本就已經(jīng)定型了,可以說,一個超級塊就代表了一個文件系統(tǒng)。
值得一提的是,當(dāng)我們在linux終端mount某個塊設(shè)備時,內(nèi)核會讀取超級塊的信息,完成文件系統(tǒng)的掛載。
1.2.1.1 linux中超級塊數(shù)據(jù)結(jié)
內(nèi)核掛載文件系統(tǒng)時,先去獲得超級塊的信息并保存在內(nèi)核數(shù)據(jù)結(jié)構(gòu)中
/*
* minix super-block data on disk
*/
struct minix_super_block {
__u16 s_ninodes; ? ? ? ? ? ? ? ? ?
__u16 s_nzones; ? ? ? ? ? ? ? ? ? ?
__u16 s_imap_blocks; ? ? ? ? ? ?
__u16 s_zmap_blocks; ? ? ? ? ? ?
__u16 s_firstdatazone; ? ? ? ? ?
__u16 s_log_zone_size;
__u32 s_max_size;
__u16 s_magic;
__u16 s_state;
__u32 s_zones;
};

1.2.2 inode節(jié)點
1.2.2.1 內(nèi)核數(shù)據(jù)結(jié)構(gòu)
如下圖所示,內(nèi)核中的struct minix_inode數(shù)據(jù)結(jié)構(gòu)也是minix文件系統(tǒng)inode節(jié)點信息在存儲介質(zhì)中的存儲方式,接下來我們對照dump文件中的數(shù)據(jù),來看一下inode的值。
/*
* This is the original minix inode layout on disk.
* Note the 8-bit gid and atime and ctime.
*/
struct minix_inode {
__u16 i_mode;
__u16 i_uid;
__u32 i_size;
__u32 i_time;
__u8 ?i_gid;
__u8 ?i_nlinks;
__u16 i_zone[9];
};
1.2.2.2 萬物之源No1節(jié)點—根目錄
當(dāng)用戶執(zhí)行vim /dirdemo/filelevel2.txt操作時,在文件系統(tǒng)中是如何找到filelevel2.txt文件,并將其內(nèi)容顯示出來的呢?
太極生兩儀,兩儀生四象,四象生八卦,宇宙再大,最開始也是從一個點,任何事物都有其起源,文件系統(tǒng)的起點便是從根目錄開始,所以在我們格式化硬盤之后,inode節(jié)點只有一個,那就是表示根目錄的inode節(jié)點。
在超級塊的屬性當(dāng)中有一個s_firstdatazone屬性,該值作為查找文件的門戶,其指向的是根目錄的數(shù)據(jù)區(qū),174x1024=0x2c000。
在文件系統(tǒng)的inode區(qū),第一個inode節(jié)點便是根目錄節(jié)點,如下圖所示。

關(guān)于minix文件系統(tǒng)中,inode的各個屬性,linux內(nèi)核定義了下述結(jié)構(gòu)體類型進(jìn)行存儲。

1.2.3 第一個數(shù)據(jù)塊
No1節(jié)點的i_zone指向了地址0x2c000,接下來我們看一下0x2c000地址處存放的數(shù)據(jù),如下圖紅框所示,前兩行是對鏈接’.‘的目錄描述,其指向的inode節(jié)點編號為1,即根目錄,后兩行是對目錄’…'的描述,它也指向inode 1節(jié)點。

