Linux文件系統詳解

博文大綱
* 磁盤組成與分區
* 文件系統特性
* Linux的EXT2文件系統
* 與目錄樹的關係
* Ext2/ext3文件的存取與日誌式文件系統功能
* Linux文件系統的運行
* 掛載點的意義
* 其他Linux支持的文件系統與vfs
* XFS文件系統簡介

整顆磁盤的組成:
圓形的盤片(主要記錄數據的部分);
機械手臂,與在機械手臂上的磁頭(可讀寫盤片上的數據);
主軸馬達,可以轉動盤片,讓機械手臂的磁頭在盤片上讀寫數據。

盤片上的物理組成:

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

實體磁盤及虛擬磁盤:

/dev/sd[a-p][1-128]:爲實體磁盤的磁盤文件名

/dev/vd[a-d][1-128]:爲虛擬磁盤的磁盤文件名

/dev/md[0-128]:軟件磁盤陣列

/dev/Vgname/Lvname:邏輯卷

三個數據的意義:

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

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

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

索引式文件系統:
1.(EXT4文件系統讀取數據的過程)

系統先格式化出inode與block的區塊。如下圖,要訪問一個文件時,首先找到這個文件的inode,根據inode中的權限查看當前用戶是否有權力讀取這個文件;然後根據inode中記錄的block的號碼,操作系統據此排列磁盤閱讀順序,一口氣將四個block內容讀出。最後找到block,讀出數據。這種文件系統就叫做索引式文件系統

Linux文件系統詳解

2.(U盤使用的文件系統(FAT))

U盤(閃存)一般使用FAT文件系統,而FAT文件系統並沒有inode,每個block中記錄着本文件下一個block的位置。所以FAT文件系統無法通過inode一次性將這個文件所有的block號碼讀取出來,而只能一個個地讀取block後才能知道下一個block的位置。
如下圖:
Linux文件系統詳解

上圖中我們假設文件的數據依序寫入1->7->4->15號這四個 block 號碼中, 但這個文件系統沒有辦法一口氣就知道四個 block 的號碼,他得要一個一個的將 block 讀出後,纔會知道下一個 block 在何處。如果同一個文件數據寫入的 block 分散的太過厲害時,則我們的磁盤讀取頭將無法在磁盤轉一圈就讀到所有的數據, 因此磁盤就會多轉好幾圈能完整的讀到到這個文件的內容。所以如果同一個文件的block分散地太開,那麼讀取一個文件的時間就會很長,所以就有所謂的“碎片整理“,就是將同一個文件的block們儘量放到一起去。但Linux的EXT4文件系統由於是索引式的,因此不太需要碎片整理。

Ext2 格式化後:

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

區塊羣組(block group)的六個主要內容:

  • data block (數據區塊)
  • inode table (inode 表格)
  • Superblock (超級區塊)
  • Filesystem Description (文件系統描述說明)
  • block bitmap (區塊對照表)
  • inode bitmap (inode 對照表)

1、data block (數據區塊)
Linux文件系統詳解

基本限制如下:

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

2、inode table (inode 表格)

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

每個inode 大小均固定爲128 bytes (新的ext4 與xfs 可設定到256 bytes);
每個檔案都僅會佔用一個inode 而已;

承上,因此檔案系統能夠建立的檔案數量與inode 的數量有關;
系統讀取檔案時需要先找到inode,並分析inode 所記錄的權限與使用者是否符合,若符合才能夠開始實際讀取 block 的內容

inode 的結構

Linux文件系統詳解

12個直接指向: 12*1K=12K

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

每筆block號碼的記錄會花去4bytes,因此1K的大小能夠記錄256筆記錄,因此一個間接可以記錄的檔案大小如上;
雙間接: 2562561K=256 2 K

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

第一層block會指定256個第二層,每個第二層可以指定256個第三層,每個第三層可以指定256個號碼,因此總額大小如上;

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

3、Superblock (超級區塊)

