|
相信搞軟件開發(fā)的同學(xué)對文件系統(tǒng)都有一定的了解,即使不是做軟件開發(fā)工作的同學(xué)對文件系統(tǒng)也有感性的認(rèn)識。其實回憶一下,無論是Linux操作系統(tǒng)也好,還是Windows或者Mac也好,在我們普通用戶的視角看到的其實就是一個個文件。比如電影是用視頻文件存儲,也就是表示某種視頻格式的文件;音樂是用音頻文件存儲的,像mp3、wave和midi等等格式;圖像是用圖片文件格式存儲的,像png、jpg和bmp等等。雖然文件中的內(nèi)容和存儲格式不同,但其原理都是一樣的,都依賴于文件系統(tǒng)。 我們知道文件系統(tǒng)是位于磁盤之上的,但具體什么原理可能不清楚。也沒考慮過為什么不直接使用磁盤。我們先看一下磁盤的結(jié)構(gòu),磁盤內(nèi)部如圖1所示,其內(nèi)部有若干個盤片,數(shù)據(jù)存儲在磁盤的盤片上。而盤片又劃分為磁道和扇區(qū),具體細(xì)節(jié)本文就不深入分析了。 圖1 磁盤內(nèi)部結(jié)構(gòu) 如果我們從磁盤上讀寫數(shù)據(jù),從感官上應(yīng)該是比較復(fù)雜的。首先需要知道在哪個盤片上,然后需要知道在盤片的什么位置,然后才能讀取或者寫入數(shù)據(jù)。實際上不用那么復(fù)雜,磁盤的控制器已經(jīng)替我們做了很多事情,它對這些內(nèi)部的結(jié)構(gòu)進行了統(tǒng)一管理,呈現(xiàn)給我們的只是一個線性的地址。比如一個1T的硬盤,其呈現(xiàn)給我們的就是從0字節(jié)開始,以1字節(jié)遞增,直到1TB的地址空間。當(dāng)然,機械磁盤可進行讀寫的最小粒度為1個扇區(qū)(512字節(jié))。 圖2 磁盤存儲空間抽象 既然可以這么方便的訪問磁盤空間了,那為什么還要文件系統(tǒng)呢? 其實最主要的原因有3方面,也即:
便于磁盤空間管理我們不考慮存儲操作系統(tǒng)的磁盤,即使是存放普通數(shù)據(jù)(例如放電影視頻文件)的磁盤,如果沒有文件系統(tǒng)會是什么樣子。 比如我們把《空中客車》放到0到1GB的空間,《蝙蝠俠》放到1G到3G的空間,《蜘蛛俠》放到3G到9G的空間等等。然后呢?我們還的找個地方記住這些電影的名稱和電影存儲起始位置和長度這些信息,否則我們就找不到我們想要的電影了。 再比如我們不想要《空中客車》這部電影了,那么這部分空間就可以存儲其它電影了。比如我們有一部《異形》,大小是1.5G,這時顯然沒法放到《空中客車》原來的位置,因為這個空間只有1G,因此之后放到《蜘蛛俠》后面。好嘛,簡直難以想象,經(jīng)過幾百次添加刪除后磁盤會變成什么樣子。而且我們還得用個本子也好,或者什么也好記錄每個電影的名稱、位置還有磁盤的可用空間。 而如果有了文件系統(tǒng)之后(格式化后)呢?我們只需要建立文件夾(當(dāng)然也可以不創(chuàng)建),讓文件拷貝到里面就行了。我們根本不用考慮磁盤上的數(shù)據(jù)是怎么管理的。 方便數(shù)據(jù)的組織和查找先感受一下在Linux操作系統(tǒng)下文件的組織形式,通常是一個樹狀的結(jié)構(gòu)。也就是磁盤被格式化后通常用戶會創(chuàng)建若干個文件夾,然后在文件夾中再創(chuàng)建文件夾或者存儲文件。 圖3 文件目錄樹 比如我們用一個磁盤來專門存儲數(shù)據(jù),格式化之后我們創(chuàng)建若干個文件夾,分別是“電影”、“音樂”、“照片”和“電子書”等。然后在電子書里面有分別創(chuàng)建“Linux”、“編程語言”、“歷史”和“小說”等等。這樣我們將所有數(shù)據(jù)組織成非常有條理的樹形結(jié)構(gòu)。為了形象,我們畫成如圖4的樣子,可以看出通過文件系統(tǒng)使我們對數(shù)據(jù)有了很清晰的規(guī)劃,也很方便后續(xù)查找我們想要的數(shù)據(jù)。 圖4 目錄樹示意圖 提高磁盤空間的使用率如前文所說,如果沒有文件系統(tǒng),不需要的文件的空間再利用就會非常麻煩。有可能這塊空間的大小是1G或者1M,而新數(shù)據(jù)的大小是2G。那這個空間就無法使用。頻繁的釋放和使用空間之后,可能會留下很多小空間(空洞),而無法被使用,這樣就造成磁盤空間的極大浪費。 使用文件系統(tǒng)之后,文件系統(tǒng)會將磁盤空間切割為比較小的存儲單元(例如4K或者8K等)進行管理。如果出現(xiàn)釋放空間產(chǎn)生空洞的情況,文件系統(tǒng)內(nèi)部會進行空洞和數(shù)據(jù)的交換,從而生成比較大塊的可用磁盤空間。這樣從整體來說就極大地提升了磁盤的整理使用率。 Linux的文件系統(tǒng)目前在Linux操作系統(tǒng)中支持很多種文件系統(tǒng),包括Ext2、Ext4、Btrfs和XFS等,多達(dá)幾十個文件系統(tǒng)。雖然支持的文件系統(tǒng)種類很多,但從用戶層面使用方式無任何差別,用戶并不感知其中的差異。對于普通用來說,數(shù)據(jù)都是組織成上文所述的樹狀結(jié)構(gòu)。那么這種方式是如何實現(xiàn)的呢? 圖5 Linux的虛擬文件系統(tǒng) Linux操作系統(tǒng)對各種文件系統(tǒng)的支持是通過名為VFS的組件實現(xiàn)的,也就是虛擬文件系統(tǒng)(Virtual File System)。如圖5所示,VFS作為一個抽象層,為用戶提供統(tǒng)一的接口,屏蔽了其它具體文件系統(tǒng)(例如Ext4和Btrfs等)的實現(xiàn)。VFS為用戶提供了open、close、read和write等接口。 說了半天,那么文件系統(tǒng)到底是怎么管理磁盤,將磁盤空間轉(zhuǎn)換為我們看到的文件夾和文件的呢?其具體方法就是把磁盤劃分為一個個的小塊,就像切豆腐一樣。然后把磁盤劃分為不同的功能區(qū),比如元數(shù)據(jù)區(qū)和數(shù)據(jù)區(qū)。而元數(shù)據(jù)區(qū)其實實現(xiàn)對磁盤空間的管理,就好像前文說的賬本,里面記錄著哪些磁盤空間被使用,哪些磁盤空間已經(jīng)被占用。 圖6 Ext4磁盤布局圖 經(jīng)過文件系統(tǒng)的管理之后,文件內(nèi)的數(shù)據(jù)就被映射到磁盤上的一塊塊的空間。而文件和磁盤空間的關(guān)系由文件系統(tǒng)管理,不需要用戶操心。如圖7所示,某個文件被映射到磁盤中的3個不同的空間。 圖7 文件映射與磁盤空間映射 當(dāng)然,實際的映射關(guān)系比可能比上圖要復(fù)雜得多,但基本原理是這樣。用戶關(guān)心的只是文件名稱和路徑,而其存儲的數(shù)據(jù)則有文件系統(tǒng)管理。當(dāng)然,每個文件系統(tǒng)對數(shù)據(jù)的組織形式是不同的,以Ext2文件系統(tǒng)為例,其形式圖8所示,其通過一些磁盤指針的方式記錄了文件數(shù)據(jù)的存放位置,這樣當(dāng)用戶讀取數(shù)據(jù)時,文件系統(tǒng)根據(jù)數(shù)據(jù)的偏移地址和其記錄的對應(yīng)關(guān)系就可以找到數(shù)據(jù)具體存儲在磁盤的什么位置,并進行讀取。 圖8 Ext2間接塊方式 好了,本文就介紹到這,具體文件系統(tǒng)的實現(xiàn)細(xì)節(jié)請參考號的歷史文章。有任何問題請在下面留言。 |
|
|