天天看點

Linux檔案系統的設計

總論:

linux的檔案系統設計非常優秀,總的來講有兩大部分,第一部分就是樹形的組織結構,第二部分就是vfs,樹形的組織結構組織了檔案系統的表象,使用者很友善的使用,而vfs是檔案系統的實作機理,它處于核心态,不但實作了樹形結構的mount機制,而且還提供了一個統一的接口用來通路裝置。

一、Linux檔案系統概述 

1、Linux檔案系統組織 

Linux中使用樹來組織檔案系統。整個檔案系統構成了一顆樹,這棵樹以/為根。整個系統有且隻有這一顆檔案樹。這棵樹描述了檔案系統的拓撲結構,沒有任何檔案系統的類型資訊。

2、mount機制 

linux使用mount機制擴充檔案系統,使不同類型的檔案系統可以挂載在系統的檔案樹的任何位置。mount機制使檔案樹有了類型屬性,支援了不同類型的檔案系統的挂載。

如圖所示。

Linux檔案系統的設計

可以看到如果不考慮挂載點,整個檔案系統就是一棵樹,如果考慮了挂載點,這棵樹原來是嫁接而成的,可以包含各種不同種類的檔案系統。正如橋片擴充了總線一樣,挂載點擴充了檔案樹,和擴充總線不同的是,任意目錄都可以是挂載點,但是不是任意晶片都是可以作為橋的。(網橋/交換機擴充以太網也是一樣的道理,和mount機制更加類似一些,因為你隻需要插入一個多端口網卡就可以作為一個網橋了。)

3、mount機制的好處 

mount可以屏蔽檔案系統的類型,所有類型的檔案系統共享一棵樹,但是實作卻可以不相同。使用者程序可以使用相同的系統調用接口通路所有的檔案系統,而不必在意通路的檔案是什麼類型的。mount機制使一棵檔案樹得以多樣化,然而又可以向使用者屏蔽這種多樣化。這種多樣化是通過vfs實作的。

4、單棵樹組織+mount擴充 

Linux的檔案系統和磁盤并不綁定,檔案系統就是一棵樹,是一個虛拟的概念,沒有媒體,沒有容量,沒有讀寫規則,隻有在挂載(mount)發生的時候,也就是具體的檔案系統挂載的時候,某個挂載點才和媒體建立聯系,然而此時對于檔案系統來講仍然沒有容量的概念,容量僅僅是挂載于此目錄的磁盤裝置的屬性,如果磁盤空間滿了,仍然可以通過在此磁盤的一個目錄上mount一個新的檔案系統來解決,而新的檔案系統在一塊新的磁盤上。

5、和Windows檔案系統的對比 

Windows顯式的分離了各種檔案系統,雖然Windows在操作接口上也吸取了Unix中“一切皆檔案”的思想。在接口級别,windows也使用相同的API來通路各類檔案,比如ReadFile,WriteFile等,然而在操作級别,windows卻沒有實作一緻性,在操作級别,windows的檔案系統主要指以磁盤為媒體的檔案系統,是以windows沒有必要用一棵樹包含所有的檔案,而是區分成了各個盤符,然而這種方式有個弊端,那就是不易擴充,因為單個盤符限制了容量,磁盤直接和檔案系統綁定。是以,Windows不以單棵樹樹來組織檔案系統,windows很難用mount來擴充檔案系統。

二、VFS概述 

1、VFS 

虛拟檔案系統或者虛拟檔案插口,叫做插口更合适,也是官方的叫法,vfs向上和使用者程序檔案通路系統調用接口,如open,read,write等,向下和具體不同檔案系統的實作接口,如read,write的不同實作。如下圖所示:

Linux檔案系統的設計

2、VFS的重要性 

VFS屏蔽了具體檔案的實作細節,向上提供統一的操作接口。通過VFS可以實作任意的檔案系統,這些檔案系統通過檔案通路系統調用都可以通路。在作業系統核心中,vfs是對離使用者态最近的一層,因為它的存在,linux的使用才變得友善。實際上,正是vfs實作了樹形的檔案系統組織,然而vfs的作用還不止這些,裝置的檔案抽象也是通過vfs來實作的。

3、VFS舉例 

3.1、procfs

3.2、sysfs

3.3、cpusetfs

3.4、ntfs

3.5、extX

3.6、任意你想實作的。

需要做什麼呢?隻需要在一大堆switch函數例程中實作你的邏輯即可,就是說實作file_operations函數集合即可。注意,在linux中,檔案和存儲沒有必然關系,實際上沒有任何關系,也就是說linux中的檔案有的不需要被存儲,比如proc目錄中的檔案,隻有在你read它的時候,資料才從核心出來,這個資料是核心邏輯提供的,而是可能實時變化,linux根本沒有必要在另一個地方再存儲它。

4、一個重要結論 

由于linux的樹形檔案系統是完全抽象的,是以它不和任何媒體進行綁定,僅存在于核心當中,核心隻要起來,這個虛拟的樹就存在了,隻是此時隻有樹根,然而linux此時卻可以挂載任意類型的檔案系統到這個樹根,這樣就可以實作很友善的定制,linux可以在initrd中挂載任意檔案系統到樹根,這是因為核心和檔案系統是分離的概念,核心啟動并不依賴任何檔案系統。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1271078

繼續閱讀