對Linux文件系統(tǒng)的簡單理解

姓名:鄺念君

學號:14020150024

【嵌牛導讀】:EXT3,EXT4,BTRFS和XFS是現(xiàn)在最常見的四個Linux文件系統(tǒng)。為了便于理解,本文以相對簡單的EXT2為切入點,介紹其原理。便不難理解Linux文件系統(tǒng)。

【嵌牛鼻子】:文件系統(tǒng)、 分區(qū)、描述表、尋址方式?

【嵌牛正文】:

1、ext2文件系統(tǒng)

我們知道,一個磁盤可以劃分成多個分區(qū),每個分區(qū)必須先用格式化工具(例如某種mkfs命令)格式化成某種格式的文件系統(tǒng),然后才能存儲文件,格式化的過程會在磁盤上寫一些管理存儲布局的信息。下圖是一個磁盤分區(qū)格式化成ext2文件系統(tǒng)后的存儲布局。

? ? ? ? ? ? ?圖1??ext2文件系統(tǒng)

文件系統(tǒng)中存儲的最小單位是塊(Block),一個塊究竟多大是在格式化時確定的,例如mke2fs的-b選項可以設定塊大小為1024、2048或4096字節(jié)。而上圖中啟動(BootBlock)的大小是確定的,就是1KB,啟動塊是由PC標準規(guī)定的,用來存儲磁盤分區(qū)信息和啟動信息,任何文件系統(tǒng)都不能使用啟動塊。啟動塊之后才是ext2文件系統(tǒng)的開始,ext2文件系統(tǒng)將整個分區(qū)劃成若干個同樣大小的塊組(Block?Group),每個塊組都由以下部分組成。

超級塊(Super?Block)描述整個分區(qū)的文件系統(tǒng)信息,例如塊大小、文件系統(tǒng)版本號、上次mount的時間等等。超級塊在每個塊組的開頭都有一份拷貝。

塊組描述符表(GDT,Group?Descriptor?Table)由很多塊組描述符組成,整個分區(qū)分成多少個塊組就對應有多少個塊組描述符。每個塊組描述符(Group?Descriptor)存儲一個塊組的描述信息,例如在這個塊組中從哪里開始是inode表,從哪里開始是數(shù)據塊,空閑的inode和數(shù)據塊還有多少個等等。和超級塊類似,塊組描述符表在每個塊組的開頭也都有一份拷貝,這些信息是非常重要的,一旦超級塊意外損壞就會丟失整個分區(qū)的數(shù)據,一旦塊組描述符意外損壞就會丟失整個塊組的數(shù)據,因此它們都有多份拷貝。通常內核只用到第0個塊組中的拷貝,當執(zhí)行e2fsck檢查文件系統(tǒng)一致性時,第0個塊組中的超級塊和塊組描述符表就會拷貝到其它塊組,這樣當?shù)?個塊組的開頭意外損壞時就可以用其它拷貝來恢復,從而減少損失。

塊位圖(Block?Bitmap)一個塊組中的塊是這樣利用的:數(shù)據塊存儲所有文件的數(shù)據,比如某個分區(qū)的塊大小是1024字節(jié),某個文件是2049字節(jié),那么就需要三個數(shù)據塊來存,即使第三個塊只存了一個字節(jié)也需要占用一個整塊;超級塊、塊組描述符表、塊位圖、inode位圖、inode表這幾部分存儲該塊組的描述信息。那么如何知道哪些塊已經用來存儲文件數(shù)據或其它描述信息,哪些塊仍然空閑可用呢?塊位圖就是用來描述整個塊組中哪些塊已用哪些塊空閑的,它本身占一個塊,其中的每個bit代表本塊組中的一個塊,這個bit為1表示該塊已用,這個bit為0表示該塊空閑可用。

????????為什么用df命令統(tǒng)計整個磁盤的已用空間非??炷??因為只需要查看每個塊組的塊位圖即可,而不需要搜遍整個分區(qū)。相反,用du命令查看一個較大目錄的已用空間就非常慢,因為不可避免地要搜遍整個目錄的所有文件。

