Inode 与 Vnode 的区别

Posted

技术标签:

【中文标题】Inode 与 Vnode 的区别【英文标题】:Inode vs Vnode Difference 【发布时间】:2015-02-05 08:40:52 【问题描述】:

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

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

【问题讨论】:

请尝试使用inode一词在操作系统的源代码中自己寻找答案,例如github.com/torvalds/linux。否则,您的问题的研究工作量非常小,并且可能会被否决,因为它不是一个实际的编码问题。听起来更像是诸如此类的家庭作业问题 我个人不同意。虽然是的,执行所有研究并仔细研究***和手册页可能是有意义的,但您还必须意识到 *** 是使用的类似资源,因此可以将相同的信息浓缩成更易于理解的格式。鉴于这个问题在其他地方不存在,我认为它绝对有效。 【参考方案1】:

为此添加一些内容:我可以在FreeBSD docs 上找到关于 vnode 的最佳解释。对于更有学术头脑的人,还有original paper that introduced the concept,它提供了更深入的资源。

也就是说,vnodes 最初是为 FreeBSD 创建的,因为需要使用的不同类型的文件系统(如 UFS、NFS 等)的激增。vnodes 旨在提供跨所有可能文件系统的抽象,以便操作系统可以与它们,因此内核函数不必专门支持阳光下的每个文件系统;他们只需要知道如何与文件的 vnode 交互。

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

在打开相应文件时是否将所有磁盘 inode 复制到通用 inode 中?复制了多少,在这种情况下,有多少性能开销来支持通用 inode 抽象? 将对应文件的整个inode复制到通用inode,是的。让我们看一下在 VFS 上打开文件的步骤。 1. 获取文件描述符 2. 执行路径查找:获取 root,获取它使用 FS 特定函数读取的 dentry。如果 inode 不在内存缓存中,则调用 iget。 3. 调用 FS 特定的打开例程 至于开销,我真的不确定。但也许如果你挖得够多,你就能找到它。【参考方案4】:

vnode 的概念在一定程度上会有所不同,具体取决于您使用的系统,每个人都只是取了这个名字并用它运行。

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

f.tmp

您希望 f 在程序运行时一直存在,因为您正在访问它,但如果您的程序结束或崩溃,您希望确保它消失。

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

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

【讨论】:

【参考方案5】:

这取决于您正在使用或处理的操作系统和文件系统。例如,VXFS 和 ADVFS inode 只不过是称为 vnode 的磁盘数据结构。一般来说,两者都指文件元数据。

【讨论】:

【参考方案6】:

简单地说,内存中的数据结构vnode只是一个inode cache,它存储了关于 文件(通常inode存储在磁盘中),以便可以更快地访问它。

【讨论】:

以上是关于Inode 与 Vnode 的区别的主要内容,如果未能解决你的问题,请参考以下文章

dentry与inode有啥联系和区别

Linux深入理解重定向inode详解与软硬链接的概念及区别

Linux深入理解重定向inode详解与软硬链接的概念及区别

Linux - 操作系统查找文件的过程以及硬链接与软链接的区别

Linux文件系统中硬链接和软链接的区别

linux下软链接与硬链接的区别