Inode vs Vnode的区别

问题描述 投票:24回答:5

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

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

operating-system filesystems inode vfs
5个回答
16
投票

为此添加一些东西:我能找到的关于vnode的最佳解释是在FreeBSD docs上。对于更具学术意识的人来说,还有original paper that introduced the concept,它提供了更深入的资源。

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

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


14
投票

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


5
投票

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

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

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


1
投票

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


1
投票

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

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

f.tmp

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.