總體存儲布局:參考:http://docs.linuxtone.org/ebooks/C&CPP/c/ch29s02.html
Super Block(超級塊)描述整個分區的文件系統信息,例如塊大小、文件系統版本號、上次mount的時間等等。超級塊在每個塊組的開頭都有一份拷貝。
GDT,Group Descriptor Table,(塊組描述符表)由很多塊組描述符組成,整個分區分成多少個塊組就對應有多少個塊組描述符。每個塊組描述符(Group Descriptor)存儲一個塊組的描述信息,例如在這個塊組中從哪裡開始是inode表,從哪裡開始是數據塊,空閒的inode和數據塊還有多少個等等。和超級塊類似,塊組描述符表在每個塊組的開頭也都有一份拷貝,這些信息是非常重要的,一旦超級塊意外損壞就會丟失整個分區的數據,一旦塊組描述符意外損壞就會丟失整個塊組的數據,因此它們都有多份拷貝。通常內核只用到第0個塊組中的拷貝,當執行e2fsck檢查文件系統一致性時,第0個塊組中的超級塊和塊組描述符表就會拷貝到其它塊組,這樣當第0個塊組的開頭意外損壞時就可以用其它拷貝來恢復,從而減少損失。
塊位圖(Block Bitmap)塊位圖就是用來描述整個塊組中哪些塊已用哪些塊空閒的,它本身占一個塊,其中的每個bit代表本塊組中的一個塊,這個bit為1表示該塊已用,這個bit為0表示該塊空閒可用。
inode位圖(inode Bitmap)每個bit表示一個inode是否空閒可用。
inode表(inode Table)一個文件除了數據需要存儲之外,一些描述信息也需要存儲,例如文件類型(常規、目錄、符號鏈接等),權限,文件大小,創建/修改/訪問時間等,也就是
ls
-l
命令看到的那些信息,這些信息存在inode中而不是數據塊中。每個文件都有一個inode,一個塊組中的所有inode組成了inode表。
數據塊(數據塊)根據不同的文件類型有以下幾種情況
對於常規文件,文件的數據存儲在數據塊中。
對於目錄,該目錄下的所有文件名和目錄名存儲在數據塊中,注意文件名保存在它所在目錄的數據塊中,除文件名之外,
ls -l
命令看到的其它信息都保存在該文件的inode中。注意這個概念:目錄也是一種文件,是一種特殊類型的文件。
對於符號鏈接,如果目標路徑名較短則直接保存在inode中以便更快地查找,如果目標路徑名較長則分配一個數據塊來保存。
設備文件、FIFO和socket等特殊文件沒有數據塊,設備文件的主設備號和次設備號保存在inode中。