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文件系統 已經有333 次圍觀
本文地址: http://coctec.com/docs/linux/show-post-126886.html