虛擬文件系統

文件系統基礎知識

1.文件類型

普通文件(regular file):包括文本文件和二進制文件。通過open或creat系統調用函數可以創建一個普通文件。

目錄文件(directory file):也稱爲目錄,一個目錄的內容即爲該目錄下的文件和其他子目錄。通過mkdir命令可創建一個目錄。通過ls -l某個目錄文件時,可以看到該文件的屬性的第一項爲d,即表示目錄文件。

設備文件(device file):Linux將硬件設備也當作文件來處理,通過mknod命令可以創建一個設備文件。通常設備文件分爲字設備文件(character special file),比如鍵盤和鼠標等;還有塊設備文件(block special file),比如硬盤和光驅等。

鏈接文件(symbolic link):也稱爲符號鏈接,通過ln命令可以創建一個符號鏈接。符號鏈接文件本身就是一個文件,這種文件的內容則是另一個文件(即源文件)的路徑。對符號鏈接進行讀寫等基本操作時,系統會自動將其轉化爲對源文件的相應操作。通過ls -l某個符號鏈接文件時,可以看到文件屬性的第一項爲l,即表示目錄文件。

管道文件(pipe):用於進程間通信,也稱爲FIFO文件。通過系統調用pipe可以創建一個管道。管道文件在使用上和普通文件沒有什麼太大的區別,只不過這種文件不像普通文件那樣存儲與磁盤上,而是存儲在內存中。

套接字文件(socket):主要用於網絡通信,也可以用於一臺主機上的進程間通信。

2.Linux文件結構

Linux採用樹型結構將所有文件組織起來,也就是說,每一個Linux系統就只對應一個這樣的樹型結構。windows操作系統也採用樹型結構,但卻是每個分區對應一個樹型結構。下面對Linux根目錄下的一些常見子目錄進行說明:

/bin:存放二進制的可執行的命令文件,我們通常所使用的命令就是來自這裏。比如ls,cat等。

/sbin:存放系統管理命令的目錄,即爲使用前要加sudo的那些命令,比如fdisk等。

/mnt:存放用戶臨時安裝其他文件系統的目錄。

/dev:存放設備文件的目錄。

/etc:存放系統管理和配置文件的目錄。

/home:系統中所有用戶主目錄的彙總。通過/home/username可以訪問某個用戶的主目錄。

/tmp:公共的臨時文件目錄。相對的,每個用戶在其主目錄下也有私有的臨時文件目錄。

/lib:標準程序設計庫,又叫做動態鏈接共享庫。

/proc:這個目錄存在與內存中,不佔用磁盤空間。該目錄存放的是對內存的一次映像,我們每打印一次/proc目錄,顯示的就是當前內存的狀態。

虛擬文件系統

Linux可支持數十種文件系統,不同的文件系統可以同時共存於一個系統之中。這些不同類型的文件系統並不是各自封閉的,而很可能會進行文件複製和移動等。比如,我的PC中裝有雙系統(比如ubuntu+winXP),現在我要將XP系統E盤中的test.doc文件拷貝到ubuntu系統中的主目錄下。我們知道,XP的文件系統類型是FAT,而Linux主目錄的文件系統類型是ext3,我們如何使用一種統一的“語言”來支持這種不同文件系統上文件的移動和複製?虛擬文件系統(Virtual FileSystem,VFS)就扮演的這樣的角色,即支持跨越不同文件系統或存儲設備的文件操作。

VFS是在各種具體的文件系統之上建立了一個抽象層,它屏蔽了不同文件系統間的差異。它之所以可以將各種文件系統納入其中,是因爲它提供了一個通用的文件系統模型。在內核中,這個通用的模型具體的表現爲一組統一的抽象接口和數據結構。每個文件系統都必須實現這些統一接口,並在組織結構上與該模型保持一致。

VFS相當於一個萬能插銷座,具體的文件系統相當於插銷座內部的電路實現。不管是兩頭插銷還是三頭插銷,甚至未來出現的單頭插銷都可以使用這個萬能的插座,使用根本不必考慮這個插座內部是如何實現的。

關於VFS更加全面的解說可以看這裏

VFS中的數據結構

上面說到,VFS是通用的文件系統模型。那麼,這個通用性具體如何表現出來?VFS主要通過一組數據結構來描述文件對象。其中有四個基本的結構體:

超級塊(struct super_block):它描述一個已安裝了的文件系統。

索引結點(struct inode):它描述一個文件。

目錄項(strcut dentry):它描述文件系統的層次結構。一個完整路徑的每個組成部分都是一個目錄項。比如打開/home/edsionte/code/hello.c時,內核分別爲/,home/,edsionte/,code/,hello.c創建相應的目錄項。

文件(struct file):它描述一個已被進程打開的文件。

VFS採用面向對象的思想,在上述每一個結構體中即包含描述每個文件對象屬性的數據,又包含對這些數據進行操作的函數指針結構體。也就是說,上述四個基本的結構體中,每一個結構體中又嵌套了一個子結構體,這個子結構體包含了對父結構體進行各種操作的函數指針。

上述文字是對VFS主要的幾個結構體大致的說明。下文中,將從代碼的角度分析這些結構體。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章