Linux 最傳統的磁碟檔案系統 (filesystem) 使用的是 EXT2 這個啦!

所以要瞭解 Linux 的檔案系統就得要由認識 EXT2 開始!

而檔案系統是建立在磁碟上面的,因此我們得瞭解磁碟的物理組成才行。

 

1 磁碟組成與分割的複習

首先說明一下磁碟的物理組成,整顆磁碟的組成主要有:

  • 圓形的磁碟盤(主要記錄資料的部分);
  • 機械手臂,與在機械手臂上的磁碟讀取頭(可讀寫磁碟盤上的資料);
  • 主軸馬達,可以轉動磁碟盤,讓機械手臂的讀取頭在磁碟盤上讀寫資料。

 

儲存與讀取的重點在於磁碟盤,而磁碟盤上的物理組成則為

 

  • 磁區(Sector)為最小的物理儲存單位,且依據磁碟設計的不同,目前主要有 512bytes 與 4K 兩種格式;
  • 將磁區組成一個圓,那就是磁柱(Cylinder);
  • 早期的分割主要以磁柱為最小分割單位,現在的分割通常使用磁區為最小分割單位(每個磁區都有其號碼喔,就好像座位一樣);
  • 磁碟分割表主要有兩種格式,一種是限制較多的 MBR 分割表,一種是較新且限制較少的 GPT 分割表。
  • MBR 分割表中,第一個磁區最重要,裡面有:(1)主要開機區(Master boot record, MBR)及分割表(partition table), 其中 MBR 佔有 446 bytes,而 partition table 則佔有 64 bytes。
  • GPT 分割表除了分割數量擴充較多之外,支援的磁碟容量也可以超過 2TB。

 

2 檔案系統特性

我們都知道磁碟分割完畢後還需要進行格式化(format),之後作業系統才能夠使用這個檔案系統。

為什麼需要進行『格式化』呢?

這是因為每種作業系統所設定的檔案屬性/權限並不相同,

為了存放這些檔案所需的資料,因此就需要將分割槽進行格式化,

以成為作業系統能夠利用的『檔案系統格式(filesystem)』。

 

例如 Linux 作業系統的檔案權限(rwx)與檔案屬性(擁有者、群組、時間參數等)。 

檔案系統通常會將這兩部份的資料分別存放在不同的區塊,權限與屬性放置到 inode 中,

至於實際資料則放置到 data block 區塊中。 

 另外,還有一個超級區塊 (superblock) 會記錄整個檔案系統的整體資訊,

包括 inode 與 block 的總量、使用量、剩餘量等。

 

由於每個 inode 與 block 都有編號,

而每個檔案都會佔用一個 inode ,inode 內則有檔案資料放置的 block 號碼。 

 

 

 

 

圖7.1.1、inode/block 資料存取示意圖

 

3 Linux 的 EXT2 檔案系統(inode)

因為標準的 Linux 檔案系統 Ext2 就是使用這種 inode 為基礎的檔案系統啦!

inode 的內容在記錄檔案的權限與相關屬性,至於 block 區塊則是在記錄檔案的實際內容。

而且檔案系統一開始就將 inode 與 block 規劃好了,除非重新格式化(或者利用 resize2fs 等指令變更檔案系統大小),

否則 inode 與 block 固定後就不再變動。

 

 

因此 Ext2 檔案系統在格式化的時候基本上是區分為多個區塊群組 (block group) 的,每個區塊群組都有獨立的 inode/block/superblock 系統。

 

 

 

  • data block (資料區塊)

 

data block 是用來放置檔案內容資料地方,在 Ext2 檔案系統中所支援的 block 大小有 1K, 2K 及 4K 三種而已。

除此之外 Ext2 檔案系統的 block 還有什麼限制呢?有的!基本限制如下:

  • 原則上,block 的大小與數量在格式化完就不能夠再改變了(除非重新格式化);
  • 每個 block 內最多只能夠放置一個檔案的資料;
  • 承上,如果檔案大於 block 的大小,則一個檔案會佔用多個 block 數量;
  • 承上,若檔案小於 block ,則該 block 的剩餘容量就不能夠再被使用了(磁碟空間會浪費)。

 

  • inode table (inode 表格)

