linux Ext2文件系統

摘抄自鳥哥的linux私房菜基礎學習篇第三版

文件系統特性

我們都知道磁盤分區完畢後還需要進行格式化(format),之後操作系統才能夠使用這個分區。 爲什麼需要進行『格式化』呢?這是因爲每種操作系統所設定的文件屬性/權限並不相同, 爲了存放這些文件所需的數據,因此就需要將分區進行格式化,以成爲操作系統能夠利用的『文件系統格式(filesystem)』。

由此我們也能夠知道,每種操作系統能夠使用的文件系統並不相同。 舉例來說,windows 98 以前的微軟操作系統主要利用的文件系統是 FAT (或者 FAT16),windows 2000 以後的版本有所謂的NTFS 文件系統,至於 Linux 的正統文件系統則爲 Ext2(2009年) (Linux second extended file system, ext2fs)這一個。此外,在默認的情況下,windows 操作系統是不會識別Linux 的 Ext2 的。

傳統的磁盤與文件系統的應用中,一個分區就是隻能夠被格式化成爲一個文件系統,所以我們可以說一個文件系統 filesystem 就是一個 分區partition。但是由於新技術的利用,例如我們常聽到的LVM與軟磁盤陣列(software raid), 這些技術可以將一個分區格式化爲多個文件系統(例如LVM),也能夠將多個分區合成一個文件系統(LVM, RAID)! 所以說,目前我們在格式化時已經不再說成針對 分區partition 來格式化了, 通常我們可以稱呼一個可被掛載的數據爲一個文件系統而與是一個分區。

那麼文件系統是如何運作的呢?這與操作系統的文件數據有關。較新的操作系統的文件數據除了文件實際內容外, 通常含有非常多的屬性,例如 Linux 操作系統的文件權限(rwx)與文件屬性(擁有者、羣組、時間參數等)。 文件系統通常會將這兩部分的數據分別存放在不同的區塊,權限與屬性放置到 inode 中,至於實際數據則放置到 data block 區塊中。 另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的整體信息,包括 inode 與block 的總量、使用量、剩餘量等。

每個 inode 與 block 都有編號,至於這三個數據的的意義可以簡略說明如下:

superblock:記錄此 filesystem 的整體信息,包括inode/block的總量、使用量、剩餘量, 以及文件系統的格式與相關信息等;

 inode:記錄文件的屬性,一個文件佔用一個inode,同時記錄此文件的數據所在的 block 號碼;

 block:實際記錄文件的內容,若文件太大時,會佔用多個 block 。

由於每個 inode 與block 都有編號,而每個文件都會佔用一個 inode ,inode 內則有文件數據放置的 block 號碼。 因此,我們可以知道的是,如果能夠找到文件的 inode 的話,那麼自然就會知道這個文件所放置數據的 block 號碼, 當然也就能夠讀出該文件的實際數據了。這是個比較有效率的作法,因爲如此一來我們的磁盤就能夠在短時間內讀取出全部的數據, 讀寫的效能比較好囉。

我們將 inode 與 block 區塊用圖解來說明一下,如下圖所示,文件系統先格式化出 inode 與block 的區塊,假設某一個文件的屬性與權限數據是放置到 inode 4 號(下圖較小方格內),而這個 inode 記錄了文件數據的實際放置點爲 2, 7, 13, 15 這四個 block 號碼,此時我們的操作系統就能夠據此來排列磁盤的閱讀順序,可以一口氣將四個 block 內容讀出來! 那麼數據的讀取就如同下圖中的箭頭所指定的模樣了。


這種數據存取的方法我們稱爲索引式文件系統(indexed allocation)。那有沒有其他的慣用文件系統可以比較一下啊? 有的,那就是我們慣用的U盤(閃存),U盤使用的文件系統一般爲 FAT 格式。FAT 這種格式的文件系統並沒有 inode 存在,所以 FAT 沒有辦法將這個文件的所有 block 在一開始就讀取出來。每個 block 號碼都記錄在前一個 block 當中, 他的讀取方式有點像底下這樣:


