十五. 文件系統一(文件系統的基本概念)

十五. 文件系統一(文件系統的基本概念)

來自專欄 簡易的linux kernel

磁碟的基礎概念

扇區:它是磁碟讀寫的基本單位。在我們個人的pc上,他的大小通常為512byte

塊:在windows中,稱為簇。一個塊由多個扇區組成,磁碟在進行讀寫數據的時候,不可能有一扇區的數據就讀或寫一次,而是等數據累計到一定量後,在統一進行讀寫,而這個數據量就叫塊。在對磁碟進行格式化分區的時候可以選擇塊的大小,默認的是4kb。因為每次進行讀寫的數據量都是一塊為單位,所以在磁碟上數據的存儲也是以塊為大小。最顯著的例子是,我們在windows上創建一個文件,它的實際大小都為塊大小的整數倍。

總結的來說,扇區是由磁碟的設計決定的,它決定了磁碟一次讀寫所能取得的數據量。塊這個概念是由程序員設計出來的,它就類似於緩衝區的概念,在累計到一定的數據量之後進行一次性讀寫。扇區和塊的概念有點類似於bit和byte。bit計算機系統中最小的數據單元,但通常我們都不會直接對bit進行操作,所以通常會將byte作為計算機中最小的數據單位。所以在後面中,沒有特殊的說明,文件系統的最小單元默認就是塊。

鏈式文件系統

磁碟中,數據的存儲都是以塊為大小,這裡的塊大小都以4KB來舉例,對於大於4KB的文件,就會對其進行分塊存儲。如10KB的文件,就會將其分為3塊。不同對文件系統對這3塊文件的存儲方式都會不一樣,這裡用FAT的鏈式文件系統舉例。

這幅圖很形象的說明了鏈式文件系統的特點,文件的塊是分布在各個零散的空間中,這樣對空間的利用率有極大的提升。但是想要放到到某個指定的塊就必須從第一個塊開始向下尋找,訪問的速度較慢。

windows的上古時期使用的就是這種文件系統。

索引式文件系統

在UNIX時代,就已經實現了索引式的文件系統。它的原理是為一個文件的所有塊建立一個索引表,索引表就是塊地址數組,每個數組元素就是塊的地址,第n個數組元素指向文件中的第n個塊,這樣訪問任意一個塊的時候,只需要從索引表中獲得塊地址就可以了。而且文件中的塊依然可以分散到不連續的零散空間中。其結構如下圖所示

索引表的索引結構稱為inode,用來索引,跟蹤一個文件的所有塊。inode是文件索引結構組織形式的具體體現,一個文件就必須對應一個inode。

索引表本身要佔用存儲空間,如果文件很大時,塊就比較多,索引表就會很大。UNIX為了解決這個問題,採用間接索引表來處理。

具體的做法是:每個索引表中有15個索引項,前12個索引項對應文件的12個塊,他們是文件的直接塊。若文件大於12塊,就再建立一個新的塊索引表,新索引表稱為一級間接索引表,表中可容納256個塊地址,這個索引表也會佔用一個物理塊,老的索引表的第13個索引項就會指向這個索引表所在的物理塊。通過一級間接索引表,文件最大可達到 12 + 256 = 268塊。

如果文件超過268塊的大小,就再建立二級間接索引表,此表中各個表項存儲的是一級間接索引表,老的索引表中的第14個索引項就會指向這個二級間接索引表,此時的文件最大可到 268 + 256 * 256。如果塊大小為4KB的話,大約可以表示257MB的文件。

如果任然不夠用的話,就會建立三級間接索引表,讓老索引表的第15個索引項指向這個三級間接索引表。此時能表示的文件大小大約是64GB。

inode的結構如圖所示

目錄與目錄項

在磁碟上的文件系統中,沒有用來專門表示目錄的結構,磁碟上有的只是inode,inode是用於描述一個文件實體的數據塊,至於數據塊中記錄的是什麼,並不是有inode決定的。

既然磁碟上只有這一個結構,那麼目錄同樣也是通過inode來表示的。inode是用來表示文件的,那麼也可以說,目錄也是文件的一種。

inode既可以表示普通文件,也可以表示目錄,那麼肯定要有一種方法來區分它到底是普通文件還是目錄。這個就是通過inode中的數據塊來區分的。

普通文件的inode的數據塊是指向普通文件自己的數據的。

目錄的inode的數據塊是指向位於該目錄下的目錄項的。

不管是普通文件還是目錄文件,它總會存在於某個目錄中,所有的文件都位於根目錄 / 之下。我們平時使用的 ls 命令就是目錄項的外在表現

在目錄項中會記錄該文件的類型,是屬於普通文件,還是屬於一個目錄。

下面是目錄項的一個示意圖

通過目錄項便可以通過文件名找到文件對應的數據了。

首先通過文件名找到位於該目錄項中對應的inode編號

然後通過通過這個inode編號在inode數組中找到該文件對應的inode

最後通過這個文件對應的inode找到該文件對應的數據。

超級塊

在文件系統中,一個文件用一個inode表示,所有的inode組成了inode數組,這個inode數組存儲在哪裡,如何對其進行管理。文件系統中,哪些塊被使用了,哪些塊是空閑的,這些信息都需要記錄,對這些數據進行統一管理和記錄的數據結構叫做超級塊。它的結構如圖所示

超級塊中的大部分數據都很好理解,裡面的魔數是用來確定文件系統的標誌的,用它來區別其他的文件系統。雖然對於我們這個簡單的內核來說沒什麼意義,但是模仿就模仿到底,加上這個結構也不是很複雜。

超級塊是文件系統基本信息的配置文件,它是在為分區創建文件系統時創建的,所有關於文件系統的基本信息都記錄在超級塊中,因此超級塊的位置和大小是固定的,它被固定存儲在各個分區的第2個扇區中,通常佔用1扇區的大小。

這個kernel的文件系統模仿ext2文件系統實現,其文件系統的布局如圖所示


推薦閱讀:

如何使用特殊許可權:setuid、setgid 和 sticky 位
文件存儲
文件系統
如何在 Ubuntu 上使用 ZFS 文件系統

TAG:文件系統 | Linux | 操作系統 |