記錄的信息
block 與 inode 的總量;
未使用與已使用的 inode / block 數量;
block 與 inode 的大小(block 爲 1, 2, 4K,inode 爲 128Bytes 或 256Bytes);
filesystem 的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤(fsck)的時間等文件系統的相關信息;
一個 valid bit 數值,若此文件系統已被掛載,則 valid bit 爲 0 ,若未被掛載,則 valid bit 爲 1

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

這個區段可以描述每個 block group 的開始與結束的 block 號碼,以及說明每個區段(superblock, bitmap, inodemap,data block)分別介於哪一個 block 號碼之間

5、block bitmap (區塊對照表)

從 block bitmap 當中可以知道哪些 block 是空的,如果你刪除某些文件時,那些文件原本佔用的 block 號碼就得要釋放出來, 此時在 block bitmap 當中相對應到該 block 號碼的標誌就得要修改成爲『未使用中』

6、inode bitmap (inode 對照表)

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

文件系統與目錄樹的關係:

目錄:

Linux文件系統詳解

目錄樹讀取

由於目錄樹是由根目錄開始讀起,因此係統通過掛載的信息可以找到掛載點的inode號碼(通常一個文件系統的最頂層inode號碼會由2號開始),此時就能夠得到根目錄的inode裏面的內容,並依據該inode讀取根目錄的block內的文件名數據,再一層一層地往下讀到正確的文件名

與目錄樹的關係

filesystem 大小與磁盤讀取性能:
關於文件系統的使用效率上,當你的一個文件系統規劃的很大時,例如 100GB 這麼大時,由於磁盤上面的數據總是來來去去的,所以,整個文件系統上面的文件通常無法連續寫在一起(block 號碼不會連續的意思),而是填入式的將數據填入沒有被使用的 block 當中。如果文件寫入的 block 真的分的很散,此時就會有所謂的文件數據離散的問題發生了

文件系統的行爲:
一般來說,我們將 inode table 與 data block 稱爲數據存放區域,

至於其他例如 superblock、block bitmap 與 inodebitmap 等區段就被稱爲 metadata (中介數據)(因爲superblock, inode bitmap 及 block bitmap 的數據是經常變動的,每次新增、移除、編輯時都可能會影響到這三個部分的數據,因此才被稱爲中介數據的啦)

日誌式文件系統(Journaling filesystem)

  1. 預備:當系統要寫入一個文件時,會先在日誌記錄區塊中紀錄某個文件準備要寫入的信息;
  2. 實際寫入:開始寫入文件的權限與數據;開始更新 metadata 的數據;
  3. 結束:完成數據與 metadata 的更新後,在日誌記錄區塊當中完成該文件的紀錄。
  • (在這種機制下,斷電後,由於新的數據還未成功寫入,舊的數據就不會被擦除,保證了數據的完整性,使得整個文件結構不被破壞)


Linux 文件系統的運行:

Linux 系統上面文件系統與內存有非常大的關係:

系統會將常用的文件數據放置到內存的緩衝區,以加速文件系統的讀/寫;
承上,因此 Linux 的實體內存最後都會被用光!這是正常的情況!可加速系統性能;
你可以手動使用 sync 來強迫內存中設置爲 Dirty 的文件回寫到磁盤中;
若正常關機時,關機指令會主動調用 sync 來將內存的數據回寫入磁盤內;
但若不正常關機(如跳電、死機或其他不明原因),由於數據尚未回寫到磁盤內,因此重新開機後可能會花很多時間在進行磁盤檢驗,甚至可能導致文件系統的損毀(非磁盤損毀)。

掛載點的意義(mount point)
掛載點一定是目錄,該目錄爲進入該文件系統的入口

每個 filesystem 都有獨立的 inode / block / superblock 等信息,這個文件系統要能夠鏈接到目錄樹才能被我們使用。將文件系統與目錄樹結合的動作我們稱爲“掛載”