上圖中我們假設文件的數據依序寫入1->7->4->15號這四個 block 號碼中, 但這個文件系統沒有辦法一口氣就知道四個 block 的號碼,他得要一個一個的將 block 讀出後,纔會知道下一個 block 在何處。 如果同一個文件數據寫入的 block 分散的太過厲害時,則我們的磁盤讀取頭將無法在磁盤轉一圈就讀到所有的數據, 因此磁盤就會多轉好幾圈才能完整的讀取到這個文件的內容!

常常會聽到所謂的『碎片整理』吧? 需要碎片整理的原因就是文件寫入的 block 太過於離散了,此時文件讀取的效能將會變得很差所致。 這個時候可以透過碎片整理將同一個文件所屬的 blocks 彙整在一起,這樣數據的讀取會比較容易啊! FAT 的文件系統需要經常的碎片整理一下,那麼 Ext2 是否需要磁盤重呢?

由於 Ext2 是索引式文件系統,基本上不太需要常常進行碎片整理的。但是如果文件系統使用太久, 常常刪除/編輯/新增文件時,那麼還是可能會造成文件數據太過於離散的問題,此時或許會需要進行重整一下的。

Linux 的 EXT2 文件系統(inode):

我們介紹過 Linux 的文件除了原有的數據內容外,還含有非常多的權限與屬性,這些權限與屬性是爲了保護每個用戶所擁有數據的隱密性。 而前一小節我們知道 filesystem 裏面可能含有的 inode/block/superblock 等。爲什麼要談這個呢?因爲標準的 Linux 文件系統 Ext2 (2009年)就是使用這種 inode 爲基礎的文件系統啦!

而如同前一小節所說的,inode 的內容在記錄文件的權限與相關屬性,至於 block 區塊則是在記錄文件的實際內容。 而且文件系統一開始就將 inode 與 block 規劃好了,除非重新格式化(或者利用 resize2fs 等指令變更文件系統大小),否則 inode 與 block 固定後就不再變動。但是如果仔細考慮一下,如果我的文件系統高達數百GB時, 那麼將所有的 inode 與 block 通通放置在一起將是很不智的決定,因爲 inode 與 block 的數量太龐大,不容易管理。 爲此之故,因此 Ext2 文件系統在格式化的時候基本上是區分爲多個區塊羣組 (block group) 的,每個區塊羣組都有獨立的 inode/block/superblock 系統。感覺上就好像我們在當兵時,一個營裏面有分成數個連,每個連有自己的聯絡系統, 但最終都向營部回報連上最正確的信息一般!這樣分成一羣羣的比較好管理啦!整個來說,Ext2 格式化後有點像底下這樣:


在整體的規劃當中,文件系統最前面有一個啓動扇區(boot sector),這個啓動扇區可以安裝開機管理程序, 這是個非常重要的設計,因爲如此一來我們就能夠將不同的開機管理程序安裝到個別的文件系統最前端,而不用覆蓋整塊硬盤唯一的 MBR, 這樣也才能夠製作出多重引導的環境啊!至於每一個區塊羣組(block group)的六個主要內容說明如後:

 datablock (資料區塊)

datablock 是用來放置文件內容數據地方,在 Ext2 文件系統中所支持的 block 大小有 1K, 2K 及 4K 三種而已。在格式化時 block 的大小就固定了,且每個 block 都有編號,以方便 inode 的記錄啦。 不過要注意的是,由於 block 大小的差異,會導致該文件系統能夠支持的最大磁盤容量與最大單一文件容量並不相同。 因爲 block 大小而產生的 Ext2 文件系統限制如下:

Block 大小

1KB

2KB

4KB

最大單一文件限制

16GB

256GB

2TB

最大文件系統總容量

2TB

8TB

16TB

