假設你是一個 Linux 使用者,你應該知道要想使用一個 U 盤裏面的文件,需要系統支持你 U 盤裏的操作系統,並且你還需要把 U 盤這個設備 mount 到現有的一個目錄下面,其實這裏面就牽涉到幾個概念,首先,要有文件系統,那麼就有一塊數據需要來表明這些信息,這就是 super block, 其實有目錄結構,在內核就它就是 dentry,還要有文件 inode,以及掛載到 dentry 上的一個掛載信息來表明,該目錄下被掛載了一個文件系統。這幾個重要的數據結構便是組成了 VFS 整體動作的基礎。
下圖1,展示了 file, dentry, inode, super block 之間的關係。
圖解:
Process1 打開文件硬鏈接 /home/Henzox/file1, 該硬鏈接表示的文件爲 /home/Henzox/file;
Process2 打開文件硬鏈接 /home/Henzox/file1,同上;
Process3 打開文件 /home/Henzox/file。
每次調用 open 打開文件,就會得到一個文件對象,它們記錄了本次打開各自的信息,最重要的信息莫過於文件指針位置,即使是相同的文件,每次打開操作,都會有自己的操作位置,所以會有三個 File object, 而由於 /home/Henzox/file1 是 /home/Henzox/file 的硬鏈接,所以它們在磁盤上相當於同一個文件,所以三個進程其實是在操作同一個文件,幫只有一個 inode object,而 Process1 和 Process2 是使用相同的路徑打開的,所以它們共享的是一個
dentry object,因爲 dentry 代表一個目錄項結構,目錄項,故名思義,即可以是目錄,也可以是文件,因爲目錄也被當作文件來處理。而一個文件系統就會有一個超級塊來表示該文件系統下各結構體的信息,所以 inode 會指向它所在的文件系統的超級塊對象。
那麼現在這幾個結構體之間的關係就大致明白了。