其他 Linux 支持的文件系統與 VFS:
VFS:(Linux的內核功能,用於讀取文件系統)
常見的支持文件系統:

傳統文件系統:ext2 / minix / MS-DOS / FAT (用 vfat 模塊) / iso9660 (光盤)等等;
日誌式文件系統: ext3 /ext4 / ReiserFS / Windows' NTFS / IBM's JFS / SGI's XFS / ZFS
網絡文件系統: NFS / SMBFS


其他 Linux 支持的文件系統與 VFS:

Linux文件系統詳解


XFS 文件系統簡介:

EXT 家族當前較傷腦筋的地方:支持度最廣,但格式化超慢!家族當前較傷腦

Ext 文件系統家族對於文件格式化的處理方面,採用的是預先規劃出所有的 inode/block/meta data 等數據,未來系統可以直接取用,不需要再進行動態配置的作法

xfs 文件系統在數據的分佈上,主要規劃爲三個部份:

  • 數據區(data section)
  • 文件系統活動登錄區(logsection)
  • 實時運行區(realtime section)

1、數據區(data section)

基本上,數據區就跟我們之前談到的 ext 家族一樣,包括 inode/data block/superblock 等數據,都放置在這個區塊。這個數據區與 ext 家族的 block group 類似,也是分爲多個儲存區羣組(allocation groups)來分別放置文件系統所需要的數據。
每個儲存區羣組都包含了(1)整個文件系統的 superblock、(2)剩餘空間的管理機制、(3)inode的分配與追蹤。
此外,inode與 block 都是系統需要用到時,這才動態配置產生,所以格式化動作超級快

2、文件系統活動登錄區(log section)

在登錄區這個區域主要被用來紀錄文件系統的變化,其實有點像是日誌區啦!文件的變化會在這裏紀錄下來,直到該變化完整的寫入到數據區後,該筆紀錄纔會被終結。如果文件系統因爲某些緣故(例如最常見的停電)而損毀時,系統會拿這個登錄區塊來進行檢驗,看看系統掛掉之前,文件系統正在運行些啥動作,藉以快速的修復文件系統。

3、實時運行區(realtime section)

當有文件要被創建時,xfs 會在這個區段裏面找一個到數個的 extent 區塊,將文件放置在這個區塊內,等到分配完畢後,再寫入到 data section 的 inode 與 block 去!這個 extent 區塊的大小得要在格式化的時候就先指定,最小值是 4K 最大可到 1G。一般非磁盤陣列的磁盤默認爲 64K 容量,而具有類似磁盤陣列的 stripe 情況下,則建議 extent 設置爲與 stripe 一樣大較佳。這個 extent 最好不要亂動,因爲可能會影響到實體磁盤的性能喔。

XFS 文件系統的描述數據觀察
Linux文件系統詳解

  • 第 1 行裏面的 isize 指的是 inode 的容量,每個有 256Bytes 這麼大。至於 agcount 則是前面談到的儲存區羣組(allocationgroup)的個數,共有 4 個,agsize 則是指每個儲存區羣組具有 65536 個 block 。配合第 4 行的 block 設置爲 4K,因此整個文件系統的容量應該就是 4655364K 這麼大!

  • 第 2 行裏面 sectsz 指的是邏輯扇區(sector)的容量設置爲 512Bytes 這麼大的意思。

  • 第 4 行裏面的 bsize 指的是 block 的容量,每個 block 爲 4K 的意思,共有 262144 個 block 在這個文件系統內。

  • 第 5 行裏面的 sunit 與 swidth 與磁盤陣列的 stripe 相關性較高。這部份我們下面格式化的時候會舉一個例子來說明。

  • 第 7 行裏面的 internal 指的是這個登錄區的位置在文件系統內,而不是外部設備的意思。且佔用了 4K * 2560 個 block,總共約10M 的容量。

  • 第 9 行裏面的 realtime 區域,裏面的 extent 容量爲 4K。不過目前沒有使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章