第十一章 EXT2文件系統
以下內容是我對本章部分內容的學習總結
一、EXT2文件系統數據結構
1、虛擬磁盤佈局
每當文件系統需要從包含它的塊設備中讀取信息或數據,就將請求底層的設備驅動讀取一個基本塊大小整數倍的數據塊。
EXT2文件系統將它所使用的邏輯分區劃分成數據塊組。
每個數據塊組都將那些對文件系統完整性最重要的信息複製出來,同時將實際文件盒目錄看做信息與數據塊。邏輯文件系統管理的是一個邏輯空間,這個邏輯空間就像一個大的數組,數組的每個元素就是文件系統操作的基本單位——邏輯塊。
邏輯塊是從0開始編號的,是連續的;邏輯塊相對的是物理塊。通常,EXT2的物理塊佔一個或幾個連續的扇區。
2、超級塊
超級塊Block#1:(在硬盤區分中字節偏移量為1024)B1是超級塊,用於容納整個文件系統的信息
其主要記錄的以下內容:
- block與inode的總量;
- 未使用與已使用的inode/block數量;
- block與inode的大小;
- 文件系統的詳細信息——掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤的時間等文件系統的相關信息等
3、塊組描述符
EXT2將磁盤塊分為幾個組,每個組有8192個塊,用一個塊組描述符結構體來描述。
- Block#2:塊組描述符塊(硬盤上的s_first_data_block+1)
- Block#8:塊位圖
- Block#9:索引節點位圖
二、遍歷算法
- 讀取超級塊;
- 讀取塊組描述符塊(1+s_first_data_block),以訪問組0描述符;
- 讀取InodeBeginBlock,獲取/的索引節點,即INODE#2;
- 將路徑名標記為組件字符串,假設組件數量為n;
- 從3中的根索引節點開始,在其數據塊中搜索name[0];
- 使用索引節點號ino來定位相應的索引節點。Ino從1開始計數,使用郵差算法計算包含索引節點的磁盤塊及其在該塊中的偏移量;
- 由於5~6步將會重複n次,所以最好編寫一個搜索函數。
三、EXT2文件系統的結構
- 第1級別:實現了基本文件系統樹。用户命令程序有:mkdir,creat,mknod,rmdir,link,unlink,symlink,rm,ls,cd和pwd等;
- 第2級別:實現了文件內容讀寫函數;
- 第3級別:實現了文件系統的掛載、卸載和文件保護。
四、EXT2文件系統的實現
- 當前運行進程的PROC結構體。在實際系統中,每個文件操作都是由當前執行的進程決定的。每個進程都有一個cwd,指向進程當前工作目錄(CWD)的內存索引節點。它還有一個文件描述符數組fd],指向打開的文件實例。
- 文件系統的根指針。它指向內存中的根索引節點。當系統啓動時,選擇其中一個設備作為根設備,它必須是有效的EXT2文件系統。根設備的根索引節點(inode#2)作為文件系統的根(1)加載到內存中。該操作稱為“掛載根文件系統”。
- openTable條目。當某個進程打開文件時,進程fd數組的某個條目會指向openTable,openTable指向打開文件的內存索引節點。
- 內存索引節點。當需要某個文件時,會把它的索引節點加載到minode 槽中以供使用。因為索引節點是唯一的,所以在任何時候每個索引節點在內存中都只能有一個副本。在minode中,(dev,ino)會確定索引節點的來源,以便將修改後的索引節點寫回磁盤。refCount字段會記錄使用minode的進程數。
- dirty字段,表示索引節點是否已被修改,掛載標誌表示索引節點是否已被掛載,如果已被掛載,mntabPtr將指向掛載文件系統的掛載表條目。lock字段用於確保內存索引節點一次只能由一個進程訪問,例如在修改索引節點時,或者在讀/寫操作過程中。
- 已掛載的文件系統表。對於每個掛載的文件系統,掛載表中的條目用於記錄掛載的文件系統信息,例如掛載的文件系統設備號。在掛載點的內存索引節點中,掛載標誌打開,mntabPtr指向掛載表條目。在掛載表條目中,mntPointPtr指向掛載點的內存索引節點。
五、文件系統與系統項目擴展
- type.h文件:這類文件包含EXT2文件系統的數據結構類型,比如超塊、組描述符、索引節點和目錄條目結構。此外,它還包含打開文件表、掛載表、PROC結構體和文件系統常數。
- global.c文件:這類文件包含文件系統的全局變量。
- util.c文件:該文件包含文件系統常用的實用程序函數。最重要的實用程序函數是讀/寫磁盤塊函數iget()、iput()和 getino()。
- mount-root.c文件:該文件包含mount_root()函數,在系統初始化期間調用該函數來掛載根文件系統。
簡單的EXT2文件系統使用1KB塊大小,只有一個磁盤塊組它可以輕鬆進行以下擴展。
- 多個組:組描述符的大小為32字節對於1KB大小的塊,一個塊可能包含1024/32=32組描述符。32個組的文件系統大小可以擴展為32*8=256MB
- 4KB大小的塊:對於4KB大小的塊和一個組,文件系統大小應為4*8=32MB。對於一個組描述符塊,文件系統可能有128個組,可將文件系統大小擴展到128×32=4GB,對於2個組描述符塊,文件系統大小為8GB等。大多數擴展都很簡單,適合用於編程項目。
- 管道文件:管道可實現為普通文件,這些文件遵循管道的讀/寫協議。此方案的優點是:它統一了管道和文件索引節點,並允許可被不相關進程使用的命名管道。為支持快速讀/寫操作,管道內容應在內存中,比如在 RAMdisk中。必要時,讀者可將命名管道實現為FIFO文件。
- I/O緩衝:在編程項目中,每個磁盤塊都是接讀寫的。這會產生過多的物理磁盤I/O操作。為提高效率,實際文件系統通常使用一系列I緩衝區作為磁盤塊的緩存內存。文件系統的IO緩衝將會在第12章中討論,但是可把它合併到文件系統.
實踐環節
- free命令:查看文件操作系統
- df(disk free):用於顯示目前在Linux系統上的文件系統磁盤使用情況統計。
- du:查看目錄和文件容量