虛擬檔案系統

虛擬檔案系統

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

簡介

虛擬檔案系統 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。

詳細見參考文獻。

其它相關

TheVFSInode

和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 鍊表中斷開並被釋放。

相關詞條

相關搜尋

熱門詞條

聯絡我們