理解Linux虚拟文件系统VFS
當前,除了linux標準的文件系統Ext2/Ext3/Ext4外,還有很多種文件系統,比如reiserfs, xfs, Windows的vfat NTFS,網絡文件系統nfs 以及flash 文件系統jffs2, yaffs/yaffs2 ubifs。linux通過叫做VFS的中間層對這些文件系統提供了完美的支持。
對于用戶來說,這些文件系統幾乎是透明的,在大部分情況下,用戶通過libc和kernel的VFS交互,不需要關心底層文件系統的具體實現,但是有時應用程序也需要考慮底層文件系統限制(比如fat vfat不支持鏈接,比如各個文件系統支持最大文件限制不同)。
VFS存在的意義
1. 向上,對應用層提供一個標準的文件操作接口;
2. 對下,對文件系統提供一個標準的接口,以便其他操作系統的文件系統可以方便的移植到Linux上;
3. VFS內部則通過一系列高效的管理機制,比如inode cache, dentry cache 以及文件系統的預讀等技術,使得底層文件系統不需沉溺到復雜的內核操作,即可獲得高性能;
4. 此外VFS把一些復雜的操作盡量抽象到VFS內部,使得底層文件系統實現更簡單。
?
VFS架構圖
?
文件系統分類
文件系統一般可以分為以下幾類
1. 磁盤文件系統
這類文件系統數目最多,最常見:ext2/ext3/ext4文件系統;resierfs文件系統 SGI的XFS文件系統;jffs2 yaffs ubifs等flash文件系統;crasmfs squashfs等只讀文件系統;fat vfa ntfs等windows文件系統;
這類文件系統大部分都是基于塊設備的文件系統,文件系統的數據和元數據都保存在塊設備上;flash文件系統略有差別,flash文件系統是位于MTD之上的,
flash文件系統需要處理壞快,垃圾收集,磨損平衡等復雜的功能。f隨著SD/MMC卡的普及,以及flash文件系統在可擴展性,啟動速度上的先天不足。flash文件系統已經慢慢退出了嵌入式舞臺。
cramfs squashfs存在的意義在于簡單,高效,穩定(簡單的東西自然穩定),在文件系統只讀的場景,仍然會被用到。二者的共同特點就是只讀,壓縮。我們要有這樣一個概念,文件系統的復雜來源于寫數據,刪除,truncate操作,目錄添加刪除等,因此一個只讀文件系統遠比可讀寫文件系統簡單。最直觀的方法就是查看cramfs文件系統實現代碼行數,只有區區兩個小文件。
Reiserfs 提出了很多文件系統的新概念,對小文件的讀寫操作做了很大的優化,當然新概念過多,也是導致可讀性可理解性差的原因。此外由于reiserfs的作者Hans reiserfs因為殺妻罪名成立,所以reiserfs的開發也受到了影響。
XFS相當的復雜,后面我會單獨開一篇分析
2. 特別的文件系統
此類文件系統也很常用,他們不是提供常規文件的存儲和訪問,文件系統建立在內存之上,提供特殊的文件系統功能。如proc文件系統,pipe文件系統,以及tmpfs
3. 網絡文件系統
包括NFS CODA AFS等網絡文件系統
?
通用文件模型
VFS為底層文件系統提供了抽象,有兩種策略提供這種抽象。
1. 提供一個最小的通用模型,使得這個模型支持的功能是所有文件系統的最小交集
2. 提供一個盡量大的通用模型,使得這個模型包含所有文件系統功能的合集。
Linux采用第二種策略來實現VFS,因此VFS封裝了底層文件系統的所有功能和抽象,VFS負責把應用層的請求轉發給特定的文件系統。
?
在處理文件時,應用空間和內核空間使用的對象是不同的。對應用程序來說,文件描述符用來表示一個文件,這個文件描述符是打開文件時內核分配給這個文件的一個整數,注意,這個文件描述符只在本進程內有效;而對于內核來說,則使用一個inode來表示一個文件,這個inode可能對應著應用層多個進程內的多個文件描述符。
?
inode
內核中的每一個文件或者目錄都有一個inode,inode由兩個主要部分組成:
1. 描述文件狀態的元數據,文件元數據包括文件大小,權限,類型,時間;
2. 文件數據描述,則用來定義文件數據在磁盤上的存放位置。
inode僅僅是文件在內核內存中的表現形式,雖然每個文件都有inode,但是并不是每個文件在磁盤上都有對應磁盤inode,實際上有些文件系統并沒有磁盤inode,inode的生成有時要借助文件系統掃描。
?
鏈接
鏈接是unix特有的概念,又分為軟鏈接和硬鏈接
軟鏈接又稱為符號鏈接,軟鏈接文件內容指向一個文件路徑,也就是文件真實位置,軟鏈接指向的文件也可以是軟鏈接
硬鏈接是兩個文件共享同一個inode,
并不是所有的文件系統都支持符號鏈接和硬鏈接,比如fat, yaffs等文件系統并不支持符號鏈接。一般來說,沒有磁盤目錄結構的文件系統肯定不支持硬鏈接,而沒有磁盤inode的肯定不支持鏈接。
軟硬鏈接雖然為linux/unix操作管理帶來了很多便利,但是在很多軟件實現上,往往引入很大的復雜性。
?
VFS 對象類型
VFS通用模型包含以下類型對象:
1. super block
存儲文件系統相關的信息,對于磁盤文件系統來說,這個對象通常對應磁盤上的一個文件系統控制塊(磁盤super block)
2. inode
存儲一個文件相關的信息,對于磁盤文件系統,這個對象通常對應磁盤上的一個文件控制塊(磁盤inode)。每一個inode都對應一個編號,可以在文件系統內唯一標識這個文件。
3. file
file是和進程相關的,file代表一個打開的文件,file和inode之間是多對一的關系,因為多個進程可以打開同一個文件,系統會為每一次打開都創建一個file結構。
4. dentry
底層文件系統的許多操作嚴重依賴文件的inode,在進行文件操作前,我們需要根據路徑名找到文件對應的inode。我們知道文件系統是樹狀結構的,因此需要從根目錄通過目錄樹找到要操作的文件或目錄,這個遍歷過程涉及到磁盤操作,非常耗時。根據局部性原理,很有必要把這個查找過程cache起來,dentry就是為了加快目錄遍歷操作引入的數據結構。
每一個基于磁盤的文件系統,都有特定的方法用來構建目錄樹。一般來說有兩種方式:
1. 磁盤上保存著目錄項
2. 通過磁盤文件的父子關系重建目錄項
轉載于:https://www.cnblogs.com/rama/p/4362678.html
總結
以上是生活随笔為你收集整理的理解Linux虚拟文件系统VFS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R运行大数据的过程中遇到的问题:不能有负
- 下一篇: 外部开发:部件属性 外部exe启动UG