1. 程式人生 > >unix/linux 檔案系統結構淺析

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-節點號,其中“.”表示是當前目錄,而“..”是當前目錄的父目錄。但也有特殊情況,我們檢視根目錄的情況:

[[email protected] ~]# 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、及後繼額外塊的編號的塊的編號,這個塊稱為二級間接塊. 同理當二級間接塊飽和時還可以開闢第三級。