Linux文件系統的設計
總論:
linux的文件系統設計非常優秀,總的來講有兩大部分,第一部分就是樹形的組織結構,第二部分就是vfs,樹形的組織結構組織了文件系統的表象,用戶很方便的使用,而vfs是文件系統的實現機理,它處於內核態,不但實現了樹形結構的mount機制,而且還提供了一個統一的接口用來訪問設備。
一、Linux文件系統概述
1、Linux文件系統組織
Linux中使用樹來組織文件系統。整個文件系統構成了一顆樹,這棵樹以/為根。整個系統有且只有這一顆文件樹。這棵樹描述了文件系統的拓撲結構,沒有任何文件系統的類型信息。
2、mount機制
linux使用mount機制擴展文件系統,使不同類型的文件系統可以掛載在系統的文件樹的任何位置。mount機制使文件樹有了類型屬性,支持了不同類型的文件系統的掛載。
如圖所示。
可以看到如果不考慮掛載點,整個文件系統就是一棵樹,如果考慮了掛載點,這棵樹原來是嫁接而成的,可以包含各種不同種類的文件系統。正如橋片擴展了總線一樣,掛載點擴展了文件樹,和擴展總線不同的是,任意目錄都可以是掛載點,但是不是任意芯片都是可以作為橋的。(網橋/交換機擴展以太網也是一樣的道理,和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的不同實現。如下圖所示:
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中掛載任意文件系統到樹根,這是因為內核和文件系統是分離的概念,內核啟動並不依賴任何文件系統。
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow
Linux文件系統的設計