虛擬檔案系統

虛擬檔案系統

虛擬檔案系統(VFS)是由Sun microsystems公司在定義網路檔案系統(NFS)時創造的。它是一種用於網路環境的分散式檔案系統,是允許和作業系統使用不同的檔案系統實現的接口。虛擬檔案系統(VFS)是物理檔案系統與服務之間的一個接口層,它對Linux的每個檔案系統的所有細節進行抽象,使得不同的檔案系統在Linux核心以及系統中運行的其他進程看來,都是相同的。嚴格說來,VFS並不是一種實際的檔案系統。它只存在於記憶體中,不存在於任何外存空間。VFS在系統啟動時建立,在系統關閉時消亡。

基本介紹

  • 中文名:虛擬檔案系統
  • 外文名: Virtual File Systems
  • 領域:計算機作業系統
簡介,Linux虛擬檔案系統簡介,虛擬,Inode,操作已打開的檔案,功能,超級塊,其它相關,The VFS Inode,註冊檔案系統,安裝檔案系統,卸載檔案系統,

簡介

虛擬檔案系統 Virtual File Systems(VFS)
Linux 是近年來發展起來的一種新型的作業系統,其最重要的特徵之一就是支持多種檔案系統,使其更加靈活,從而與許多其它的作業系統共存。Linux支持ext,ext2,xia,minix,umsdos,msdes,fat32 ,ntfs,proc,stub,ncp,hpfs,affs 以及 ufs 等多種檔案系統。為了實現這一目的,Linux 對所有的檔案系統採用統一的檔案界面,用戶通過檔案的操作界面來實現對不同檔案系統的操作。對於用戶來說,我們不要去關心不同檔案系統的具體操作過程,而只是對一個虛擬的檔案操作界面來進行操作,這個操作界面就是 Linux 的虛擬檔案系統(VFS ) 。形象地說,Linux 的核心好象一個 PC 機的母板,VFS 就是上面的一個插槽,具體的檔案系統就是一塊塊的接 121 卡。因此,每一個檔案系統之間互不干擾,而只是調用相應的程式來實現其功能。在 Linux 的核心檔案中,VFS 和具體的檔案系統程式都放在 Linux\FS 中,其中每一種檔案系統對應一個子目錄,另外還有一些共用的 VFS 程式。在具體的實現上,每個檔案系統都有自己的檔案操作數據結構file—operations。所以,VFS 作為 ILinux核心中的一個軟體層,用於給用戶空間的程式提供檔案系統接口,同時也提供了核心中的一個抽象功能,允許不同的檔案系統很好地共存。VFS 使 Linux 同時安裝、支持許多不同類型的檔案系統成為可能。VFS 擁有關於各種特殊檔案系統的公共界面,如超級塊、inode、檔案操作函式入口等。實際檔案系統的細節,統一由 VFS 的公共界面來索引,它們對系統核心和用戶進程來說是透明的。

Linux虛擬檔案系統簡介

虛擬

"虛擬"二字主要有兩層含義:
1, 在同一個目錄結構中, 可以掛載著若干種不同的檔案系統. VFS隱藏了它們的實現細節, 為使用者提供統一的接口;
2, 目錄結構本身並不是絕對的, 每個進程可能會看到不一樣的目錄結構. 目錄結構是由"地址空間(namespace)"來描述的, 不同的進程可能擁有不同的namespace, 不同的namespace可能有著不同的目錄結構(因為它們可能掛載了不同的檔案系統)。

Inode

含義: 索引節點, 對應設備上存放的一個檔案。
創建: 1)在超級塊被載入時, 作為根的inode一併被載入; 2)通過mknod調用創新新的索引節點; 3)在尋找檔案路徑的過程中, 從設備中讀取, 並初始化(跟super_block一樣, inode結構中一部分信息是保存在設備中的, 一部分則是在內在中初始化的)。
函式: i_op, 索引節點函式集, 主要包含對子inode的創建, 刪除等操作. f_op, 檔案函式集, 主要包含對本inode的讀寫等操作. 在inode被創建後, 1)如果是特殊檔案, 則根據對應檔案的類型(包括塊設備, 字元設備, fifo, 等等)賦予特定的函式集(並不直接與設備和檔案系統類型相關); 2)否則, 對應的檔案系統類型會提供相應的函式集, 並且目錄和檔案函式集很可能不同。

操作已打開的檔案

