認識Ext2文件系統

3).塊位圖(Block Bitmap)

一個塊組中的塊是這樣利用的:數據塊存儲所有文件的數據,比如某個分區的塊大小是1024字節,某個文件是2049字節,那麼就需要三個數據塊來 存,即使第三個塊只存了一個字節也需要佔用一個整塊;超級塊、塊組描述符表、塊位圖、inode位圖、inode表這幾部分存儲該塊組的描述信息。那麼如 何知道哪些塊已經用來存儲文件數據或其它描述信息,哪些塊仍然空閒可用呢?塊位圖就是用來描述整個塊組中哪些塊已用哪些塊空閒的,它本身佔一個塊,其中的每個bit代表本塊組中的一個塊,這個bit為1表示該塊已用,這個bit為0表示該塊空閒可用。

為什麼用

df

命令統計整個磁盤的已用空間非常快呢?因為只需要查看每個塊組的塊位圖即可,而不需要搜遍整個分區。相反,用

du

命令查看一個較大目錄的已用空間就非常慢,因為不可避免地要搜遍整個目錄的所有文件。

與此相聯繫的另一個問題是:在格式化一個分區時究竟會劃出多少個塊組呢?主要的限制在於塊位圖本身必須只佔一個塊。格式化時默認塊大小是1024字節,可以設定參數指定塊大小,現在設塊大小指定為b字節,那麼一個塊可以有8b個bit,這樣大小的一個塊位圖就可以表示8b個塊的佔用情況,因此一個塊組最多可以有8b個塊,如果整個分區有s個塊,那麼就可以有s/(8b)個塊組。

4).inode位圖(inode Bitmap)

和塊位圖類似,本身佔一個塊,其中每個bit表示一個inode是否空閒可用

5).inode表(inode Table)

我們知道,一個文件除了數據需要存儲之外,一些描述信息也需要存儲,例如文件類型(常規、目錄、符號鏈接等),權限,文件大小,創建/修改/訪問時間等,也就是ls -l命令看到的那些信息,這些信息存在inode中而不是數據塊中。每個文件都有一個inode,一個塊組中的所有inode組成了inode表。

inode表佔多少個塊在格式化時就要決定並寫入塊組描述符中,mke2fs格式化工具的默認策略是一個塊組有多少個8KB就分配多少個inode。由於數據塊佔了整個塊組的絕大部分,也可以近似認為數據塊有多少個8KB就分配多少個inode,換句話說,如果平均每個文件的大小是8KB,當分區存滿的時候inode表會得到比較充分的利用,數據塊也不浪費。

6).數據塊(Data Block)

根據不同的文件類型有以下幾種情況

  • 對於常規文件,文件的數據存儲在數據塊中。

  • 對於目錄,該目錄下的所有文件名和目錄名存儲在數據塊中,注意文件名保存在它所在目錄的數據塊中,除文件名之外,ls -l命令看到的其它信息都保存在該文件的inode中。注意這個概念:目錄也是一種文件,是一種特殊類型的文件。

  • 對於符號鏈接,如果目標路徑名較短則直接保存在inode中以便更快地查找,如果目標路徑名較長則分配一個數據塊來保存。

  • 設備文件、FIFO和socket等特殊文件沒有數據塊,設備文件的主設備號和次設備號保存在inode中。

四.尋址

們約略來分析一下 inode ,block 與文件大小的關係。inode 要記錄文件的屬性的數據非常多,但是inode只有固定的128字節而已, 而 inode 記錄一個 block 號碼要花掉 4個字節 ,假設我一個文件有 400MB 且每個 block 為 4K 時, 那麼至少也要十萬筆 block 號碼的記錄呢!inode 哪有這麼多可記錄的信息?為此我們的系統很聰明的將 inode 記錄 block 號碼的區域定義為12個直接,一個間接, 一個雙間接與一個三間接記錄區,如下圖

認識Ext2文件系統

(b是上面的我們自己設定的每個塊的大小,4代表每記錄一個block都要消耗4個字節)上圖最左邊為 inode 本身 (128 bytes),裡面有 12 個直接指向 block 號碼的對照,這 12 筆記錄就能夠直接取得 block 號碼啦! 至於所謂的間接就是再拿一個 block 來當作記錄 block 號碼的記錄區,如果文件太大時, 就會使用間接的 block 來記錄編號。如上圖當中間接只是拿一個 block 來記錄額外的號碼而已。 同理,如果文件持續長大,那麼就會利用所謂的雙間接,第一個 block 僅再指出下一個記錄編號的 block 在哪裡, 實際記錄的在第二個 block 當中。依此類推,三間接就是利用第三層 block 來記錄編號啦!

這樣子 inode 能夠指定多少個 block 呢?我們以較小的 1K block 來說明,可以指定的情況如下:

  • 12 個直接指向: 12*1K=12K

    由於是直接指向,所以總共可記錄 12 筆記錄,因此總額大小為如上所示;

  • 間接: 256*1K=256K

    每筆 block 號碼的記錄會花去 4bytes,因此 1K 的大小能夠記錄 256 筆記錄,因此一個間接可以記錄的文件大小如上;

  • 雙間接: 256*256*1K=2562K

    第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個號碼,因此總額大小如上;

  • 三間接: 256*256*256*1K=2563K

    第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個第三層,每個第三層可以指定 256 個號碼,因此總額大小如上;

  • 總額:將直接、間接、雙間接、三間接加總,得到 12 + 256 + 256*256 + 256*256*256 (K) = 16GB

此時我們知道當文件系統將 block 格式化為 1K 大小時,能夠容納的最大文件為 16GB


分享到:


相關文章: