Linux最傳統的磁盤文件系統(filesystem)使用的是ext2,所以要了解文件系統就得要由ext2開始。
一、文件系統特性
磁盤分區完畢後還需要進行格式化,之後操作系統才能夠使用這個分區。這是因為每種操作系統所設置的文件屬性/權限並不相同,為了存放這些文件所需的數據,因此就需要將分區進行格式化,以成為操作系統能夠利用的文件系統格式。傳統的磁盤與文件系統的應用中,一個分區誻只能夠被格式化成為一個文件系統,所以我們可以說一個文件系統就是一個分區。
操作系統的文件數據除文件內容外,通常還有非常多的屬性,Linux中的文件權限(rxw)與文件屬性(所有者,群組、時間參數等)。文件系統通常會將這兩部分數據分別存放在不同的塊,權限與屬性放置到inode中,至於實際數據則放置到data block塊中。另外還有一個超級塊(super block)會記錄整個文件系統的的整體信息,包括inode與block的總量、使用量、剩余量,以及文件系統的格式與相關信息等。
inode:記錄文件的屬性,一個文件占用一個inode,同時記錄此文件的數據所在的block號碼。
block:實際記錄文件的內容,若文件太大時,會占用多個block。
由於每個inode與block都有編號,而每個文件都會占用一個inode,inode內則有文件數據放置的block號碼。因此,如果能找到文件的inode的話,那麼自然就會知道這個文件所放置數據的block號碼,也就能夠讀出該文件的實際數據。
如圖,假設某一個文件的權限與屬性數據放置到inode 4號下(小方格)而這個inode記錄了文件數據的實際放置點為2,7,13,15這4個block號碼,此時我們的操作系統就能夠據此來排列磁盤的閱讀順序,可以一下子將4個block內容讀出來。
二、Linux的ext2文件系統
文件系統一開始就將inode與block規劃好了,除非重新格式化(或者利用resize2fs等命令更改文件系統大小)否則inode與block固定後就不再變動。為了方便管理,ext2文件系統在格式化時基本上是區分為多個塊組的。每個塊組都有獨立的inode/block/super block系統。如下圖所示:
本文URL:http://www.bianceng.cn/OS/Linux/201410/45626.htm
文件系統最前面有一個啟動扇區,這個啟動扇區可以安裝引導裝載程序,這樣我們就能夠將不同的引導裝載程序安裝到個別的文件系統最前端,而不用覆蓋整塊硬盤唯一的MBR,這樣也才能制作出多重引導的環境。
*data block:用來放置文件內容的地方,在ext2文件系統中所支持的block的大小有1KB,2KB,4KB,在格式化時大小就固定了,每個block內最多只能放置一個文件的數據,如果文件大於一個block的大小,則一個文件會占用多個block數量,若文件小於block,則該block的剩余空間就不能夠再被使用了。block的大小而產生的ext2文件系統限制如下:
*inode table(inode 表格)
inode記錄的文件數據至少有:
1、該文件的訪問模式;(rwx)
2、該文件的所有者與組(ower/group);
3、該文件的大小;
4、該文件創建或狀態改變的時間(ctime);
5、最近一次讀的時間(atime);
6、最近修改的時間(mtime);
7、該文件的特性的標志(flag);
8、該文件真正內容的指向(pointer);
而有這麼強大功能的inode的大小均固定為每個128B。inode除了文件權限屬性記錄區域外,還有12個直接,1個間接,一個雙間接與一個三間接記錄區。12個直接指向號碼的對照,這12個記錄就能夠直接取得block號碼,至於所謂的間接就是再拿一個block來當作block號碼的記錄區,如果文件太大,就會使用間接的block來記錄編號。同理,如果文件持續長大,那麼就復用所謂的雙間接,第一個僅再指出下一個記錄編號的block在哪裡,實際記錄在第二個block當中。依此類推,三間接就是復用第三層block來記錄編號。如下圖所示:
*Super block:
Super block是非常重要的,因為文件系統的基本信息都寫在這裡,一個文件系統應該僅有一個super block而已。它記錄的信息主要有:
1、block與inode總量;
2、未使用與已使用的inode、block數量;
3、block與inode的大小;
4、文件系統的掛載時間、最近一次寫入數據的時間,最近一次檢驗磁盤的時間等文件系統的相關信息;
5、一個validbit數值,若此文件系統已掛載,則validbit為0,若未掛載,則validbit為1;
*File system Description(文件系統描述說明)
這個區段可以描述每個block group的開始與結束的號碼,以及說明每個區段分別介於哪一個block號碼之間。可以用dumpe2fs來查看。
*block bitmap(塊對照表)
通過block bitmap可以知道哪些block是空的,因此我們的系統就能夠很快速地找到可以使用的空間來處置文件。同樣,如果你刪除某些文件時,那麼那些文件原本占用的block號碼就得要釋放出來,此時在block bitmap當中相對應到該block號碼的標志就得要修改成為“未使用”。
*inode bitmap(inode對照表)
與block bitmap相似。
三、與目錄樹的關系
1、目錄:在Linux下的ext2文件系統新建一個目錄時,ext2會分配一個inode與至少一塊block給該目錄。inode記錄該目錄的相關權限與屬性,並可記錄分配到的那塊block號碼;而block則是記錄在這個目錄下的文件名與該文件名占用的inode號碼數據。
2、文件:在Linux下的ext2文件系統新建一個文件時,ext2會分配一個inode與相對於該文件大小的block數量給該文件。注意,如果文件太大,block的數量還要加上間接,雙間接和三間接指向所指向的block。
3、由上述可知,inode本身並不記錄文件名,文件名的記錄是在目錄的block當中。當我們要讀取某個文件進,就務必會經過目錄的inode與block,然後才能夠找到那個待讀取文件的inode號碼,最終才會讀到正確的文件的block內的數據。由於目錄樹是由根目錄開始讀起,因此系統通過掛載的信息可以找到掛載點的inode號碼,此時就能夠得到根目錄的inode內容,並依據該inode讀取根目錄的block內的文件名數據,再一層層地往下讀到正確的文件名。
四、ext3文件系統
為了避免文件系統不一致的情況發生,在文件系統當中規劃出一個塊,該塊專門記錄寫入或修訂文件時的步驟,也就是加入了日志文件系統。這就是ext3文件系統,它是ext2文件系統的升級版。
五、掛載點的意義
每個文件系統都有獨立的inode、block、super block等信息,這個文件系統要能夠鏈接到目錄樹才能被我們使用。將文件系統與目錄樹結合的操作我們稱為掛載。掛載點一定是目錄,該目錄為進入該文件系統的入口,必須要“掛載”到目錄樹後,才能夠使用該文件系統。
本文URL:http://www.bianceng.cn/OS/Linux/201410/45626.htm