一文講解虛擬文件系統(tǒng)(Virtual File System,VFS)
Linux虛擬文件系統(tǒng)
Linux包含一個(gè)通用的、強(qiáng)有力的文件處理機(jī)制,該機(jī)制利用虛擬文件系統(tǒng)(Virtual File System,VFS)來(lái)支持大量的文件管理系統(tǒng)和文件結(jié)構(gòu)。
VFS向用戶進(jìn)程提供了一個(gè)簡(jiǎn)單的,統(tǒng)一的文件系統(tǒng)接口。
VFS定義了一個(gè)能代表任何可想到的文件系統(tǒng)的通用特征和行為的通用文件模型。
VFS認(rèn)為文件是計(jì)算機(jī)大容量存儲(chǔ)器上的對(duì)象。這些計(jì)算機(jī)大容量存儲(chǔ)器具有共同的特征,這與目標(biāo)文件系統(tǒng)或底層的處理器硬件無(wú)關(guān)。
文件有一個(gè)符號(hào)名,以便在一個(gè)文件系統(tǒng)的特定目錄下能唯一地標(biāo)識(shí)該文件。
同時(shí)文件有一個(gè)所有者、對(duì)未授權(quán)的訪問(wèn)或修改的保護(hù)和其他一系列屬性。
文件可以被創(chuàng)建、從中讀、向它寫或刪除。
對(duì)于任何特定文件系統(tǒng),需要一個(gè)映射模塊來(lái)轉(zhuǎn)換實(shí)際文件系統(tǒng)的特征到虛擬文件系統(tǒng)所期望的特征。
圖12.17展示了Linux文件系統(tǒng)策略的關(guān)鍵組成成分。
用戶進(jìn)程通過(guò)使用VFS文件方案來(lái)發(fā)起文件系統(tǒng)調(diào)用。
VFS通過(guò)特定文件系統(tǒng)的一個(gè)映射函數(shù)轉(zhuǎn)換該系統(tǒng)調(diào)用到內(nèi)部的一個(gè)特定文件系統(tǒng)的功能調(diào)用(例如IBM的JFS)。
在很多情況下,映射函數(shù)僅僅是一個(gè)方案的文件系統(tǒng)功能調(diào)用到另一個(gè)方案的文件系統(tǒng)功能調(diào)用的映射。
在某些情況下,映射函數(shù)會(huì)比較復(fù)雜。例如,一些文件系統(tǒng)使用存儲(chǔ)目錄樹中每個(gè)文件位置的文件分配表。在這些文件系統(tǒng)中,目錄并不是文件。這些文件系統(tǒng)的映射函數(shù)必要時(shí)必須能動(dòng)態(tài)創(chuàng)建與目錄相對(duì)應(yīng)的文件。在任何情況下,原來(lái)用戶的文件系統(tǒng)調(diào)用必須轉(zhuǎn)換成目標(biāo)文件系統(tǒng)的調(diào)用。這樣就調(diào)用了目標(biāo)文件系統(tǒng)的相應(yīng)功能去完成在文件或目錄上的相應(yīng)請(qǐng)求,該操作的結(jié)果以類似的方式返回給用戶進(jìn)程。

VFS在 Linux內(nèi)核中所起的作用如圖12.18所示。當(dāng)進(jìn)程發(fā)起一個(gè)面向文件的系統(tǒng)調(diào)用時(shí),內(nèi)核調(diào)用VFS 中的一個(gè)函數(shù)。該函數(shù)處理完與具體文件系統(tǒng)無(wú)關(guān)的操作后,調(diào)用目標(biāo)文件系統(tǒng)中的相應(yīng)函數(shù)。這個(gè)調(diào)用通過(guò)一個(gè)轉(zhuǎn)換VFS的調(diào)用到目標(biāo)文件系統(tǒng)調(diào)用的映射函數(shù)來(lái)實(shí)現(xiàn)。VFS獨(dú)立于任何具體文件系統(tǒng)。因此映射函數(shù)的實(shí)現(xiàn)是文件系統(tǒng)在Linux上的實(shí)現(xiàn)的一部分。目標(biāo)文件系統(tǒng)轉(zhuǎn)換文件系統(tǒng)請(qǐng)求到面向設(shè)備的指令。

VFS是一個(gè)面向?qū)ο蟮姆桨浮R驗(yàn)閂FS不是用支持面向?qū)ο蟮恼Z(yǔ)言(如C++和 Java)來(lái)實(shí)現(xiàn)的,而是使用C語(yǔ)言來(lái)實(shí)現(xiàn)的,因此VFS的對(duì)象可以簡(jiǎn)單地實(shí)現(xiàn)為C語(yǔ)言的結(jié)構(gòu)。每一個(gè)對(duì)象包含數(shù)據(jù)和函數(shù)指針。這些函數(shù)指針指向操作這些數(shù)據(jù)的文件系統(tǒng)的實(shí)現(xiàn)函數(shù)。VFS主要的四個(gè)對(duì)象如下:
超級(jí)塊對(duì)象:代表一個(gè)特定的已掛接的文件系統(tǒng)。
索引節(jié)點(diǎn)對(duì)象:代表一個(gè)特定的文件。
目錄對(duì)象:代表一個(gè)特定的目錄項(xiàng)。
文件對(duì)象:代表一個(gè)與進(jìn)程相關(guān)的打開的文件。
這個(gè)方案是基于UNIX文件系統(tǒng)中所使用的概念的。
UNIX文件系統(tǒng)的關(guān)鍵概念如下。一個(gè)文件系統(tǒng)由層次目錄組成。目錄的概念和許多非UNIX平臺(tái)中的文件夾是一樣的,可以包含文件和其他目錄。由于一個(gè)目錄可能包含其他目錄,因此就形成了一個(gè)樹結(jié)構(gòu)。在樹結(jié)構(gòu)中從根開始的路徑由一系列目錄項(xiàng)組成,最后以目錄項(xiàng)或文件名結(jié)束。在UNIX中,目錄是用一個(gè)列出了該目錄所包含的文件名和目錄的文件來(lái)實(shí)現(xiàn)的。因此,文件操作能同時(shí)應(yīng)用于文件或目錄。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)??


