vfs


在Linux中,文件系统主要分为下面3种:
(1)基于磁盘的文件系统(Disk-based Filesystem) 是在非易失介质上存储文件的经典方法,用以在多次会话之间保持文件的内容。如Ext2/3/4, Reiserfs, FAT等。
(2)虚拟文件系统(Virtual Filesystem) 在内核中生成,是一种用户应用程序与内核通信的方法。如proc,它不许要在任何类的硬件设备上分配存储空间,所有的信息都是动态在内存中开辟和存储。
(3)网络文件系统(Network Filesystem) 是基于磁盘的文件系统和虚拟文件系统之间的折中。这种文件系统允许访问另一台计算机上的数据,该计算机通过网络连接到本地计算机。在这种情况下,数据实际上存储在一个不同系统的硬件设备上。
由于VFS抽象层的存在,用户空间进程不会看到本地文件系统与网络文件系统之间的区别。



  1. VFS的模型与结构
    VFS不仅为文件系统提供了方法和抽象,还支持文件系统中对象(或文件)的统一视图。并非每一种文件系统都支持VFS中的所有抽象,如FAT,因为其设计没有考虑到此类对象。定义一个最小的通用模型,来支持内核中所有文件系统都实现的那些功能,这是不实际的。因为这样会损失许多本质性的功能特性,或者导致这些特性只能通过特定文件系统的路径访问。
    VFS的方案完全相反:提供一种结构模型,包含了一个强大文件系统所具备的所有组件。但该模型只存在于虚拟中,必须使用各种对象和函数指针与每种文件系统适配。所有文件系统的实现都必须提供与VFS定义的结构配合的例程,以弥合两种视图之间的差异。
    VFS是由基于经典文件系统的结构衍化而来,所以VFS与Ext类文件系统类似,从而在处理Ext类文件系统的时候,Ext和VFS之间的转换,几乎不会损失时间。



一些基本概念:
文件 一组在逻辑上具有完整意义的信息项的系列。在Linux中,除了普通文件,其他诸如目录、设备、套接字等 也以文件被对待。总之,“一切皆文件”。
目录 目录好比一个文件夹,用来容纳相关文件。因为目录可以包含子目录,所以目录是可以层层嵌套,形成 文件路径。在Linux中,目录也是以一种特殊文件被对待的,所以用于文件的操作同样也可以用在目录上。
目录项 在一个文件路径中,路径中的每一部分都被称为目录项;如路径/home/source/helloworld.c中,目录 /, home, source和文件 helloworld.c都是一个目录项。
索引节点 用于存储文件的元数据的一个数据结构。文件的元数据,也就是文件的相关信息,和文件本身是两个不同 的概念。它包含的是诸如文件的大小、拥有者、创建时间、磁盘位置等和文件相关的信息。
超级块 用于存储文件系统的控制信息的数据结构。描述文件系统的状态、文件系统类型、大小、区块数、索引节 点数等,存放于磁盘的特定扇区中



Category linux