Linux文件系統詳解

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

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

盤片上的物理組成:網絡

(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。ide

實體磁盤及虛擬磁盤:性能

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

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

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

/dev/Vgname/Lvname:邏輯卷日誌

三個數據的意義:code

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

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 對照表)

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

基本限制以下:

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

二、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

三、Superblock (超級區塊)

記錄的信息
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 號碼之間

五、block bitmap (區塊對照表)

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

六、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)

一、數據區(data section)

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

二、文件系統活動登陸區(log section)

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

三、實時運行區(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。不過目前沒有使用
相關文章
相關標籤/搜索