Operating system Inode与Vnode之差

Operating system Inode与Vnode之差,operating-system,filesystems,inode,vfs,Operating System,Filesystems,Inode,Vfs,我对Inode和Vnode有一些疑问。据我所知,inode是虚拟文件系统使用的文件的表示形式。而VNode是特定于文件系统的。这是正确的吗 此外,我还不清楚inode是内核数据结构,即它是内存中的数据结构还是实际磁盘中块上的数据结构?这取决于操作系统和您正在使用或处理的文件系统。例如,VXFS和ADVFS inode只是一种称为vnode的磁盘数据结构。一般来说,两者都指文件元数据 通常(与Linux和BSD主流文件系统一样),inode首先是一种磁盘上结构,它根据磁盘(通常以块为单位)描述文件

我对Inode和Vnode有一些疑问。据我所知,inode是虚拟文件系统使用的文件的表示形式。而VNode是特定于文件系统的。这是正确的吗


此外,我还不清楚inode是内核数据结构,即它是内存中的数据结构还是实际磁盘中块上的数据结构?

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

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

要补充一点:我能找到的关于vnode的最好解释是在。对于更具学术头脑的人来说,还有一个更为深入的资源

也就是说,VNode最初是为FreeBSD创建的,因为需要使用的不同类型的文件系统如UFS、NFS、,vnode是为了提供一个跨所有可能的文件系统的抽象,这样操作系统就可以与它们进行接口,这样内核函数就不必专门支持太阳下的每个文件系统;他们只需要知道如何与文件的vnode交互


回到您最初的问题,正如@Allen Luce所提到的,VNode是内存抽象,不是特定于文件系统的。它们可以在UFS、ext4和其他任何程序中互换使用。相反,inode存储在磁盘上,并且特定于所使用的确切文件系统。inode包含有关文件的元数据,如大小、所有者、指向块地址的指针等。VNode包含一些关于文件的数据,但只包含在文件生命周期内不会更改的属性,因此如果您希望获得关于文件的尽可能多的信息,inode将是引用的位置。如果你对iNode更感兴趣,我建议你去看看。

vnode的概念在一定程度上取决于你所处的系统,每个人都只是取了这个名字并使用它运行

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

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

您可以通过打开f,然后
unlink()
it来完成此操作。您仍然会保留对f的引用,即使它的inode现在有0个目录条目,因此被标记为free。在程序结束之前,操作系统仍保留文件的起始位置及其分配状态。不再存在的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的内核内表示

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

请尝试使用术语
inode
在操作系统的源代码中查找答案,例如。否则,您的问题显示出非常非常小的研究工作,可能会被否决,因为它不是一个实用的编码问题。我个人不同意,这听起来更像是一个无聊的家庭作业问题。是的,在维基百科和手册页上进行所有的研究和细察可能是有意义的,但你也必须意识到stackoverflow是一种类似的资源,因此可以将相同的信息压缩成更易于理解的格式。考虑到这个问题在其他地方不存在,我认为它肯定是有效的。当相应的文件被打开时,磁盘上的所有inode是否都被复制到一个通用inode中?复制了多少,在这种情况下,支持通用inode抽象需要多少性能开销?相应文件的整个inode都复制到通用inode,是的。让我们看一下在VFS上打开文件的步骤。1.获取文件描述符2。执行路径查找:获取root,获取dentry,它使用FS特定的函数读取它。如果inode不在内存缓存3中,则调用。调用特定于FS的开放例程,至于开销,我真的不确定。但如果你挖得够多,也许你能找到它。