VFS的使用者是進程(用戶訪問檔案系統總是需要啟動進程). 描述進程的task_struct結構中files指針指向了一個files_struct結構, 後者描述了進程已打開的檔案集合。
files_struct結構維護了一個已打開檔案所對應的file結構的指針數組, 數組下標被用作用戶程式操作已打開檔案的句柄(通常稱作fd). files_struct還維護著已使用的fd點陣圖, 以便在需要打開檔案時, 為其分配一個未使用的fd。
詳細見參考文獻。

功能

VFS的功能包括:紀錄可用的檔案系統的類型;將設備同對應的檔案系統聯繫起來;處理一些面向檔案的通用操作;涉及到針對檔案系統的操作時,VFS把它們影射到與控制檔案、目錄以及inode相關的物理檔案系統。
當某個進程發布了一個面向檔案的系統調用時,核心將調用VFS中相應的函式,這個函式處理一些與物理結構無關的操作,並且把它重定向為真實檔案系統中相應的函式調用,後者則用來處理那些與物理結構相關的操作。
VFS與實際檔案系統的封裝關係如下圖所示:
VFS
MINIX FS
VFSinode快取
VFS目錄快取
EXT FS
EXT2 FS
MSDS FS
緩衝存儲
圖4 VFS與實際檔案系統的封裝關係
VFS的原始碼集中在/usr/src/linux/fs目錄下,關於它的數據結構的描述在檔案/usr/src/lunux/include/linux/fs.h中。

超級塊

VFS使用了與EXT2檔案系統類似的方式:超級塊和索引節點inode描述檔案系統。
VFS超級塊是各種邏輯檔案系統在安裝時建立的,並在這些檔案系統卸載時自動刪除,它只存在於記憶體中。VFS中保存了系統中掛接的檔案系統的鍊表以及這些檔案系統對應的VFS超級塊。系統啟動後所有被初始化的檔案系統都要向VFS登記。每個已安裝的檔案系統由一個VFS 超塊表示,它包含如下信息:
⑴Device:表示檔案系統所在塊設備的設備標誌符。例如系統中第一個IDE 硬碟的設備標誌符為0x301。
⑵Inode pointers:這個mounted inode指針指向檔案系統中第一個inode。而covered inode指針指向此檔案系統安裝目錄的inode。根檔案系統的VFS超塊不包含covered指針
⑶Blocksize:以位元組記數的檔案系統塊大小,如1024 位元組。
⑷Superblock operations:指向此檔案系統一組超塊操縱例程的指針。這些例程被VFS 用來讀寫inode和超塊。
⑸File System type:這是一個指向已安裝檔案系統的file_system_type結構的指針
⑹File System specific:指向檔案系統所需信息的指針。

其它相關

The VFS Inode

和EXT2 檔案系統相同,VFS 中的每個檔案、目錄等都用且只用一個VFS inode表示。每個VFS inode 中的信息通過檔案系統相關例程從底層檔案系統中得到。VFS inode僅存在於核心記憶體並且保存只要對系統有用,它們就會被保存在在VFS inode cache中。每個VFS inode包含下列域:
⑴device:包含此檔案或此VFS inode 代表的任何東西的設備的設備標誌符。
⑵inode number:檔案系統中唯一的inode號。在虛擬檔案系統中device和inode號的組合是唯一的。
⑶mode:和EXT2 中的相同, 表示此VFS inode 的存取許可權。
⑷user ids:所有者的標誌符。
⑸times:VFS inode 創建、修改和寫入時間。
⑹block size:以位元組計算的檔案塊大小,如1024 位元組。
⑺inode operations:指向一組例程地址的指針。這些例程和檔案系統相關且對此inode 執行操作,如截斷此inode表示的檔案。
⑻count:使用此VFS inode 的系統部件數。一個count為0 的inode可以被自由的丟棄或重新使用。
⑼lock: 用來對某個VFS inode加鎖,如用於讀取檔案系統時。
⑽dirty:表示這個VFS inode是否已經被寫過,如果是則底層檔案系統需要更新。

註冊檔案系統

