超級塊,i節點,數據塊,目錄塊,間接塊


一、物理磁盤到文件系統

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

 

 

 他將磁盤分為3個部分:

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

2.創建一個文件的過程

我們現在知道文件的內容和屬性是分開存放的,那么又是如何管理它們的呢?現在我們以創建一個文件為例來講解。在命令行輸入命令:
$ 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-節點號就能找到文件的屬性和內容。

包括如下四個步驟:

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

  1. <span style="font-family:Microsoft YaHei;">[root@localhost ~]# ls -i1a /

  2. 2 .

  3. 2 ..

  4. 98305 .autofsck

  5. 1310721 backup</span>

我們發現“.”和“..”都指向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、及后繼額外塊的編號的塊的編號,這個塊稱為二級間接塊.
同理當二級間接塊飽和時還可以開辟第三級。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM