1. 程式人生 > 其它 >伺服器寶塔wordpress不使用域名部署?

伺服器寶塔wordpress不使用域名部署?

學習筆記

20191318 王澤文

  《Unix/Linux系統程式設計》


第十一章 EXT2 檔案系統

  本章討論 EXT2 檔案系統。 本章將引導讀者實現一個完全與 Linux 相容的完整EXT2 檔案系統。本章首先描述了EXT2 檔案系統在 Linux 中的歷史地位以及EXT3/EXT4 檔案系統的當前狀祝;用程式設計示例展示了各種EXT2 資料結構以及如何遍歷EXT2 檔案系統樹;介紹瞭如何實現支援 Linux 核心中所有檔案操作的EXT2 檔案系統;展示瞭如何通過虛擬磁碟的mount_root 來構建基本檔案系統;將檔案系統的實現劃分為 3 個級別, 級別 1 擴充套件了基本檔案系統, 以實現檔案系統樹, 級別 2 實現了檔案內容的讀/寫操作 , 級別 3 實現了檔案系統的掛載/裝載和檔案保護;描述了各個級別檔案系統函式的演算法,並通過程式設計示例演示了它們的實現過程;將所有級別融合到一個程式設計專案中;最後, 將所有程式設計示例和練習整合到一個完全有效的檔案系統中。


  EXT2檔案系統資料結構

  1. mke2fs [-b blksize -N ninodeel device nblocke在裝置上建立一個帶有 nblocks 個塊(每個塊大小為 blksize 位元組)和 ninodes 個索引節點的EXT2 檔案系統。
  2. 磁碟塊的內容:
    1. Block#O: 引導塊 BO是引導塊, 檔案系統不會使用它。 它用來容納一個載入程式, 從磁碟引導作業系統。
    2. Block#1 : 超級塊(在硬碟分割槽中位元組偏移量為I 024) Bl是超級塊, 用於容納整個文 件系統的資訊。
    3. Block#2: 塊組描述符塊(硬碟上的 s_first_data_block+l) EXT2 將磁碟塊分成幾個組。 每個組有 8192 個塊(硬碟上的大小為 32K)。每組用一個塊組描述符結構體來描述。
    4. Block#8: 塊點陣圖 (Bmap) (bg_block_bitmap) 點陣圖是用來表示某種項的位序列, 例如磁碟塊或索引節點。 點陣圖用於分配和回收項。
    5. Block#9: 索引節點點陣圖 (Imap) (bg_inode_bitmap) 一個索引節點就是用來代表一個檔案的資料結構。 EXT2 檔案系統是使用有限數盤的索引節點建立的。各索引節點的狀態用 B9 的 Jmap 中的一個位表示。
    6. Block#10: 索引(開始)節點 (bg_inode_table) 每個檔案都用一個 128 位元組 (EXT4 中 是 256 位元組)的唯一索引節點結構體表示。
      索引節點結構體中一些內容:
      • i_mode
        為 ul6 或 2 位元組無符號整數。在 i_mode 欄位中, 前 4 位指定了檔案型別, 接下來的 3 位 ugs 表示檔案的特殊用法。 最後 9 位是用於檔案保護的rwx許可權位。
      • 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 義件系統,可以忽略它。
    7. 資料塊:檔案儲存資料塊緊跟在索引節點塊後面。

  郵差演算法:在計算機系統中, 經常出現下面這個問題。 一個城市有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檔案系統樹

  遍歷演算法:

  1. 讀取超級塊。 檢查幻數 s_magic (OxEF53), 驗證它確實是EXT2 FS。
  2. 讀取塊組描述符塊 (1 + s_first_data_block), 以訪問組 0 描述符。 從塊組描述符的bg_inode_table 條目中找到索引節點的起始塊編號, 並將其稱為 InodesBeginBlock。
  3. 讀取 InodeBeginBlock, 獲取/的索引節點, 即 INODE #2。
  4. 將路徑名標記為元件字串, 假設元件數景為 n。
  5. 從 (3) 中的根索引節點開始 , 在其資料塊中搜索 name[O]。為簡單起見, 我們可以假設某個自錄中的條目數扯很少 , 因此一個目錄索引節點只有 12 個直接資料塊。 有了這個假設, 就可以在 12 個(非零)直接塊中搜索 name[O]。
  6. 使用索引節點號 ioo 來定位相應的索引節點。使用郵差演算法計算包含索引節點的磁碟塊及其在該塊中的偏移量。

  EXT2檔案系統的實現

  檔案系統的結構

  1. 是當前執行程序的PROC結構體。在實際系統中,每個義件操作都是由當前執行 的程序決定的C每個程序都有一個cwd,指向程序當前工作目錄(CWD)的記憶體索引節點c它還有一個檔案描述符陣列fd[],指面開啟的檔案例項。
  2. 是檔案系統的根指標。它指向記憶體中的根索引節點。當系統啟動時,選擇其中一個裝置作為根裝置,它必須是有效的EXT2檔案系統亡根裝置的根索引節點(inode#2)作為 檔案系統的根(/)載入到記憶體中口該操作稱為“掛載根檔案系統”。
  3. 是一個openTable條目。當某個程序開啟檔案時,程序fd陣列的某個條目會指向 openTable, openTable指向開啟檔案的記憶體索引節點。
  4. 是記憶體索引節點當需要某個檔案時,會把它的索引節點載入到minode槽中以供使用。
  5. 是已掛載的檔案系統表。

  檔案系統的級別

  檔案系統的實現分為三個級別。

  基本檔案系統

  1. type.h : EXT2 data structure types 這類檔案包含EXT2檔案系統的資料結構型別,比如超塊、組描述符、索引節點和目錄條目結構。此外,它還包含開啟檔案表、掛載表、PROC結構體和檔案系統常數。
  2. global.c: global variables of FS 這類檔案包含檔案系統的全域性變數。
  3. util.c : common utility functions: getino(), iget(), iput (), search () , etc. 該檔案包含檔案系統常用的實用程式函式。 最重要的實用程式函式是讀/寫磁碟塊函式iget()、iput()和getino()
  4. 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

  顯示超級塊

  顯示點陣圖

  顯示根索引節點