linux內核研究筆記7(minix文件系統總結)

《linux內核完全註釋》第12章對minix文件系統已經作了比較詳細的說明。本文做些簡單的總結並且做些實踐的記錄。

以12章360k的存儲磁盤爲例,如下圖:

該圖基本上還是包含了minix文件系統的各個成分,但是有些東西說得還是不夠。

1.一個文件系統,在格式化構建文件系統的時候,很多信息都已經被確定下來了,比如i節點位圖所佔存儲塊數量,邏輯塊位圖所佔存儲塊數量,i節點所佔空間等等。

2.上圖有些地方容易讓人誤導,以爲i節點位圖和邏輯塊位圖就僅佔一個塊,i節點佔4個塊。這是不對的,這個數量在初始化文件系統的時候決定下來,不同大小的存儲介質,這些東西都是不一樣的。上圖應該弄些說明可能更準確些。

3.超級塊用來指定整個文件系統的信息。比如索引節點數量,第一個數據塊起始編號等等。

4.i節點簡單理解就是具體的單個文件信息。目錄也是一個文件,無非目錄的數據區存儲的是目錄項,目錄項包含i節點編號和文件名字符串。

下面以具體的例子來說明一個minix文件系統的細節:

1.首先我們在ubuntu系統裏面構建一個minix文件系統的鏡像。

sunke@sunke-E440:~/work/temp/filesystem$ dd if=/dev/zero of=minix.img bs=1k count=360
記錄了360+0 的讀入
記錄了360+0 的寫出
368640 bytes (369 kB, 360 KiB) copied, 0.00172698 s, 213 MB/s
sunke@sunke-E440:~/work/temp/filesystem$ mkfs.minix minix.img
128 inodes
360 blocks
Firstdatazone=8 (8)
Zonesize=1024
Maxsize=268966912

我們構建了一個minix.img鏡像文件,這個鏡像文件格式化成minix文件系統。大小爲360k,從輸出信息可以知道,有些數據在格式化之後,就確定下來,比如:

(1)總共128個i節點

(2)總共360個塊

(3)第一個數據區編號爲8

(4)zone的大小是1024字節

(5)文件最大尺寸是268966912

爲啥第一個數據區從8開始?第一個引導塊,第二個是超級塊,可見3~7的5個區塊留給位圖區和i節點區。至於這些分別佔用多少區塊,需要從超級塊的數據裏面獲得,現在還不知道。

2.掛載這個鏡像文件,然後人爲生成一些文件和目錄。

sunke@sunke-E440:~/work/temp/filesystem$ mkdir mnt
sunke@sunke-E440:~/work/temp/filesystem$ sudo mount minix.img -o loop mnt
sunke@sunke-E440:~/work/temp/filesystem/mnt$ tree
.
├── bbb.txt
└── mydir
    └── aaa.txt

1 directory, 2 files
sunke@sunke-E440:~/work/temp/filesystem/mnt$ cat bbb.txt 
bbb
sunke@sunke-E440:~/work/temp/filesystem/mnt$ cat mydir/aaa.txt 
aaa
sunke@sunke-E440:~/work/temp/filesystem/mnt$ sync

3.查看minix.img鏡像裏面的數據。輸出如下:

4.對比引導塊。我們發現這1k數據都是0。我們沒有使用引導塊,保留。

00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*

5.對比超級塊。

00000400  80 00 68 01 01 00 01 00  08 00 00 00 00 1c 08 10  |..h.............|
00000410  8f 13 00 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  |................|
*

對應超級塊的結構體和字段數據如下:

struct d_super_block {
	unsigned short s_ninodes;      //0x0080,十進制128,inode總共128個
	unsigned short s_nzones;       //0x0168,十進制360,總共360個zone
	unsigned short s_imap_blocks;  //0x0001,十進制1,inode位圖佔1個塊
	unsigned short s_zmap_blocks;  //0x0001,十進制1,zone位圖佔1個塊
	unsigned short s_firstdatazone;//0x0008,十進制8,第一個數據區編號是8
	unsigned short s_log_zone_size;//0x0000,log表示的一塊數據大小,1kb
	unsigned long s_max_size;      //0x10081c00,十進制268966912,最大文件長度
	unsigned short s_magic;        //0x138f,minix魔數
};

以上纔多少字節,肯定不能完全佔用1k啊,但是規定就是這樣,就算不能佔用所有1k空間,也給你留着,以備不時之需。可以看到,沒有用到數據區全部爲0。

6.對比i節點位圖。

一個比特位0/1表示一個i節點是否被使用。

00000800  1f 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000810  fe ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
00000820  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*

我們看到前面16個字節,第一個字節是0x1f=0b00011111,後面15個字節都是0。16個字節剛好等於128位,由超級塊可知,總共有128個i節點。第一個位圖不用,但是置爲1,這樣一算,是不是少了一位了,只有127位。我們看到後面有一個0xfe,這裏還有一位是0,加上之前16字節裏面的127位,剛好是128個位。

7.對比數據區塊位圖。

00000c00  1f 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  |................|
00000c20  00 00 00 00 00 00 00 00  00 00 00 00 fe ff ff ff  |................|
00000c30  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*

以上從0x1f到0xfe,出去第一位不用,剛好352個位圖。這個應該是數據區塊的位圖佔用記錄,而第一個數據區從8開始。

8.對比i節點數據。

minix使用32字節的結構表示一個i節點的數據,其結構體如下:

struct m_inode {
	unsigned short i_mode;    //0x41ed,040755, 目錄文件, rwxr-xr-x
	unsigned short i_uid;     //0x03e8, 1000
	unsigned long i_size;     //0x00000080, 128
	unsigned long i_mtime;    //0x5cb93ad2
	unsigned char i_gid;      //0xe8
	unsigned char i_nlinks;   //0x03
	unsigned short i_zone[9]; //0x08,i_zone[0]=8,數據塊在第8號區塊
};

9.對比數據區。

第一塊數據區,實際上是根目錄的數據區,根目錄的數據區裏面存放的是目錄項,每個目錄項,minix2.0是32位,minix1.0是16位。一個目錄項表示一個目錄或者文件,其中2字節表示這個目錄或者文件的inode節點序號,剩下的字節用於存放文件名字符串。其中第一個目錄項表示'.',第二個表示'..'。如下:

00002000  01 00 2e 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00002010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

前面兩個字節0x0001,表示節點序號爲1,後面0x2e是'.'字符的ascii碼。依次類推,就不一一舉例了。

如果是普通文件的數據區,則直接存放文件內容,具體在什麼數據區由i節點數據表示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章