你需要注意的是,雖然 Ext2 已經能夠支持大於 2GB 以上的單一文件容量,不過某些應用程序依然使用舊的限制, 也就是說,某些程序只能夠捉到小於 2GB 以下的文件而已,這就跟文件系統無關了! Ext2 文件系統的 block 還有什麼限制呢?有的!基本限制如下:

 原則上,block 的大小與數量在格式化完就不能夠再改變了(除非重新格式化);

 每個 block 內最多隻能夠放置一個文件的數據;

 承上,如果文件大於 block 的大小,則一個文件會佔用多個 block 數量;

 承上,若文件小於 block ,則該 block 的剩餘容量就不能夠再被使用了(磁盤空間會浪費)。

如上第四點所說,由於每個 block 僅能容納一個文件的數據而已,因此如果你的文件都非常小,但是你的 block 在格式化時卻選用最大的 4K 時,可能會產生一些容量的浪費喔!我們以底下的一個簡單例題來算一下空間的浪費吧!

例題: 假設你的Ext2文件系統使用 4K block ,而該文件系統中有 10000 個小文件,每個文件大小均爲 50bytes, 請問此時你的磁盤浪費多少容量?

答: 由於 Ext2 文件系統中一個 block 僅能容納一個文件,因此每個 block 會浪費『 4096 - 50 = 4046 (byte)』, 系統中總共有一萬個小文件,所有文件容量爲:50 x 10000 (bytes) = 488.3Kbytes,但此時浪費的容量爲:『 4046 x 10000 (bytes) = 38.6MBytes』。想一想,不到 1MB 的總文件容量卻浪費將近 40MB 的容量,且文件越多將造成越多的磁盤容量浪費。

什麼情況會產生上述的狀況呢?例如 BBS 網站的數據啦!如果 BBS 上面的數據使用的是純文本文件來記載每篇留言, 而留言內容如果都寫上『如題』時,想一想,是否就會產生很多小文件了呢? 好,既然大的 block 可能會產生較嚴重的磁盤容量浪費,那麼我們是否就將 block 大小訂爲 1K 即可? 這也不妥,因爲如果 block 較小的話,那麼大型文件將會佔用數量更多的 block ,而 inode 也要記錄更多的 block 號碼,此時將可能導致文件系統不良的讀寫效能。 所以我們可以說,在進行文件系統的格式化之前,請先想好該文件系統預計使用的情況。

 inodetable (inode 表格)

再來認識一下 inode 這個玩意兒吧!如前所述 inode 的內容在記錄文件的屬性以及該文件實際數據是放置在哪幾號 block 內! 基本上,inode 記錄的文件數據至少有底下這些:

 該文件的存取模式(read/write/excute);

 該文件的擁有者與羣組(owner/group);

 該文件的容量;

 該文件建立或狀態改變的時間(ctime);

 最近一次的讀取時間(atime);

 最近修改的時間(mtime);

 定義文件特性的旗標(flag),如 SetUID...;

 該文件真正內容的指向 (pointer);

inode 的數量與大小也是在格式化時就已經固定了,除此之外 inode 還有些什麼特色呢?

 每個 inode 大小均固定爲 128 bytes;

 每個文件都僅會佔用一個 inode 而已;

 承上,因此文件系統能夠建立的文件數量與 inode 的數量有關;

 系統讀取文件時需要先找到 inode,並分析 inode 所記錄的權限與用戶是否符合,若符合才能夠開始實際讀取 block 的內容。

我們約略來分析一下 inode / block 與文件大小的關係好了。inode 要記錄的數據非常多,但偏偏又只有 128bytes 而已, 而 inode 記錄一個 block 號碼要花掉 4byte ,假設我一個文件有 400MB 且每個 block 爲 4K 時, 那麼至少也要十萬筆 block 號碼的記錄呢!inode 哪有這麼多可記錄的信息?爲此我們的系統很聰明的將 inode 記錄 block 號碼的區域定義爲12個直接,一個間接, 一個雙間接與一個三間接記錄區。這是啥?我們將 inode 的結構畫一下好了。


