伺服器寶塔wordpress不使用域名部署?
學習筆記
20191318 王澤文
《Unix/Linux系統程式設計》
第十一章 EXT2 檔案系統
本章討論 EXT2 檔案系統。 本章將引導讀者實現一個完全與 Linux 相容的完整EXT2 檔案系統。本章首先描述了EXT2 檔案系統在 Linux 中的歷史地位以及EXT3/EXT4 檔案系統的當前狀祝;用程式設計示例展示了各種EXT2 資料結構以及如何遍歷EXT2 檔案系統樹;介紹瞭如何實現支援 Linux 核心中所有檔案操作的EXT2 檔案系統;展示瞭如何通過虛擬磁碟的mount_root 來構建基本檔案系統;將檔案系統的實現劃分為 3 個級別, 級別 1 擴充套件了基本檔案系統, 以實現檔案系統樹, 級別 2 實現了檔案內容的讀/寫操作 , 級別 3 實現了檔案系統的掛載/裝載和檔案保護;描述了各個級別檔案系統函式的演算法,並通過程式設計示例演示了它們的實現過程;將所有級別融合到一個程式設計專案中;最後, 將所有程式設計示例和練習整合到一個完全有效的檔案系統中。
EXT2檔案系統資料結構
mke2fs [-b blksize -N ninodeel device nblocke
在裝置上建立一個帶有 nblocks 個塊(每個塊大小為 blksize 位元組)和 ninodes 個索引節點的EXT2 檔案系統。- 磁碟塊的內容:
Block#O
: 引導塊 BO是引導塊, 檔案系統不會使用它。 它用來容納一個載入程式, 從磁碟引導作業系統。Block#1
: 超級塊(在硬碟分割槽中位元組偏移量為I 024) Bl是超級塊, 用於容納整個文 件系統的資訊。Block#2
: 塊組描述符塊(硬碟上的 s_first_data_block+l) EXT2 將磁碟塊分成幾個組。 每個組有 8192 個塊(硬碟上的大小為 32K)。每組用一個塊組描述符結構體來描述。Block#8
: 塊點陣圖 (Bmap) (bg_block_bitmap) 點陣圖是用來表示某種項的位序列, 例如磁碟塊或索引節點。 點陣圖用於分配和回收項。Block#9
: 索引節點點陣圖 (Imap) (bg_inode_bitmap) 一個索引節點就是用來代表一個檔案的資料結構。 EXT2 檔案系統是使用有限數盤的索引節點建立的。各索引節點的狀態用 B9 的 Jmap 中的一個位表示。Block#10
: 索引(開始)節點 (bg_inode_table) 每個檔案都用一個 128 位元組 (EXT4 中 是 256 位元組)的唯一索引節點結構體表示。
索引節點結構體中一些內容:i_mode
i_size
欄位表示檔案大小(以位元組為單位)。 各時間欄位表示自 1970 年 1 月 1 日 0 時 0 分0秒以來經過的秒數。藉助以下庫函式將它們轉換為日曆形式:char *ctime(&time_field)
i _ block[15]
陣列包含指向檔案磁碟塊的指標, 這些磁碟塊有:- 直接塊 :
i_block[O]
至 i_block[ll], 指向直接磁碟塊。 - 間接塊:
i_block[12]
指向一個包含 256個塊編號(對於 1 KB BLKSlZE) 的磁碟塊, 每個塊編號指向一個磁碟塊。 - 雙重間接塊:
i_block[l3]
指向一個指向 256 個塊的塊, 每個塊指向 256 個磁碟塊。 - 三重間接塊:
i_block[14]
是三重間接塊。 對於 “小型"EXT2 義件系統,可以忽略它。
- 直接塊 :
- 資料塊:檔案儲存資料塊緊跟在索引節點塊後面。
郵差演算法:在計算機系統中, 經常出現下面這個問題。 一個城市有M 個街區, 編號從 0到M-1。 每個街區有N座房子, 編號從0 到 N-1。每座房子有一個唯一的街區地址, 用(街區, 房子)表示, 其中0<=街區<M, 0<=房子<N。 來自外太空的外星人可能不熟悉地球上的街區定址方案, 傾向於採用線性方法將這些房子地址編為 0, 1, ···, N-1, N, N+1 等。 已知某個街區地址 BA= (街區, 房子), 怎麼把它轉換為線性地址 LA, 反過來,已知線性地址,怎麼把它轉換為街區地址?如果都從0開始計數,轉換就會非常簡單。
Linear_addraaa LA=N*block + house;
Blook_address BA=(LA/N, LA % N);
遍歷EXT2檔案系統樹
遍歷演算法:
- 讀取超級塊。 檢查幻數 s_magic (OxEF53), 驗證它確實是EXT2 FS。
- 讀取塊組描述符塊 (1 + s_first_data_block), 以訪問組 0 描述符。 從塊組描述符的bg_inode_table 條目中找到索引節點的起始塊編號, 並將其稱為 InodesBeginBlock。
- 讀取 InodeBeginBlock, 獲取/的索引節點, 即 INODE #2。
- 將路徑名標記為元件字串, 假設元件數景為 n。
- 從 (3) 中的根索引節點開始 , 在其資料塊中搜索 name[O]。為簡單起見, 我們可以假設某個自錄中的條目數扯很少 , 因此一個目錄索引節點只有 12 個直接資料塊。 有了這個假設, 就可以在 12 個(非零)直接塊中搜索 name[O]。
- 使用索引節點號 ioo 來定位相應的索引節點。使用郵差演算法計算包含索引節點的磁碟塊及其在該塊中的偏移量。
EXT2檔案系統的實現
檔案系統的結構
- 是當前執行程序的PROC結構體。在實際系統中,每個義件操作都是由當前執行 的程序決定的C每個程序都有一個cwd,指向程序當前工作目錄(CWD)的記憶體索引節點c它還有一個檔案描述符陣列fd[],指面開啟的檔案例項。
- 是檔案系統的根指標。它指向記憶體中的根索引節點。當系統啟動時,選擇其中一個裝置作為根裝置,它必須是有效的EXT2檔案系統亡根裝置的根索引節點(inode#2)作為 檔案系統的根(/)載入到記憶體中口該操作稱為“掛載根檔案系統”。
- 是一個openTable條目。當某個程序開啟檔案時,程序fd陣列的某個條目會指向 openTable, openTable指向開啟檔案的記憶體索引節點。
- 是記憶體索引節點當需要某個檔案時,會把它的索引節點載入到minode槽中以供使用。
- 是已掛載的檔案系統表。
檔案系統的級別
檔案系統的實現分為三個級別。
基本檔案系統
type.h : EXT2 data structure types
這類檔案包含EXT2檔案系統的資料結構型別,比如超塊、組描述符、索引節點和目錄條目結構。此外,它還包含開啟檔案表、掛載表、PROC結構體和檔案系統常數。global.c: global variables of FS
這類檔案包含檔案系統的全域性變數。util.c : common utility functions: getino(), iget(), iput (), search () , etc.
該檔案包含檔案系統常用的實用程式函式。 最重要的實用程式函式是讀/寫磁碟塊函式iget()、iput()和getino()allocate_deallocate.c : inodes/blocks management functions
第1級別實現了基本檔案系統樹。它包含以下檔案,實現了指定函式。
mkdir_creat.c : make directory, create regular file
ls_cd_pwd.c : list directory, change directory, get CWD path
rmdir.c : remove directory
link_unlink.c : hard link and unlink files
symlink_readlink.c : symbolic link files
stat.c : return file information
misc1.c : access,chmod, chown, utime, etc.
使用第1級別FS函式的使用者命令程式有: mkdir 、 creat 、 mknod、 rmdir、 link 、 unlink、 symlink、 rm、 ls、 cd和pwd等。
第2級檔案系統實現了檔案內容的讀/寫操作。 它由以下函式組成: open 、 close 、 lseek 、 read 、 write 、 opendir 和 readdir。
open_close_lseek.c : open file for RBAD | WRITE|APPEND,close file and lseek
read.c : read from file descriptor of an opened regular file
write.c : write to file descriptor of an opened regular file
opendir_readdir.c : open and read directory
第3級別實現了檔案系統的掛載、解除安裝和檔案保護。
mount__umount.c : mount/umount file systems
file_protection : access permission checking
file-locking : lock/unlock files
其他
程式設計實踐
安裝ext2fs開發包sudo apt-get install ext2fs-dev
顯示超級塊
顯示點陣圖
顯示根索引節點