Linux文件系統(二)-爲仁由己

轉載自:http://blog.csdn.net/wishfly/article/details/4268022 

儒家倡導修身齊家治國平天下,認爲天下之本在國,國之本在家,家之本在身在儒家看來,通過修身養性而實現的人內在的身心和諧,是實現人際和諧、羣己和諧,最後達至天人和諧的必要前提。只有成己才能成人,只有成己才能成物,出發點都是成己,就是自我內在的身心和諧。
    Linux文件系統的魅力在於“成己” 成人”。如果說整個Linux內核相當於一個“國”,那麼,VFS 相當於一個“家”,且是一家之長,而各種具體的文件系統相當於“己”,或者說家庭中的一個個子女。在VFS統領的這個大家庭中,各個成員之所以能相互友好共存,在於其所具有共性和個性。
   儘管我們熟知一些文件系統如Ext2/Ext3NTFSVFATJFS等,但是,要給文件系統下一個確切易懂的定義並不容易。文件系統似躲在文件背後一隻無形的手,對文件進行種種的操作(打開,讀,寫等),從這個意義上說,文件系統是文件的管理者(這是一種籠統的說法)。然文件既不存放在真空中,也不存放在空氣中,而通常存放在磁盤上(有時可能在內存,如/proc文件系統),因此說,文件系統實際上是對文件以及所存儲空間的管理機制。
l共性-抽象層
   虛擬文件系統VFS的第一個詞是“虛擬”,這就意味着,這樣的文件系統在磁盤(或其他存儲介質上)並沒有對應的存儲信息。那麼,這樣一個虛無的文件系統到底怎樣形成?儘管Linux支持多達幾十種文件系統,但這些真實的文件系統並不是一下子都掛在系統中的,他們實際上是按需被掛載的。老子說:有無相生,這個“虛”的VFS的信息都來源於“實”的文件系統,所以VFS必須承載各種文件系統的共有屬性。另外,這些實的文件系統只有安裝到系統中,VFS才予以認可,也就是說,VFS只管理掛載到系統中的實際文件系統。
   既然,VFS承擔管家的角色,那麼我們分析一下它到底要管哪些對象。Linux在文件系統的設計中,全然汲取了Unix的設計思想。Unix在文件系統的設計中抽象出四個概念:文件,目錄項,索引節點和安裝點(mount point)。
l文件系統中對象的演繹

從本質上講文件系統是特殊的數據分層存儲結構,它包含文件、目錄和相關的控制信息。文件系統的典型操作包含創建、刪除和安裝等等。在Unix中,文件系統被掛載在根文件系統的某個枝葉上,這就是安裝點,安裝點在全局的層次結構中具有獨立的命名空間。

  如何給耳熟能詳的文件給一個明確的定義?其實可以把文件看作是一個有序字節串,字節串中第一個字節是文件的頭,最後一個字節是文件的尾。爲了便於系統和用戶識別,每一個文件都被分配了一個便於理解的名字。典型的文件操作有讀、寫、創建和刪除等。

   文件系統通過目錄來組織文件。文件目錄好比一個文件夾,用來容納相關文件。因爲目錄也可以包含子目錄,所以目錄可以層層嵌套,形成文件路徑。路徑中的每一部分被稱作目錄項,例如“/home/clj/myfile”是文件路徑的一個例子,其中根目錄是/,目錄home,clj和文件myfile都是目錄項。在Unix中,目錄屬於普通文件,所以對目錄和文件可以實施同樣的操作。

   文件系統如何對文件的屬性(例如文件名,訪問控制權限、大小、擁有者、創建時間等信息)進行描述?這就是大名鼎鼎的索引節點(index Inode),爲什麼不叫文件控制塊而叫索引節點,主要是因爲有一個叫索引號的屬性可以惟一的標識文件。

   以上說明了文件,目錄項,索引節點,而更重要的是,如何描述各種文件系統的控制信息,這就是超級塊,超級塊是一種包含文件系統信息的數據結構。

通過以上的介紹,可以概括出VFS中四個主要的對象:

超級塊對象,描述已安裝文件系統。

索引節點對象,描述一個文件。

*目錄項對象,描述一個目錄項,是路徑的組成部分

*文件對象,描述由進程打開的文件。

注意,因爲VFS將目錄作爲一個文件來處理,所以不存在目錄對象。換句話說,目錄項不同於目錄,但目錄卻和文件相同.

l對象的和諧共存

  圖1顯示的一個簡單的實例,說明進程怎樣與文件進行交互。三個不同進程打開同一個文件(用inode object表示),而每個打開的文件就是一個文件對象file object(體會文件和文件對象是截然不同的),其中兩個進程使用同一個硬鏈接(說明這兩個進程打開的文件在磁盤存放在相同的位置)。這裏,每個進程都使用自己的文件對象,但只需要兩個目錄項對象dentry object,因爲目錄項對象描述的是路徑,因此與硬鏈接對應。但是,殊途同歸,這兩個目錄項對象實際上指向的是同一個索引節點對象,也就是說,索引節點對象+超級塊對象(表示文件系統)就可以確切地標識普通的磁盤文件。(這段文字左拐右繞,需靜心體會,方可理解設計之根本)

 圖1 進程與VFS對象之間的交互(摘自ULK)

  VFS除了能爲所有文件系統的實現提供一個通用接口外,還必須關注系統性能。目錄項高速緩存(dentry cache)就承擔此角色,最近最常使用的目錄項對象被放在這種緩存中,以加速把文件路徑名轉換成索引節點,也就是路徑中的最後一項(文件)對應的索引節點。

l爲仁由己
   文件,目錄項,索引節點,超級塊,實際上是抽象出來的對象,但Linux文件系統在物理磁盤佈局時把這些抽象的概念賦之實施。比如說在磁盤上,把文件(目錄也屬於文件)信息按照索引節點形式存儲在單獨的塊中;把文件系統控制信息集中存儲在磁盤的超級塊中,等等(看看Ext2/Ext3磁盤信息的存儲就瞭然)。各個具體文件系統盡力“成己”,實現了這些概念,VFS的設計目標就是要保證與這些文件系統協同工作。比如,FAT或NTFS這樣的非Unix風格的文件系統,雖然也可以在Linux上工作,但是它們必須經過封裝,提供一個符合這些概念的界面。比如,即使一個文件系統不支持索引節點,它也必須在內存中裝配索引節點結構體,就像它本身包含索引節點一樣。再比如,如果一個文件系統將目錄看作是一種特殊對象,那麼要想使用VFS,就必須將目錄重新表示爲文件形式。通常,這種轉換需要在使用現場引入一些特殊處理,使得非Unix文件系統能夠兼容Unix文件系統的使用規則並滿足VFS的需求。通過這些處理,非Unix文件系統便可以和VFS一同工作了,也就是說,各個文件系統通過“修己”,而達到與VFS以及其他文件系統的羣己和諧”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章