1. 程式人生 > >Linux文件系統結構

Linux文件系統結構

erb inode 指令 相關 blog 讀取文件 pan 三種 一個

  不同的文件系統存儲文件的方式是不同的,所以其結構也是不同的。本文要介紹的是Linux最傳統的文件系統EXT2的結構。

  EXT2文件系統的主要組成結構有:inode tableinode表格)、data block(信息區塊)、superblock(超級區塊)、filesystem description(文件系統描述說明)、inode bitmapinode對照表)、block bitmap(區塊對照表)等。

  在EXT2文件系統中,文件的權限、屬性與文件的內容是分開存儲的,文件的權限和屬性都存儲在inode中,而文件內容則存儲在block中。inodeblock的大小和數量都是在格式化(即文件系統創建)的時候就已經固定了的。每個

inode的大小均為128bytesext4xfs可以設置256bytes),每個文件僅占用一個inode,所以文件系統中能夠建立的文件數量與inode的數量有關。block1k2k4k三種大小,所以當文件內容的大小超出block的大小時就需要多個block來存儲了。

  每個inodeblock都是有編號的。inode中不僅存儲了文件的權限和屬性,也存儲了文件內容存放的所有block的編號,這樣只要找到文件的inode就能根據inode中記錄的block的編號一次性把所有存放該文件內容的block的數據全部讀取出來了。這裏借鳥哥的圖加以說明:

技術分享

  問題來了,記錄一個block編號需要

4bytes的空間,如果一個文件比較大的話,需要的block的數量是比較多的,但是inode只有128bytes啊,怎麽記錄得了那麽多的block編號呢?其實並不是所有的block編號都直接記錄在inode中的,當文件占用的block數量比較多的時候,系統會拿出一些block專門來記錄文件內容block的編號,然後inode只要記錄這些block的編號就可以讀取到文件內容block的編號了。EXT2inode中記錄blok編號的區域定義為12個直接,一個間接,一個雙間接,和一個三間接記錄區,這裏還是借用鳥哥的圖加以說明:

技術分享

這樣子還是可以根據inode找到存儲文件內容的所有block啊!

  不過盡管如此,由於

inode中存放block編號的區域大小是固定的,inode能夠存儲的block編號的數量就是固定的,而block的大小也是固定的,所以也就是說在一個已知block大小的文件系統中,文件的最大大小是固定的!

  既然block的大小有1K2K4K三種類型,那我們是應該選擇大一點的還是小一點的好呢?由於一個block只能存儲一個文檔的內容,一個文件不管多小,它至少都會占用一個block的空間,所以如果block的空間很大,但是系統中有很多很小的文件,那會就浪費很多的空間了。如果把block定得很小,但是系統中有很多大文件的話,那麽一個文件就需要存放到很多個block中,讀取文件內容的時候需要到多個block中讀取,而且inode需要記錄的block的編號很多,系統還需要拿出更多的block來記錄文件內容block的編號,這在時間和空間上都是比較浪費的。所以,block的大小定多少合適,還是需要根據文件系統預計使用情況來決定的。

  接下來簡單介紹一下EXT文件系統結構中其他組成部分:

(1)Superblock:大小為1024bytes,是記錄整個文件系統相關信息的地方,主要有:blockinode的大小和數量、未使用與已使用的inode/block的數量,以及文件系統的是否已被掛載、掛載的時間等等。

(2)Filesystem description:描述每個block group(下文介紹)的開始與結束的block編號,以及說明每個區段(inode tabledata block等)分別介於哪個block號碼之間。

(3)Inode bitmap:記錄哪些inode是未使用的,哪些是已被使用的。

(4)Block bitmap:記錄哪些block是未使用的,哪些是已被使用的。

  此外,在EXT3EXT4中,還會規劃出一個區塊用於記錄文件修改的日誌記錄,以便在文件系統發生問題的時候能很快查到問題所在。

  如果文件系統很大的話,inodeblock的數量就會很大,不容易管理,所以EXT在格式化的時候基本上是區分為多個區塊群組的,每個區塊群組都有以上介紹的所有組成部分(可以從指令dumpe2fs的打印結果中查看),看起來就像下圖(圖借自鳥哥):

技術分享

  這樣了解了EXT2文件系統的結構之後,文件的創建、查詢、修改、刪除具體經歷了哪些過程,包含了哪些細節,我們就可以清楚地知道了!

  文件系統格式化的時候,EXT文件系統家族在格式化處理的過程中就把所有/inode/block/meta data等結構都預先規劃並分配好,以後系統就可以直接取用,不需要再進行動態配置了。這種方法有個問題,就是當格式化的文件系統很大的時候,格式化需要花費很長的時間。而新的日誌式文件系統XFS就彌補了這個不足,它的inodeblock都是等系統需要使用的時候才進行動態分配的,所以格式化過程超快,適合用於大文件系統。

Linux文件系統結構