超級(jí)塊對(duì)象
超級(jí)塊存儲(chǔ)了描述特定文件系統(tǒng)的信息。通常,超級(jí)塊對(duì)象對(duì)應(yīng)了位于磁盤上特定扇區(qū)的文件系統(tǒng)超級(jí)塊或文件系統(tǒng)控制塊。
超級(jí)塊對(duì)象由許多數(shù)據(jù)項(xiàng)組成,如下所示:
該文件系統(tǒng)所掛接的設(shè)備。
文件系統(tǒng)的基本塊大小。
臟標(biāo)志,表示超級(jí)塊已經(jīng)修改過(guò),但還沒(méi)有寫回到磁盤。
文件系統(tǒng)類型。
標(biāo)志,如只讀標(biāo)志。
指向文件系統(tǒng)根目錄的指針。
打開文件列表。
控制訪問(wèn)該文件系統(tǒng)的信號(hào)量。
操作超級(jí)塊的函數(shù)指針數(shù)組的指針。
上面列出的最后一項(xiàng)是一個(gè)包含在超級(jí)塊對(duì)象中的操作對(duì)象。該操作對(duì)象定義了內(nèi)核可在超級(jí)塊對(duì)象上調(diào)用的對(duì)象方法(函數(shù))。為超級(jí)塊對(duì)象定義的方法包括:
read_inode:從一個(gè)已掛接的文件系統(tǒng)上讀一個(gè)特定的索引節(jié)點(diǎn)。
wrie_inode:把給定的索引節(jié)點(diǎn)寫回到磁盤。
put_inode:釋放索引節(jié)點(diǎn)。
delete_inode:從磁盤上刪除索引節(jié)點(diǎn)。
notify _inode:當(dāng)索引節(jié)點(diǎn)的屬性發(fā)生變化時(shí)調(diào)用。
putauper:當(dāng)VFS卸載一個(gè)給定的超級(jí)塊時(shí)調(diào)用。
write_super:當(dāng)VFS決定把超級(jí)塊寫回到磁盤時(shí)調(diào)用。
statfs:獲取文件系統(tǒng)的統(tǒng)計(jì)信息。
remount_fa:當(dāng)文件系統(tǒng)重新掛接時(shí)調(diào)用。
clear_inode:釋放索引節(jié)點(diǎn),同時(shí)清除任何包含相關(guān)數(shù)據(jù)的頁(yè)。
索引節(jié)點(diǎn)對(duì)象
一個(gè)索引節(jié)點(diǎn)與一個(gè)文件相關(guān)聯(lián)。索引節(jié)點(diǎn)對(duì)象包含一個(gè)命名文件的除了該文件的文件名和該文件的實(shí)際數(shù)據(jù)內(nèi)容外的所有信息。索引節(jié)點(diǎn)中包含由所有者、組、權(quán)限、文件的訪問(wèn)時(shí)間、數(shù)據(jù)長(zhǎng)度和鏈接數(shù)等信息。
索引節(jié)點(diǎn)對(duì)象包含一個(gè)描述VFS 能在該索引節(jié)點(diǎn)上調(diào)用的文件系統(tǒng)的實(shí)現(xiàn)函數(shù)的索引節(jié)點(diǎn)操作對(duì)象。索引節(jié)點(diǎn)操作對(duì)象中定義了如下的函數(shù):
create:為與某一目錄下的目錄項(xiàng)對(duì)象相關(guān)聯(lián)的普通文件創(chuàng)建一個(gè)新的索引節(jié)點(diǎn)。
lookup:為對(duì)應(yīng)于一個(gè)文件名的索引節(jié)點(diǎn)查找一個(gè)目錄。
mkdir:為與某一目錄下的目錄項(xiàng)對(duì)象相關(guān)聯(lián)的目錄創(chuàng)建一個(gè)新的索引節(jié)點(diǎn)。
目錄項(xiàng)對(duì)象
目錄項(xiàng)(directory entry,dentry)對(duì)象是一個(gè)路徑上的一個(gè)特定的組成。該組成或者是一個(gè)目錄名或文件名。目錄對(duì)象為訪問(wèn)文件和目錄提供了方便。目錄項(xiàng)對(duì)象包括一個(gè)指向索引節(jié)點(diǎn)的指針和超級(jí)塊。它還包括一個(gè)指向父目錄的指針和指向子目錄的指針。
文件對(duì)象
文件對(duì)象代表一個(gè)進(jìn)程所打開的一個(gè)文件。文件對(duì)象在系統(tǒng)調(diào)用open()時(shí)創(chuàng)建,在系統(tǒng)調(diào)用close()時(shí)銷毀。文件對(duì)象包含如下一些數(shù)據(jù)項(xiàng):
與該文件相關(guān)聯(lián)的目錄對(duì)象。
包含該文件的文件系統(tǒng)。
文件對(duì)象使用計(jì)數(shù)。
用戶ID。
用戶組ID。
文件指針,指向下–個(gè)文件操作所要作用到的位置。
文件對(duì)象包含一個(gè)描述VFS能在該文件對(duì)象上調(diào)用的文件系統(tǒng)的實(shí)現(xiàn)函數(shù)的文件操作對(duì)象。該對(duì)象包含的函數(shù)有read、write、open、release和lock。
原文作者:rsh_whu
