2014-12-07 115 views
14

我对于Inode vs Vnode有些怀疑。就我的理解而言,inode是虚拟文件系统使用的文件的表示形式。而vnodes是文件系统特定的。它是否正确?Inode vs Vnode的区别

另外,我很困惑inode是否是内核数据结构,即它是内存中的数据结构还是实际磁盘上块中存在的数据结构?

+0

请尝试自己在操作系统的源代码中使用术语'inode'找到答案,例如, https://github.com/torvalds/linux。否则,你的问题展现非常小的研究成果,可能会被低估,因为它不是一个实际的编码问题。这听起来更像是等等等等作业问题 – xmojmr 2014-12-07 18:03:46

+10

我个人不同意。虽然是的,但对维基百科和手册页进行所有研究和研究可能是有意义的,但您也必须认识到,stackoverflow是一种类似的资源,因此可以将相同的信息压缩成更易于理解的格式。鉴于这个问题在其他地方不存在,我认为它绝对有效。 – Greg 2016-04-23 08:08:58

回答

1

这取决于您正在使用或正在使用的操作系统和文件系统。例如VXFS和ADVFS inode就是名为vnode的磁盘数据结构。通常都指代文件元数据。

9

通常情况下(如Linux和BSD主流文件系统),inode首先是一个磁盘上的结构,它根据该磁盘(通常以块的形式)描述文件的存储。 vnode是一种内存结构,它抽象了inode(inode可以是其数据字段之一)的大部分内容,但也捕获文件,锁等操作。这使得它可以支持基于非inode的文件系统,特别是网络文件系统。

9

要添加一些内容:我可以找到一个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

0

vnode的概念根据你所处的系统而有所不同,程度取决于你所处的系统,每个人都只是取名而已。

在Linux和Unix下,您可以考虑抽象如下。 假设存在

f.tmp 

你想F到坚持围绕你的程序运行时,因为你访问它,但如果你的程序结束或崩溃,你要确保它消失。

你可以通过打开f,然后unlink()来做到这一点。尽管它的inode现在有0个目录条目,但仍会保留对f的引用,因此已被标记为空白。操作系统仍然保留文件的起始位置和分配状态,直到程序结束。不再存在的inode的这种“虚拟化”是一个vnode。

另一个常见的情况是,当你正在阅读从你下面消失的资源时。假设你正在观看电影,而它正在流到临时位置。当电影完全下载后,它将被重新定位到另一个卷进行存储。不管怎样,只要它保持打开状态,你就可以继续观看和清理电影。在这种情况下,即使再次没有链接,因为有一个vnode,这个inode还不能被清理。

3

这取决于您的操作系统。例如,在Linux系统上,没有v节点,只有通用的i节点struct inode,虽然在概念上类似于v节点,但实现方式不同。

对于BSD派生和UNIX内核,v节点指向特定于文件系统的i节点结构,以及一些附加信息,包括指向操作文件的函数的指针和未包含在inode中的元数据。主要区别是inode是文件系统,而vnode不是。 (在上面提到的Linux中,有一个与系统无关的inode和一个依赖于文件系统的inode)

inode不是内核数据结构,但是vnode/generic inode是内核表示形式inode。

+0

打开相应的文件时,所有磁盘上inode是否都复制到通用inode中?它有多少被复制,在这种情况下,有多少性能开销支持通用inode抽象? – mdenton8 2017-10-09 19:37:46

+1

相应文件的整个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