我對於Inode vs Vnode有些懷疑。就我的理解而言,inode是虛擬文件系統使用的文件的表示形式。而vnodes是文件系統特定的。它是否正確?Inode vs Vnode的區別
另外,我很困惑inode是否是內核數據結構,即它是內存中的數據結構還是實際磁盤上塊中存在的數據結構?
我對於Inode vs Vnode有些懷疑。就我的理解而言,inode是虛擬文件系統使用的文件的表示形式。而vnodes是文件系統特定的。它是否正確?Inode vs Vnode的區別
另外,我很困惑inode是否是內核數據結構,即它是內存中的數據結構還是實際磁盤上塊中存在的數據結構?
這取決於您正在使用或正在使用的操作系統和文件系統。例如VXFS和ADVFS inode就是名爲vnode的磁盤數據結構。通常都指代文件元數據。
通常情況下(如Linux和BSD主流文件系統),inode首先是一個磁盤上的結構,它根據該磁盤(通常以塊的形式)描述文件的存儲。 vnode是一種內存結構,它抽象了inode(inode可以是其數據字段之一)的大部分內容,但也捕獲文件,鎖等操作。這使得它可以支持基於非inode的文件系統,特別是網絡文件系統。
要添加一些內容:我可以找到一個vnode的最佳解釋是FreeBSD docs。對於更多的學術意識,還有original paper that introduced the concept,它提供了更深入的資源。
這就是說,vnodes最初是爲FreeBSD創建的,因爲需要像UFS,NFS等那樣使用不同類型的文件系統.Vnodes旨在爲所有可能的文件系統提供抽象,以便操作系統可以接口與他們,並使內核功能不必特別支持在陽光下的每個文件系統;他們只需要知道如何與文件的vnode交互。
回到原始問題vnodes,正如@Doug Luce所提到的那樣,它們在內存抽象中並不是特定於文件系統的。它們可以在UFS,ext4和其他任何地方互換使用。相比之下,inode存儲在磁盤上,特定於正在使用的確切文件系統。 inode包含有關文件的元數據,如大小,所有者,指向塊地址的指針等等。 Vnodes包含有關文件的一些數據,但只包含不改變文件生命週期的屬性,因此如果您想獲得關於文件的大部分信息,則inode就是要引用的位置。如果你對inode更感興趣,我建議你查看wikipedia which has a good article on them。
vnode的概念根據你所處的系統而有所不同,程度取決於你所處的系統,每個人都只是取名而已。
在Linux和Unix下,您可以考慮抽象如下。 假設存在
f.tmp
你想F到堅持圍繞你的程序運行時,因爲你訪問它,但如果你的程序結束或崩潰,你要確保它消失。
你可以通過打開f,然後unlink()
來做到這一點。儘管它的inode現在有0個目錄條目,但仍會保留對f的引用,因此已被標記爲空白。操作系統仍然保留文件的起始位置和分配狀態,直到程序結束。不再存在的inode的這種「虛擬化」是一個vnode。
另一個常見的情況是,當你正在閱讀從你下面消失的資源時。假設你正在觀看電影,而它正在流到臨時位置。當電影完全下載後,它將被重新定位到另一個捲進行存儲。不管怎樣,只要它保持打開狀態,你就可以繼續觀看和清理電影。在這種情況下,即使再次沒有鏈接,因爲有一個vnode,這個inode還不能被清理。
這取決於您的操作系統。例如,在Linux系統上,沒有v節點,只有通用的i節點struct inode
,雖然在概念上類似於v節點,但實現方式不同。
對於BSD派生和UNIX內核,v節點指向特定於文件系統的i節點結構,以及一些附加信息,包括指向操作文件的函數的指針和未包含在inode中的元數據。主要區別是inode是文件系統,而vnode不是。 (在上面提到的Linux中,有一個與系統無關的inode和一個依賴於文件系統的inode)
inode不是內核數據結構,但是vnode/generic inode是內核表示形式inode。
打開相應的文件時,所有磁盤上inode是否都複製到通用inode中?它有多少被複制,在這種情況下,有多少性能開銷支持通用inode抽象? – mdenton8 2017-10-09 19:37:46
相應文件的整個inode被複制到通用inode中,是的。我們來看看在VFS上打開文件的步驟。 1.獲取文件描述符 2.執行路徑查找:獲取root,獲取使用FS特定功能讀取的dentry。如果inode不在內存緩存中,則調用[iget](http://www.tldp.org/LDP/khg/HyperNews/get/fs/vfstour.html) 3.調用FS特定的打開例程 至於開銷I'我真的不確定。但是,如果你足夠挖掘,你可以找到它。 – quantik 2017-10-09 21:00:41
請嘗試自己在操作系統的源代碼中使用術語'inode'找到答案,例如, https://github.com/torvalds/linux。否則,你的問題展現非常小的研究成果,可能會被低估,因爲它不是一個實際的編碼問題。這聽起來更像是等等等等作業問題 – xmojmr 2014-12-07 18:03:46
我個人不同意。雖然是的,但對維基百科和手冊頁進行所有研究和研究可能是有意義的,但您也必須認識到,stackoverflow是一種類似的資源,因此可以將相同的信息壓縮成更易於理解的格式。鑑於這個問題在其他地方不存在,我認爲它絕對有效。 – Greg 2016-04-23 08:08:58