歡迎您光臨本站 註冊首頁

從VFS認識linux文件系統

←手機掃碼閱讀     火星人 @ 2014-03-23 , reply:0

VFS及LINUX中文件系統的組織
關於VFS,我以前從未聽說過,所以拿到題目之後免不了要花些時間查了很多的資料。
什麼是VFS?
VFS(Virtual File System )稱「虛擬文件系統」 ,是LINUX文件系統的一個重要的組成部分。它不是一個真正的文件系統,實際上它是一種軟體機制,也許稱它為 Linux 的文件系統管理者更確切點。

VFS的主要內容
超級塊(super_block)
對具體文件系統的超級塊是文件系統中最重要的數據結構,它用來描述整個文件系統信息(組織結構和管理信息)。不涉及文件系統的內容 。VFS超級塊是各種具體文件系統在安裝時建立的,並在這些文件系統卸載時自動刪除。VFS超級塊實際上應該說成是某個具體文件系統的VFS超級塊。超級塊對象由super_block結構組成。
索引節點對象(inode,即I節點)
文件系統處理文件所需的信息。索引節點對文件是唯一的。具體文件系統的索引節點存儲在磁碟上,使用的時候,必須調入內存,填寫VFS的索引節點。所以VFS的索引節點是動態節點。
目錄項(dentry)
每個文件除了有一個索引節點結構外,還有目錄項dentry結構。 dentry結構代表的是邏輯意義上的文件,在磁碟上沒有對應的映象。而inode結構代表的是物理意義上的文件,對於一個具體的文件系統,在磁碟上有對應的映象。
一個dentry結構必有一個inode結構,而一個inode可能對應多個dentry結構。
由於從磁碟讀入一個文件並構造相應的目錄項需要花費大量的時間,而在完成對目錄項的操作后,可能後面還會用到,所以在內存中要保留它。
VFS有什麼好處?
既然寫這個,自然要關注一下VFS的特別之處,那麼VFS到底都有些什麼特別的功能呢?
支持N多種雜七雜八的文件系統
用慣了WINDOWS的人都知道在格式化文件系統的時候只有少數幾種種選擇:FAT和NTFS等等。但是LINUX卻可以支持諸如EXT2,Minix,FAT,VFAT,NFS,NTFS…等等10多個不同的文件系統。正是VFS,為LINUX實現了這一強大功能。
概括來說,實現這種支持是通過文件系統的「註冊」來完成的。經由註冊的文件系統,VFS會給系統內核提供一個調用該文件系統函數的介面。
值得注意的是,Linux並非通過設備標識訪問某個文件系統(像DOS那樣),而是捆綁於一個樹狀目錄上,因此,mount一個文件系統不僅包含了文件及數據,還包含了文件系統本身的樹形結構,目錄,訪問許可權等等。這裡邊的實現其實是很複雜的,鑒於作者的水準,本文將這些過於複雜的東西略去,只討論一些易於理解的東西。(讀者如果有意了解,請搜關鍵字「VFS目錄樹」 )
下面簡單說說這種功能的實現。
在 Linux 源代碼中,每種實際的文件系統用以下的數據結構表示:
  struct file_system_type {
  const char *name; //文件系統名稱
  int fs_flags; //標示位
  struct super_block *(*read_super) (struct super_block *, void *, int); //read_super是文件所涉及的文件操作針對內存中的數據對象的指針
//超級塊指針
  struct module *owner; //實例所有者指針
  struct file_system_type * next; //鏈表同級指針
  struct list_head fs_supers;
  };
每註冊一個文件系統也就要在機器里初始化一個這樣的數據結構,並形成一個鏈表,內核中用一個名為 file_systems 的全局變數來指向該鏈表的表頭。
整個註冊過程比較複雜,概括來說大概是如下幾步:
1, 新建VFS目錄樹 init_mount_tree()
(這裡邊包含有若干步驟,此處不贅)
2, 通過sys_mkdir函數將文件系統作為結點添加到VFS目錄樹中

當用戶調用一個文件時,他不需要因為文件屬於不同的文件系統而按照不同的方式讀取。VFS本身抽象了不同文件系統共同部分,對用戶屏蔽了具體的操作,使得用戶不用再去關心文件所屬的文件系統的問題,實現了各個文件系統的良好兼容。當一個最新推出的文件系統普遍被採用時,LINUX藉助VFS的強大功能,可以毫不費力的實現新文件系統在本地的組織運行,同時能不干擾其他已經裝配在本地的其他文件系統,可以說以VFS組織文件系統是非常具有可擴展性,並具有優良的發展前景。

[火星人 ] 從VFS認識linux文件系統已經有331次圍觀

http://coctec.com/docs/linux/show-post-126886.html