Aad*_*nia 28 filesystems operating-system inode vfs
我对Inode与Vnode有一些疑问.据我所知,inode是虚拟文件系统使用的文件的表示.而vnodes是特定于文件系统的.它是否正确?
另外,我很困惑inode是否是内核数据结构,即它是内存数据结构还是存在于实际磁盘中的块上的数据结构?
Gre*_*reg 17
为此添加一些内容:我可以在FreeBSD文档中找到关于vnode的最佳解释.对于更具学术意识的人来说,还有原始论文引入了提供更深入资源的概念.
这就是说虚拟节点最初是为FreeBSD的创建,因为那需要像UFS,NFS等虚拟节点是为了提供所有可能的文件系统抽象,使操作系统可以与他们接口等使用不同类型的文件系统的扩散内核函数不必专门支持sun下的每个文件系统; 他们只需知道如何与文件的vnode进行交互.
回到原来的问题vnodes,正如@Allen Luce所提到的,是内存抽象,并不是特定于文件系统的.它们可以在UFS,ext4和其他任何东西中互换使用.相反,inode存储在磁盘上,并且特定于正在使用的文件系统.inode包含有关文件的元数据,如大小,所有者,块地址指针等.Vnode包含有关文件的一些数据,但只包含在文件生命周期内不会更改的属性,因此如果您希望获得有关文件的最多信息,则inode将成为引用的位置.如果您对inode更感兴趣,我建议您查看维基百科,其中有一篇很好的文章.
All*_*uce 14
通常(对于Linux和BSD主流文件系统),inode首先是磁盘上的结构,它根据该磁盘(通常以块为单位)描述文件的存储.vnode是一种内存结构,它抽象了inode的大部分内容(inode可以是其数据字段之一),但也捕获诸如文件,锁等操作之类的内容.这使得它支持基于非inode的文件系统,特别是网络文件系统.
vnode 的概念在一定程度上有所不同,具体取决于您所在的系统,每个人都只是采用了该名称并使用它运行。
在Linux和Unix下,您可以考虑如下抽象。假设存在
f.tmp
Run Code Online (Sandbox Code Playgroud)
您希望 f 在程序运行时保留下来,因为您正在访问它,但如果您的程序结束或崩溃,您希望确保它消失。
您可以通过打开 f,然后打开unlink()
it 来完成此操作。您仍然会保留对 f 的引用,即使它的 inode 现在有 0 个目录条目,因此已标记为空闲。操作系统仍然保留文件开始的位置及其分配状态,直到程序结束。这种不再存在的 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的内核表示.