基本上,inode 記錄的檔案資料至少有底下這些:

 

  • 該檔案的存取模式(read/write/excute);
  • 該檔案的擁有者與群組(owner/group);
  • 該檔案的容量;
  • 該檔案建立或狀態改變的時間(ctime);
  • 最近一次的讀取時間(atime);
  • 最近修改的時間(mtime);
  • 定義檔案特性的旗標(flag),如 SetUID...;
  • 該檔案真正內容的指向 (pointer);

 

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

  • 每個 inode 大小均固定為 128 bytes (新的 ext4 與 xfs 可設定到 256 bytes);
  • 每個檔案都僅會佔用一個 inode 而已;
  • 承上,因此檔案系統能夠建立的檔案數量與 inode 的數量有關;
  • 系統讀取檔案時需要先找到 inode,並分析 inode 所記錄的權限與使用者是否符合,若符合才能夠開始實際讀取 block 的內容。

 

  • Superblock (超級區塊)

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

  • block 與 inode 的總量;
  • 未使用與已使用的 inode / block 數量;
  • block 與 inode 的大小 (block 為 1, 2, 4K,inode 為 128bytes 或 256bytes);
  • filesystem 的掛載時間、最近一次寫入資料的時間、最近一次檢驗磁碟 (fsck) 的時間等檔案系統的相關資訊;
  • 一個 valid bit 數值,若此檔案系統已被掛載,則 valid bit 為 0 ,若未被掛載,則 valid bit 為 1 。

 

 

  • Filesystem Description (檔案系統描述說明)

這個區段可以描述每個 block group 的開始與結束的 block 號碼,

以及說明每個區段 (superblock, bitmap, inodemap, data block) 分別介於哪一個 block 號碼之間。

這部份也能夠用 dumpe2fs 來觀察的。

 

  • block bitmap (區塊對照表)

如果你想要新增檔案時總會用到 block 吧!那你要使用哪個 block 來記錄呢?當然是選擇『空的 block 』來記錄新檔案的資料囉。 那你怎麼知道哪個 block 是空的?這就得要透過 block bitmap 的輔助了

 

  • inode bitmap (inode 對照表)

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

 

 

 

 

4 與目錄樹的關係.

 

每個檔案(不管是一般檔案還是目錄檔案)都會佔用一個 inode ,

且可依據檔案內容的大小來分配多個 block 給該檔案使用。

目錄的內容在記錄檔名, 一般檔案才是實際記錄資料內容的地方。

 

  • 目錄

當我們在 Linux 下的檔案系統建立一個目錄時,檔案系統會分配一個 inode 與至少一塊 block 給該目錄。

如果想要實際觀察 root 家目錄內的檔案所佔用的 inode 號碼時,可以使用 ls -i 這個選項來處理:

 

 

當你使用『 ll / 』時,出現的目錄幾乎都是 1024 的倍數,為什麼呢?因為每個 block 的數量都是 1K, 2K, 4K 嘛! 看一下鳥哥的環境:

 

由於鳥哥的根目錄使用的 block 大小為 4K ,因此每個目錄幾乎都是 4K 的倍數。

其中由於 /usr/sbin 的內容比較複雜因此佔用了 4 個 block !

至於奇怪的 /proc 我們在第五章就講過該目錄不佔磁碟容量, 所以當然耗用的 block 就是 0 囉!

 

  • 檔案:

當我們在 Linux 下的 ext2 建立一個一般檔案時, ext2 會分配一個 inode 與相對於該檔案大小的 block 數量給該檔案。

例如:假設我的一個 block 為 4 Kbytes ,而我要建立一個 100 KBytes 的檔案,

那麼 linux 將分配一個 inode 與 25 個 block 來儲存該檔案!

但同時請注意,由於 inode 僅有 12 個直接指向,因此還要多一個 block 來作為區塊號碼的記錄喔!

 

  • 目錄樹讀取:

 

posted on 2016-05-23 10:21  Sharpest  阅读(149)  评论(0)    收藏  举报