????????與此相聯(lián)系的另一個問題是:在格式化一個分區(qū)時究竟會劃出多少個塊組呢?主要的限制在于塊位圖本身必須只占一個塊。用mke2fs格式化時默認塊大小是1024字節(jié),可以用-b參數(shù)指定塊大小,現(xiàn)在設塊大小指定為b字節(jié),那么一個塊可以有8b個bit,這樣大小的一個塊位圖就可以表示8b個塊的占用情況,因此一個塊組最多可以有8b個塊,如果整個分區(qū)有s個塊,那么就可以有s/(8b)個塊組。格式化時可以用-g參數(shù)指定一個塊組有多少個塊,但是通常不需要手動指定,mke2fs工具會計算出最優(yōu)的數(shù)值。

inode位圖(inode?Bitmap)和塊位圖類似,本身占一個塊,其中每個bit表示一個inode是否空閑可用。

inode表(inode?Table)我們知道,一個文件除了數(shù)據需要存儲之外,一些描述信息也需要存儲,例如文件類型(常規(guī)、目錄、符號鏈接等),權限,文件大小,創(chuàng)建/修改/訪問時間等,也就是ls?-l命令看到的那些信息,這些信息存在inode中而不是數(shù)據塊中。每個文件都有一個inode,一個塊組中的所有inode組成了inode表。inode表占多少個塊在格式化時就要決定并寫入塊組描述符中,mke2fs格式化工具的默認策略是一個塊組有多少個8KB就分配多少個inode。由于數(shù)據塊占了整個塊組的絕大部分,也可以近似認為數(shù)據塊有多少個8KB就分配多少個inode,換句話說,如果平均每個文件的大小是8KB,當分區(qū)存滿的時候inode表會得到比較充分的利用,數(shù)據塊也不浪費。如果這個分區(qū)存的都是很大的文件(比如電影),則數(shù)據塊用完的時候inode會有一些浪費,如果這個分區(qū)存的都是很小的文件(比如源代碼),則有可能數(shù)據塊還沒用完inode就已經用完了,數(shù)據塊可能有很大的浪費。如果用戶在格式化時能夠對這個分區(qū)以后要存儲的文件大小做一個預測,也可以用mke2fs的-i參數(shù)手動指定每多少個字節(jié)分配一個inode。

數(shù)據塊(Data?Block)根據不同的文件類型有以下幾種情況

(1)對于常規(guī)文件,文件的數(shù)據存儲在數(shù)據塊中。

(2)對于目錄,該目錄下的所有文件名和目錄名存儲在數(shù)據塊中,注意文件名保存在它所在目錄的數(shù)據塊中,除文件名之外,ls?-l命令看到的其它信息都保存在該文件的inode中。注意這個概念:目錄也是一種文件,是一種特殊類型的文件。

(3)對于符號鏈接,如果目標路徑名較短則直接保存在inode中以便更快地查找,如果目標路徑名較長則分配一個數(shù)據塊來保存。

(4)設備文件、FIFO和socket等特殊文件沒有數(shù)據塊,設備文件的主設備號和次設備號保存在inode中。


2、數(shù)據塊尋址

圖?2?數(shù)據塊尋址

????????從上圖可以看出,索引項Blocks[13]指向兩級的間接尋址塊,最多可表示(b/4)2+b/4+12個數(shù)據塊,對于1K的塊大小最大可表示64.26MB的文件。索引項Blocks[14]指向三級的間接尋址塊,最多可表示(b/4)3+(b/4)2+b/4+12個數(shù)據塊,對于1K的塊大小最大可表示16.06GB的文件。

????????可見,這種尋址方式對于訪問不超過12個數(shù)據塊的小文件是非??斓模L問文件中的任意數(shù)據只需要兩次讀盤操作,一次讀inode(也就是讀索引項)一次讀數(shù)據塊。而訪問大文件中的數(shù)據則需要最多五次讀盤操作:inode、一級間接尋址塊、二級間接尋址塊、三級間接尋址塊、數(shù)據塊。實際上,磁盤中的inode和數(shù)據塊往往已經被內核緩存了,讀大文件的效率也不會太低。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容