看完這篇文章沒人敢說你不懂文件系統

相信搞軟件開發的同學對文件系統都有一定的瞭解,即使不是做軟件開發工作的同學對文件系統也有感性的認識。其實回憶一下,無論是Linux操作系統也好,還是Windows或者Mac也好,在我們普通用戶的視角看到的其實就是一個個文件。比如電影是用視頻文件存儲,也就是表示某種視頻格式的文件;音樂是用音頻文件存儲的,像mp3、wave和midi等等格式;圖像是用圖片文件格式存儲的,像png、jpg和bmp等等。雖然文件中的內容和存儲格式不同,但其原理都是一樣的,都依賴於文件系統

我們知道文件系統是位於磁盤之上的,但具體什麼原理可能不清楚。也沒考慮過為什麼不直接使用磁盤。我們先看一下磁盤的結構,磁盤內部如圖1所示,其內部有若干個盤片,數據存儲在磁盤的盤片上。而盤片又劃分為磁道和扇區,具體細節本文就不深入分析了。

看完這篇文章沒人敢說你不懂文件系統

圖1 磁盤內部結構

如果我們從磁盤上讀寫數據,從感官上應該是比較複雜的。首先需要知道在哪個盤片上,然後需要知道在盤片的什麼位置,然後才能讀取或者寫入數據。實際上不用那麼複雜,磁盤的控制器已經替我們做了很多事情,它對這些內部的結構進行了統一管理,呈現給我們的只是一個線性的地址。比如一個1T的硬盤,其呈現給我們的就是從0字節開始,以1字節遞增,直到1TB的地址空間。當然,機械磁盤可進行讀寫的最小粒度為1個扇區(512字節)。

看完這篇文章沒人敢說你不懂文件系統

圖2 磁盤存儲空間抽象

既然可以這麼方便的訪問磁盤空間了,那為什麼還要文件系統呢?

其實最主要的原因有3方面,也即:

  1. 便於磁盤空間的管理
  2. 方便數據的組織和查找
  3. 提高磁盤空間的使用率

便於磁盤空間管理

我們不考慮存儲操作系統的磁盤,即使是存放普通數據(例如放電影視頻文件)的磁盤,如果沒有文件系統會是什麼樣子。

比如我們把《空中客車》放到0到1GB的空間,《蝙蝠俠》放到1G到3G的空間,《蜘蛛俠》放到3G到9G的空間等等。然後呢?我們還的找個地方記住這些電影的名稱和電影存儲起始位置和長度這些信息,否則我們就找不到我們想要的電影了。

再比如我們不想要《空中客車》這部電影了,那麼這部分空間就可以存儲其它電影了。比如我們有一部《異形》,大小是1.5G,這時顯然沒法放到《空中客車》原來的位置,因為這個空間只有1G,因此之後放到《蜘蛛俠》後面。好嘛,簡直難以想象,經過幾百次添加刪除後磁盤會變成什麼樣子。而且我們還得用個本子也好,或者什麼也好記錄每個電影的名稱、位置還有磁盤的可用空間。

而如果有了文件系統之後(格式化後)呢?我們只需要建立文件夾(當然也可以不創建),讓文件拷貝到裡面就行了。我們根本不用考慮磁盤上的數據是怎麼管理的。

方便數據的組織和查找

先感受一下在Linux操作系統下文件的組織形式,通常是一個樹狀的結構。也就是磁盤被格式化後通常用戶會創建若干個文件夾,然後在文件夾中再創建文件夾或者存儲文件。

看完這篇文章沒人敢說你不懂文件系統

圖3 文件目錄樹

比如我們用一個磁盤來專門存儲數據,格式化之後我們創建若干個文件夾,分別是“電影”、“音樂”、“照片”和“電子書”等。然後在電子書裡面有分別創建“Linux”、“編程語言”、“歷史”和“小說”等等。這樣我們將所有數據組織成非常有條理的樹形結構。為了形象,我們畫成如圖4的樣子,可以看出通過文件系統使我們對數據有了很清晰的規劃,也很方便後續查找我們想要的數據。

看完這篇文章沒人敢說你不懂文件系統

圖4 目錄樹示意圖

提高磁盤空間的使用率

如前文所說,如果沒有文件系統,不需要的文件的空間再利用就會非常麻煩。有可能這塊空間的大小是1G或者1M,而新數據的大小是2G。那這個空間就無法使用。頻繁的釋放和使用空間之後,可能會留下很多小空間(空洞),而無法被使用,這樣就造成磁盤空間的極大浪費。

使用文件系統之後,文件系統會將磁盤空間切割為比較小的存儲單元(例如4K或者8K等)進行管理。如果出現釋放空間產生空洞的情況,文件系統內部會進行空洞和數據的交換,從而生成比較大塊的可用磁盤空間。這樣從整體來說就極大地提升了磁盤的整理使用率。

Linux的文件系統

目前在Linux操作系統中支持很多種文件系統,包括Ext2、Ext4、Btrfs和XFS等,多達幾十個文件系統。雖然支持的文件系統種類很多,但從用戶層面使用方式無任何差別,用戶並不感知其中的差異。對於普通用來說,數據都是組織成上文所述的樹狀結構。那麼這種方式是如何實現的呢?

看完這篇文章沒人敢說你不懂文件系統

圖5 Linux的虛擬文件系統

Linux操作系統對各種文件系統的支持是通過名為VFS的組件實現的,也就是虛擬文件系統(Virtual File System)。如圖5所示,VFS作為一個抽象層,為用戶提供統一的接口,屏蔽了其它具體文件系統(例如Ext4和Btrfs等)的實現。VFS為用戶提供了open、close、read和write等接口。

說了半天,那麼文件系統到底是怎麼管理磁盤,將磁盤空間轉換為我們看到的文件夾和文件的呢?其具體方法就是把磁盤劃分為一個個的小塊,就像切豆腐一樣。然後把磁盤劃分為不同的功能區,比如元數據區和數據區。而元數據區其實實現對磁盤空間的管理,就好像前文說的賬本,裡面記錄著哪些磁盤空間被使用,哪些磁盤空間已經被佔用

看完這篇文章沒人敢說你不懂文件系統

圖6 Ext4磁盤佈局圖

經過文件系統的管理之後,文件內的數據就被映射到磁盤上的一塊塊的空間。而文件和磁盤空間的關係由文件系統管理,不需要用戶操心。如圖7所示,某個文件被映射到磁盤中的3個不同的空間。

看完這篇文章沒人敢說你不懂文件系統

圖7 文件映射與磁盤空間映射

當然,實際的映射關係比可能比上圖要複雜得多,但基本原理是這樣。用戶關心的只是文件名稱和路徑,而其存儲的數據則有文件系統管理。當然,每個文件系統對數據的組織形式是不同的,以Ext2文件系統為例,其形式圖8所示,其通過一些磁盤指針的方式記錄了文件數據的存放位置,這樣當用戶讀取數據時,文件系統根據數據的偏移地址和其記錄的對應關係就可以找到數據具體存儲在磁盤的什麼位置,並進行讀取。

看完這篇文章沒人敢說你不懂文件系統

圖8 Ext2間接塊方式

好了,本文就介紹到這,具體文件系統的實現細節請參考號的歷史文章。有任何問題請在下面留言。

相關推薦

推薦中...