用戶可以通過兩種途徑向核心註冊檔案系統:一是在編譯核心時確定可支持的檔案系統類型,並在系統初始化時通過內嵌的函式調用在VFS中進行註冊;二是把某個檔案系統當作一個模組,利用模組的載入和卸載特徵向註冊表登記類型或從註冊表註銷。
檔案系統類型的註冊函式為:int register filesystem (struct file_system_type *fs)
每個檔案系統都有一個初始化例程,檔案系統通過它在VFS中進行註冊,即填寫file_system_type數據結構。該結構包含了檔案系統的名稱及一個指向對應VFS超級塊讀取例程的地址。所有已註冊檔案系統的file_system_type結構形成了一個註冊鍊表,如下圖所示:
file_system_type file_system_type file_system_type
*read_super()
name
owner
kem_mnt
next
*read_super()
name
owner
kem_mnt
next
*read_super()
name
owner
kem_mnt
next
圖5
file_system_type的數據結構在include/linux/fs.h中定義如下:
struct file_system_type {
const char *name;
//檔案系統的類型名,如EXT2。這些名稱出現在Linux中的/proc/filesystems中且必須是唯一的。
int fs_flags;
//fs_flags的取值可能有很多種。例如,檔案系統標識FS_REQUIRES_DEV表示檔案系統只能載入在一個塊設備上;FS_SINGLE表示檔案系統只能有一個超級塊;FS_NOMOUNT表示檔案系統不能安裝在用戶空間上。
struct super_block *(*read_super) (struct super_block *, void *, int);
//read_super所指的函式用於讀出該檔案系統在外存的超級塊。
struct module *owner;
//如果實現該檔案系統的程式段是由module動態載入的,則指向該module;如果實現該檔案系統的程式段是在核心編譯時生成的,則owner = NULL。
struct vfsmount * kem_mnt;
//只為標識為FS_SINGLE的檔案系統使用(For kernel mount)
struct file_system_type * next;
//檔案系統類型鍊表的後續指針
};

安裝檔案系統

檔案系統註冊後便在設備上按一定格式建立檔案系統,但是此時設備上的檔案和節點都還不是可訪問的,還不能按照一定的路徑名訪問其中特定的節點或檔案。只有把它安裝到檔案系統中某個節點上,才能使設備上的檔案和節點可被訪問。因此註冊了wej系統只代表Linux系統支持這種檔案系統的套用,要真正使用該檔案系統還必須安裝它。
檔案系統的安裝必須調用mount命令,把其他子系統安裝到已經存在於檔案系統的空閒節點上。該命令使用系統的mount()調用:asmlinkage ling sys_mount(char * dev_name, char * dir_name, char * type, unsigned long flags, void * data)
其中dev_name是要安裝的檔案系統的磁碟分區的路徑名,如/dev/hda5。參數dir_name是要安裝的檔案系統的目錄名;type指定磁碟分區上的檔案系統類型;flags指定該檔案系統如何被安裝;data是指向任意的信息結構的指針,其內容依賴於被安裝的特定檔案系統類型。
使用mount命令後,VFS通過file_systems在file_system_type鍊表中根據指定的檔案系統名稱搜尋檔案系統類型信息。而函式get_fs_type()根據具體檔案系統的類型名在核心中找到相應的file_system_type結構:
struct file_system_type *get_fs_type(const char *name)
{
struct file_system_type *fs;
read_lock(&file_systems_lock);
fs = *(find_filesystem(name));
if (!fs && (request_module(name) == 0)) {
read_lock(&file_systems_lock);
fs = *(find_filesystem(name));
if (fs && !try_inc_mod_count(fs->owner))
fs = NULL;
read_unlock(&file_systems_lock);
}
return fs;
}
其中函式find_filesystem(name)掃描file_system對列,找到所需檔案系統類型的數據結構。

卸載檔案系統

超級用戶卸載檔案系統使用umount命令。
卸載過程必須檢查檔案系統及其超級塊的狀態。如果檔案系統正被其他進程使用該檔案系統就不能被卸載。如果檔案系統的檔案或目錄正在使用,則VFS索引節點快取中可能包含相應的VFS索引節點。檢查代碼在該快取中,根據檔案系統所在的設備標識符查找是否有來自該檔案系統的VFS索引節點。如果有且使用計數大於0則說明該檔案系統正在使用,不能被刪除。如果檔案系統的超級塊為“髒”,即被修改,則應先將它寫回到磁碟上。
檔案系統允許在被刪除後,對應的VFS超級塊被釋放,vfsmount數據結構從vfsmntlist鍊表中斷開並被釋放。

相關詞條

熱門詞條

聯絡我們