unix/linux 文件系統結構淺析

一、物理磁盤到文件系統

文件系統用來存儲文件內容、文件屬性、和目錄。這些類型的數據如何存儲在磁盤塊上的呢?unix/linux使用了一個簡單的方法。如圖所示.

它將磁盤塊分爲三個部分:
1)超級塊,文件系統中第一個塊被稱爲超級塊。這個塊存放文件系統本身的結構信息。比如,超級塊記錄了每個區域的大小,超級塊也存放未被使用的磁盤塊的信息。
2) i-節點表。超級塊的下一個部分就是i-節點表,每個文件都有一些屬性,如文件的大小、文件所有者、和創建時間等,這些性質被記錄在一個稱爲i-節點的結構中。所有i-節點都有相同的大小,並且i-節點表是這些結構的一個列表,文件系統中每個文件在該表中都有一個i-節點。
3)數據區。文件系統的第3個部分是數據區。文件的內容保存在這個區域。磁盤上所有塊的大小都一樣。如果文件包含了超過一個塊的內容,則文件內容會存放在多個磁盤塊中。一個較大的文件很容易分佈上千個獨立的磁盤塊中.

二、創建一個文件的過程
我們現在知道文件的內容和屬性是分開存放的,那麼又是如何管理它們的呢?現在我們以創建一個文件爲例來講解。在命令行輸入命令:
$ who > userlist
當完成這個命令時。文件系統中增加了一個存放命令who輸出內容的新文件,那麼這整個過程到底是怎麼回事呢?
文件的屬性和內容:內核將文件內容存放在數據區,文件屬性存放在i-節點,文件名存放在目錄。圖2顯示了創建一個文件的例子,假如這個新文件要3 個存儲塊來存放內容。

包括如下四個步驟:

1)存儲屬性 也就是文件屬性的存儲,內核先找到一塊空的i-節點。圖2中。內核找到i-節點號47。內核把文件的信息記錄其中。如文件的大小、文件所有者、和創建時間等
2)存儲數據 即文件內容的存儲,由於該文件需要3個數據塊。因此內核從自由塊的列表中找到3個自由塊。圖2中分別爲627、200、992,內核緩衝區的第一塊數據複製到塊627,第二和第三分別複製到200和992.
3)記錄分配情況,數據保存到了三個數據塊中。所以必須要記錄起來,以後再找到正確的數據。分配情況記錄在文件的i-節點中的磁盤序號列表裏。這3個編號分別放在最開始的3個位置。
4)添加文件名到目錄,新文件的名字是userlist,   內核將文件的入口(47,userlist)添加到目錄文件裏。文件名和i-節點號之間的對應關係將文件名和文件和文件的內容屬性連接起來,找到文件名就找到文件的i-節點號,通過i-節點號就能找到文件的屬性和內容。

三、創建一個目錄的過程

前面說了創建一個文件的大概過程,那麼創建一個目錄時又是怎麼回事呢?
我們知道,目錄其實也是文件,只是它的內容比較特殊:包含文件名字列表,列表一般包含兩個部分:i-節點號和文件名。所以它的創建過程和文件創建過程一樣,只是第二步寫的內容不同。一個目錄創建時至少包括兩個鏈接:“.”,“..”
我們可以通過系統命令來查看目錄的內容:#ls -lia

   

上圖的結果是文件名和對應的i-節點號,其中“.”表示是當前目錄,而“..”是當前目錄的父目錄。但也有特殊情況,我們查看根目錄的情況:

[root@localhost ~]# ls -i1a /
2 .
2 ..
98305 .autofsck
1310721 backup
我們發現“.”和“..”都指向i-節點2.實際上當用mkfs創建一個文件系統時,mkfs會將根目錄的父目錄指向自己

四、如果有大文件如何實現
文件內容的分配情況是必須記錄在i-節點的磁盤序號列表裏的。但是i-節點只包含一個最多含有13個項的分配鏈表,如果分配的數據塊超過13個塊時怎麼辦?
Linux用到一個間接塊來解決此問題.比如我們要記錄14個塊的編號,可以把前面10個記錄在i-節點的磁盤序號列表裏。另外4個編號放在一個數據塊中。在i-節點的第11項裏記錄存放編號的數據塊的指針,通過這個指針就能找到餘下的4個數據塊的編號,這個用來存放編號的數據就叫間接塊。(二次間接尋址找到數據)
但當間接塊也存滿了時我們還可以再開第二個間接塊,甚至3、4、5。。。更多額外塊。但內核並不會把這些塊記錄在文件的i-節點的第12、13項裏。而是開闢一個新的塊的來存放這些間接塊的列表,並在i-節點的第12項存放這一新額外塊的編號。這存放着那個存儲着第2、3、4、及後繼額外塊的編號的塊的編號,這個塊稱爲二級間接塊.
同理當二級間接塊飽和時還可以開闢第三級。(三次間址)

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