筆記

第十一章 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頭文件安裝失敗:

二三級索引表存儲路徑與存儲方式_描述符_02

解決思路:

根據此網址方法即可:https://developer.aliyun.com/article/842521

實踐內容與截圖,代碼鏈接:

嘗試使用df:

二三級索引表存儲路徑與存儲方式_文件描述符_03