Linux系統編程23 文件系統 - UFS文件系統解析

前面聊的FAT 文件系統最怕 大文件,我們這裏聊一聊 UFS文件系統,他們是同一時期的產物,FAT 是閉源,UFS是開源。

在這裏插入圖片描述

在這裏插入圖片描述

圖中的inode部分 是一個inode結構體數組,我們的文件 幾乎所有的信息都存放在 該文件的 inode 結構體當中

struct {
stat 結構
亞數據信息
隱藏內容
數據塊指針組[15] ,15個指針

1  數據塊指針
2  數據塊指針
3  數據塊指針
... 數據塊指針
12 數據塊指針

13  一級間接塊指針
14  二級間接塊指針
15  三級間接塊指針

}

以下所有計算都是加上數據塊大小是1K一塊,而實際是4K 起步。

數據塊指針組中的前12個指針中的每個指針都指向 圖中塊區域的中的某個小格子,即1K 一塊,而實際的環境中都是4K起步。也就說是 如果12個數據塊指針都用上了的話,能保存一個12K大小的文件,實際是48K+大小,所以如果我們的文件大小在12K(48K+)大小以內,那麼這12個數據塊指針就夠了。

如果我們的文件大小超過了12K 的大小,那麼就會動用 一級間接塊指針,該指針也只想 塊區域的一個 1K 大小的小格子,但是該格子中存儲的不是文件數據,而是指針,假如是32位系統,一個指針的大小就是4個字節,那麼該1k大小的塊,就能夠存儲256個指針,然後每個指針又指向塊區域中某個1K大小的塊,用於存儲文件數據。所以 一級間接塊指針中的全部空間就是 256K 的大小。

如果文件大於 12K+256K, 那麼就會動用 二級間接塊指針, 二級間接塊指針也指向塊區域中1K 大小的小格子,該格子依然存放指針,可以存放256個指針,而這裏的每個指針並非指直接指向 1K 的塊,存放數據,而是指向 一級間接塊指針指向的 1K 的地址塊,也就說 二級間接塊指針塊 中的256個指針中的每個指針分別指向一個 一級間接塊指針的 1K 地址塊,即 二級間接塊指針 可以保存
256*256 K 的大小

如果 二級間接塊指針 加上前面的空間 依然不能滿足文件的大小,那麼就會動用 三級間接塊指針。三級間接塊指針 和 二級間接塊指針類似,他的指針塊中的每個指針 指向一個 二級間接塊指針 塊,即三級間接塊指針 可以保存 256256256 大小的文件。

所以可見 UFS文件系統不怕大文件。

UFS文件系統的缺點:
很多人說 UFS文件系統 不善於或者不能管理小文件。我們每次產生一個新文件,都會分配一個新的 inode,位於inode塊區域,那麼就會有一種情況,當 inode inode塊區域中的所有inode 都被耗盡了,但是 塊區域還存在大量的空白塊沒有被使用,這種情況就是大量的小文件造成的,有些文件幾乎不佔磁盤空間,如符號鏈接文件等 ,但是也要分配inode。這樣的話 當在使用某個文件的時候,就會在 inode區域,即inode結構體數組中查找目標inode結構體,這樣查找就很耗時。

還有一種情況 inode結構體數組 大段的空白,但是數據塊被耗盡,這種情況就是 大文件比較多造成的。

那麼我們怎麼知道 當前那個inode已經被使用了,那些inode還沒有被使用。比如我touch一個新文件,系統是怎麼快速的給他分配一個現在沒有被使用的inode ?? 這就用到了 inode 位圖。inode 區域有多少個格子,inode 位圖區域就有多少個格子,他們一一對應,即可以理解爲也是一個數組,該數組與inode結構體數組 數組元素個數相同, inode 位圖數組中的每一項 按順序對應一 一 inode結構體數組 中的每一項, inode 位圖中用0/1代表該 inode 有沒有被使用,所以尋找哪個 inode 沒有被使用,就直接查找位圖中的0項就可以。

同理 塊位圖中的格子 與 塊區域中的格子是一一對應的,也是用0/1 代表對應數據塊有沒有被使用。所以我們的 統計磁盤使用量的命令就可以使用了,直接查 0,1 的數量就行了。

塊是我們存儲有效數據的數據塊,爲了方便計算和理解,我們假設塊中的每個小格式1K 的大小,實際上每個小格子的大小都是4K起步的,這裏假設是1K 是爲了方便理解。

問題:文件名信息在哪兒?

我們發現上述圖解中並沒有文件名的信息,那麼文件名在哪裏?文件名存在目錄文件中,目錄文件是一個存放在某個文件下的一個常規文件,該文件中每一項叫目錄項。目錄項包含 inode信息和文件名。

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