linux 的成功有一部分原因在於能夠很好的支援不同的檔案系統,你能夠輕鬆透明地把 windows、其他 unix 系統、甚至是占有極小份額的 amiga 使用的檔案系統mount
到linux 的檔案系統中。這是通過virtual filesystem
(以下簡稱 vfs)實現的。
vfs 背後的 idea 是在 kernel 中抽象出不同檔案系統,針對具體的檔案系統,linux kernel 實現具體的操作方法。當系統呼叫read
、write
發生時,kernel 根據操作的具體檔案系統,比如 native linux檔案系統、ntfs(windows nt)等,呼叫相對應的函式。
要執行乙個cp
指令:
cp /floppy/test /tmp/test
複製**
其中/floppy
是乙個 mount 的ms-dos檔案系統,而/tmp
是 ext2。vfs 就是應用程式和底層檔案系統實現之間的乙個抽象層,cp
不需要知道/floppy/test
個/tmp/test
的檔案系統型別,它只需要呼叫標準的系統呼叫,比如read
、write
這些,把底層檔案系統不同帶來的複雜度交給 kernel。
示例的**如下:
inf = open("/floppy/test", o_rdonly, 0);
outf = open("/tmp/test",
o_wronly|o_creat|o_trunc, 0600);
do while (i);
close(outf);
close(inf);
複製**
示意圖:
**和截圖**於 《understanding the linux kernel, third edition》 p457vfs 支援嗯檔案系統一共分為下面三大類:
disk-based fs
本地的 disk。包括:
network fs
這一類支援訪問遠端的檔案系統,比如 nfs、coda、afs 等。
special fs
如/proc
虛擬檔案系統。
通常來說,root 目錄為 linux 原生的ext2
、ext3
、ext4
,其他型別的檔案系統通過mount
形式 mount 到某個特定子目錄。
vfs 背後的核心idea: 用common file model表示所有現實中的fs。這個模型嚴格使用原生unix fs 模型,每個特定的 fs 都需要將自己的硬體結構翻譯成 common file model。
比如在 common file model 中,目錄也被看做檔案,包含其他的檔案盒目錄。然而,一些非 unix 的 fs,使用的是 file allocation table(fat),這種情況下,目錄不是檔案。但是為了遵循 common file model的規則,linux 對這種 fat-based 的 fs,必須能夠抽象出乙個遵循common file model 的介面。
更加具體點,linux kernel 在處理read
、ioctl
這些系統呼叫的時候,不能直接硬編碼,使用某個特定的底層函式。kernel實際上針對每乙個操作,使用的是乙個指標,這個指標指向了針對此檔案系統專門的處理函式。
讓我們來看看kernel 是如何完成上面提到的cp
操作的。
應用層呼叫read()
,kernel 實際上會呼叫sys_read()
service routine(其他的系統呼叫也一樣)。ms-dos fs 的檔案被 kernel memory 中的乙個資料結構表示,這個資料結構包含乙個f_op
字段,指向的是針對 ms-dos 的 read 函式。sys_read()
找到這個函式然後呼叫它。所以整個過程可以看作是:
read() -> sys_read() -> file data structure -> f_op -> read_for_msdos()
複製**
呼叫write()
也一樣,這個系統呼叫會觸發針對ext2
fs 的寫呼叫。
簡要來說,對於每個 open()建立的 file object,kernel 需要負責正確賦值此 file object的指標,指向針對此檔案系統的特定函式,然後呼叫這些函式。
vfs 是應用和特定檔案系統之間的一層抽象,有些操作能夠直接在 vfs 層完成,不需要涉及到底層的具體檔案系統。比如說,當程序close file的時候,disk 上的檔案本身是不會改變的,所以 vfs 只要把對應的 file 物件釋放掉就行了。再比如說,lseek()
系統呼叫,改變的也是記憶體中的 file 物件,而不需要設計底層的檔案系統。
Linux核心 虛擬檔案系統
1.虛擬檔案系統是核心子系統,為使用者空間的程式提供了檔案和檔案系統的介面 2.vfs使得使用者可以直接使用系統呼叫而無需考慮具體檔案系統和實際物理介質 3.vfs定義了所有檔案系統都支援的介面和資料結構,同時檔案系統也將自身的一些概念在形式上和vfs保持一致 4.其實在核心中,除了檔案系統本身,其...
核心摘要 虛擬檔案系統
linux支援多種檔案系統型別的方式和其他類unix系統類似,通過虛擬檔案系統來實現。對每個讀,寫或其他操作檔案系統的呼叫函式,核心都用實際支援各種檔案系統的函式來代替。12.1 虛擬檔案系統 vfs 的角色 vfs是乙個核心軟體層,用來處理與標準unix檔案系統相關的全部系統呼叫。它主要作用是為多...
Linux虛擬檔案系統
這一周主要學了檔案系統的相關知識,通過學習基本上掌握了 linux 檔案系統的結構,檔案型別,以及讀取模式等等,也學會怎麼用命令簡單的建立乙個檔案系統。linux 的檔案系統主要有 ext2 ext3 ext4 在windows 下乙個分割槽會採用的一棵目錄樹來管理,而 linux 則只有一棵目錄樹...