上圖最左邊爲 inode 本身 (128 bytes),裏面有 12 個直接指向 block 號碼的對照,這 12 筆記錄就能夠直接取得 block 號碼啦! 至於所謂的間接就是再拿一個 block 來當作記錄 block 號碼的記錄區,如果文件太大時, 就會使用間接的 block 來記錄編號。如上圖當中間接只是拿一個 block 來記錄額外的號碼而已。 同理,如果文件持續長大,那麼就會利用所謂的雙間接,第一個 block 僅再指出下一個記錄編號的 block 在哪裏, 實際記錄的在第二個 block 當中。依此類推,三間接就是利用第三層 block 來記錄編號啦! 這樣子 inode 能夠指定多少個 block 呢?我們以較小的 1K block 來說明好了,可以指定的情況如下:

 12 個直接指向: 12*1K=12K 由於是直接指向,所以總共可記錄 12 筆記錄,因此總額大小爲如上所示;

 間接: 256*1K=256K 每筆 block 號碼的記錄會花去 4bytes,因此 1K 的大小能夠記錄 256 筆記錄,因此一個間接可以記錄的文件大小如上;

 雙間接: 256*256*1K=2562K 第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個號碼,因此總額大小如上;

 三間接: 256*256*256*1K=2563K 第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個第三層,每個第三層可以指定 256 個號碼,因此總額大小如上;

 總額:將直接、間接、雙間接、三間接加總,得到 12 + 256 + 256*256 + 256*256*256(K) =

16GB

此時我們知道當文件系統將 block 格式化爲 1K 大小時,能夠容納的最大文件爲 16GB,比較一下文件系統限制表的結果可發現是一致的!但這個方法不能用在 2K 及 4K block 大小的計算中, 因爲大於 2K 的 block 將會受到 Ext2 文件系統本身的限制,所以計算的結果會不太符合之故。

Superblock (超級區塊)

Superblock是記錄整個 filesystem 相關信息的地方, 沒有 Superblock ,就沒有這個 filesystem 了。他記錄的信息主要有:

 block 與 inode 的總量;

 未使用與已使用的 inode / block 數量;

 block 與 inode 的大小 (block 爲 1, 2, 4K,inode 爲 128 bytes);

filesystem 的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤 (fsck) 的時間等文件系統的相關信息;

 一個 valid bit 數值,若此文件系統已被掛載,則 valid bit 爲 0 ,若未被掛載,則 valid bit 爲 1 。

Superblock是非常重要的,因爲我們這個文件系統的基本信息都寫在這裏,因此,如果 superblock 死掉了, 你的文件系統可能就需要花費很多時間去挽救啦!一般來說, superblock 的大小爲 1024bytes。相關的 superblock 信息我們可以用 dumpe2fs 指令來呼叫出來觀察喔!

此外,每個 block group 都可能含有 superblock 喔!但是我們也說一個文件系統應該僅有一個 superblock 而已,那是怎麼回事啊? 事實上除了第一個 block group 內會含有 superblock 之外,後續的 block group 不一定含有 superblock , 而若含有 superblock 則該 superblock 主要是做爲第一個 block group 內 superblock 的備份咯,這樣可以進行 superblock 的救援呢!

Filesystem Description (文件系統描述說明)

這個區段可以描述每個 block group 的開始與結束的 block 號碼,以及說明每個區段 (superblock, bitmap, inodemap, data block) 分別介於哪一個 block 號碼之間。這部分也能夠用 dumpe2fs 來觀察的。

 blockbitmap (區塊對照表)

如果你想要新增文件時總會用到 block 吧!那你要使用那個 block 來記錄呢?當然是選擇『空的 block 』來記錄新文件的數據囉。 那你怎麼知道那個 block 是空的?這就得要透過 block bitmap 的輔助了。從 block bitmap 當中可以知道哪些 block 是空的,因此我們的系統就能夠很迅速的找到可使用的空間來處置文件囉。 同樣的,如果你刪除某些文件時,那麼那些文件原本佔用的 block 號碼就得要釋放出來, 此時在 block bitmpap 當中相對應到該 block 號碼的標誌就得要修改成爲『未使用中』囉!這就是 bitmap 的功能。

 inodebitmap (inode 對照表)

這個其實與 block bitmap 是類似的功能,只是 block bitmap 記錄的是使用與未使用的 block 號碼, 至於 inode bitmap 則是記錄使用與未使用的 inode 號碼。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章