Inode vs Vnode的区别

时间:2014-12-07 17:14:12

标签: operating-system filesystems inode vfs

我对Inode与Vnode有一些疑问。据我所知,inode是虚拟文件系统使用的文件的表示。而vnodes是特定于文件系统的。这是对的吗?

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

5 个答案:

答案 0 :(得分:14)

要为此添加内容:我可以在FreeBSD docs上找到我能找到的最佳解释。对于更具学术意识的人来说,还有original paper that introduced the concept提供了更深入的资源。

那说vnode最初是为FreeBSD创建的,因为不同类型的文件系统需要像UFS,NFS等那样使用.Vnodes旨在提供跨所有可能的文件系统的抽象,以便操作系统可以与它们以及内核函数不必专门支持sun下的每个文件系统;他们只需知道如何与文件的vnode进行交互。

回到原来的问题vnodes,正如@Allen Luce所提到的,是内存抽象,并不是特定于文件系统的。它们可以在UFS,ext4和其他任何东西中互换使用。相反,inode存储在磁盘上,并且特定于正在使用的文件系统。 inode包含有关文件的元数据,如大小,所有者,块地址指针等。 Vnode包含有关文件的一些数据,但只包含在文件生命周期内不会更改的属性,因此如果您希望获得有关文件的最多信息,则inode将成为引用的位置。如果您对inode更感兴趣,我建议您查看wikipedia which has a good article on them

答案 1 :(得分:13)

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

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

vnode的概念在某种程度上取决于你所使用的系统,每个人都喜欢这个名字并随之运行。

在Linux和Unix下,您可以将抽象视为如下。 假设存在

f.tmp

你希望f在程序运行时保持不变,因为你正在访问它,但如果你的程序结束或崩溃,你想确定它消失了。

您可以通过打开f,然后unlink()来执行此操作。你仍然会保留对f的引用,即使它的inode现在有0个目录条目,因此被标记为free。操作系统仍然保留文件启动的位置和分配状态,直到程序结束。这个不再存在的inode的“虚拟化”是一个vnode。

另一种常见的情况是,当您正在阅读从您身下消失的资源时。假设您正在观看电影,而它正在流式传输到临时位置。完全下载电影后,它将重新定位到另一个卷进行存储。不知何故,只要它保持打开,你就可以继续观看和擦洗电影。在这种情况下,即使再次没有链接,由于存在vnode,因此无法清除此inode。