筆記
第十一章 EXT2文件系統
EXT2文件系統
The Second Extended File System (ext2)文件系統是Linux系統中的標準文件系統,是通過對Minix的文件系統進行擴展而得到的,其存取文件的性能極好。 在ext2文件系統中,文件由inode(包含有文件的所有信息)進行唯一標識。
EXT2文件系統數據結構
通過mkfs創建虛擬鍵盤
在Linux下,命令:
mke2fs [-b blksize -N ninodes] device nblocks
虛擬磁盤佈局
- Block#0:引導塊,文件系統不使用它,用於容納從磁盤引導操作系統的引導程序。
- Block#1:超級塊,用於容納關於整個文件系統的信息。
- Block#2:塊組描述符塊,EXT2將磁盤分成幾個組(每組8192塊),每組用一個塊組描述符結構體描述。
- Block#8:塊位圖,用來表示某種項的位序列。
- Block#9:索引節點位圖,用來代表一個文件的數據結構。
- Block#10:索引節點,每個文件都用一個128字節(EXT4的是256字節)的獨特索引節點結構體表示。
- 直接塊:i_block[0]至i_block[11]指向直接磁盤塊
- 間接塊:i_block[12]指向一個包含256個塊編號的磁盤塊
- 雙重間接塊:i_block[13]指向一個指向256個塊的塊
- 重間接塊:i_block[14],對於“小型”EXT2文件系統可以忽略
- 數據塊緊跟在索引節點塊後面的是文件存儲數據塊
- 目錄條目:包含dir_entry,dir_entry是一種可擴充結構。
郵差算法
Linear_address LA = N*block + house;
Block_address BA = (LA / N, LA % N);
C語言中的Test-Set-Clear位
- 最小的可尋址單元是一個字符或字節。
將索引節點號轉換為磁盤上的索引節點
- 在EXT2文件系統中,每個文件都有一個唯一的索引節點結構。在文件系統磁盤上,索引節點從inode_table塊開始。
- 每個磁盤塊包含:
INODES_PER_BLOCK = BLOCK_SIZE/sizeof(INODE)
示例:
- 顯示超級塊
- 顯示位圖
- 顯示根索引節點
- 顯示目錄條目
遍歷EXT2文件系統樹
遍歷算法
- (1)讀取超級塊。
- (2)讀取塊組描述符塊(1 + s_first_data_block),以訪問組0描述符。
- (3)讀取InodeBeginBlock,獲取/的索引節點,即INODE#2。
- (4)將路徑名標記為組件字符串,假設組件數量為n。
- (5)從(3)中的根索引節點開始,在數據塊中搜索name[0]。
- (6)使用索引節點號ino來定位相應的索引節點
- (7)由於(5)~(6)步將會重複n次,所以最好編寫一個搜索函數
將路徑名轉換為索引節點
已知一個包含EXT2文件系統和路徑名的設備:
INODE *path2inode(int fd, char *pathname) // assume fd=file descriptor
顯示索引節點磁盤塊
- 編寫一個C程序showblock,可打印文件的所有磁盤塊。
EXT2文件系統的實現
文件系統的結構
- (1)是當前運行進程的PROC結構體
- (2)是文件系統的根指針
- (3)是一個openTable條目
- (4)是內存索引節點
- (5)是已掛載的文件系統表
文件系統的級別
文件系統的實現分為三個級別:
- 第1級別實現了基本文件系統樹
- 第2級別實現了文件內容讀/寫函數
- 第3級別實現了文件系統的掛載、卸載和文件保護
基本文件系統
- type.h:包含了超塊、組描述符、索引節點、目錄條目結構;打開文件表、掛載表、PROC結構體和文件系統常數
- global.c:包含文件系統全局變量
- 實用程序函數:get_block/put_block函數、iget(dev,ino)函數、The iput(INODE *mip)函數、getino()函數
- mount-root.c:用於掛載根文件系統
1級文件系統函數
- mkdir算法:創建一個帶路徑名的新目錄
- create算法:創建一個空的普通文件
- rmdir算法:刪除目錄
- link算法:創建從new_file到old_file的硬鏈接(只能用於普通文件,不能用於目錄)
- unlink算法:取消文件鏈接
- sylink算法:創建一個從新文件到舊文件的符號鏈接
- readlink算法:讀取符號文件的目標文件名並返回目標文件名的長度
2級文件系統函數
- open算法:打開一個文件進行讀或寫
- lseek算法:將打開的文件描述符在OFT中的偏移量設置為從文件開頭開始或當前位置開始的字節位置
- close算法:關閉文件描述符
- read系統調用:將n個字節從打開的文件描述符讀入用户空間的緩衝區
- write系統調用:將n個字節從用户空間的緩衝區寫入打開的文件描述符
- opendir-readdir
3級文件系統函數
- 掛載算法:
掛載操作命令mount filesys mount_point可將某個文件系統掛載到mount_point目錄上- 卸載算法:將掛載的文件系統與掛載點分開
- 交叉掛載點:修改getino(pathname)函數,來支持交叉掛載點
- 文件保護:通過文件索引節點中的權限位實現文件保護
- 實際uid和有效uid:每個進程都有一個實際uid和一個有效uid
- 文件鎖定:文件鎖定機制允許進程對一個文件或文件的某些部分設置文件鎖,以防止在更新文件時出現競態條件
問題和解決思路:
問題:EXT2fs.h頭文件安裝失敗:
解決思路:
根據此網址方法即可:https://developer.aliyun.com/article/842521
實踐內容與截圖,代碼鏈接:
嘗試使用df:
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。