linux 虚拟文件(linux查看用户)

浅谈Linux虚拟文件系统

虚拟文件系统(Virtual File System,简称VFS)是Linux内核的子系统之一,它为用户程序提供文件和文件系统操作的统一接口,屏蔽不同文件系统的差异和操作细节。借助VFS可以直接使用open()、read()、write()这样的系统调用操作文件,而无须考虑具体的文件系统和实际的存储介质。

举个例子,Linux用户程序可以通过read()来读取ext3、NFS、XFS等文件系统的文件,也可以读取存储在SSD、HDD等不同存储介质的文件,无须考虑不同文件系统或者不同存储介质的差异。

通过VFS系统,Linux提供了通用的系统调用,可以跨越不同文件系统和介质之间执行,极大简化了用户访问不同文件系统的过程。另一方面,新的文件系统、新类型的存储介质,可以无须编译的情况下,动态加载到Linux中。

“一切皆文件”是Linux的基本哲学之一,不仅是普通的文件,包括目录、字符设备、块设备、套接字等,都可以以文件的方式被对待。实现这一行为的基础,正是Linux的虚拟文件系统机制。

VFS之所以能够衔接各种各样的文件系统,是因为它抽象了一个通用的文件系统模型,定义了通用文件系统都支持的、概念上的接口。新的文件系统只要支持并实现这些接口,并注册到Linux内核中,即可安装和使用。

举个例子,比如Linux写一个文件:调用了write()系统调用,它的过程简要如下:操作示意图如下:

Linux为了实现这种VFS系统,采用面向对象的设计思路,主要抽象了四种对象类型:每个对象都包含一组操作方法,用于操作相应的文件系统。

备注:Linux将目录当做文件对象来处理,是另一种形式的文件,它里面包含了一个或多个目录项。而目录项是单独抽象的对象,主要包括文件名和索引节点号。因为目录是可以层层嵌套,以形成文件路径,而路径中的每一部分,其实就是目录项。

接下来介绍一下各个对象的作用以及相关操作。

2.1超级块:超级块用于存储文件系统的元信息,由super_block结构体表示,定义在中,元信息里面包含文件系统的基本属性信息,比如有:其中操作方法 s_op对每个文件系统来说,是非常重要的,它指向该超级块的操作函数表,包含一系列操作方法的实现,这些方法有:当VFS需要对超级块进行操作时,首先要在超级块的操作方法 s_op中,找到对应的操作方法后再执行。比如文件系统要写自己的超级块:创建文件系统时,其实就是往存储介质的特定位置,写入超级块信息;而卸载文件系统时,由VFS调用释放超级块。

Linux支持众多不同的文件系统,file_system_type结构体用于描述每种文件系统的功能和行为,包括:当向内核注册新的文件系统时,其实是将file_system_type对象实例化,然后加入到Linux的根文件系统的目录树结构上。

2.2索引:索引节点对象包含Linux内核在操作文件、目录时,所需要的全部信息,这些信息由inode结构体来描述,定义在中,主要包含:一个索引节点inode代表文件系统中的一个文件,只有当文件被访问时,才在内存中创建索引节点。与超级块类似的是,索引节点对象也提供了许多操作接口,供VFS系统使用,这些接口包括:等等,我们常规的文件操作,都能在索引节点中找到相应的操作接口。

2.3目录项:前面提到VFS把目录当做文件对待,比如/usr/bin/vim,usr、bin和vim都是文件,不过vim是一个普通文件,usr和bin都是目录文件,都是由索引节点对象标识。

由于VFS会经常的执行目录相关的操作,比如切换到某个目录、路径名的查找等等,为了提高这个过程的效率,VFS引入了目录项的概念。一个路径的组成部分,不管是目录还是普通文件,都是一个目录项对象。/、usr、bin、vim都对应一个目录项对象。不过目录项对象没有对应的磁盘数据结构,是VFS在遍历路径的过程中,将它们逐个解析成目录项对象。

目录项由dentry结构体标识,定义在中,主要包含:目录项有三种状态:将整个文件系统的目录结构解析成目录项,是一件费力的工作,为了节省VFS操作目录项的成本,内核会将目录项缓存起来。

2.4文件:文件对象是进程打开的文件在内存中的实例。Linux用户程序可以通过open()系统调用来打开一个文件,通过close()系统调用来关闭一个文件。由于多个进程可以同时打开和操作同一个文件,所以同一个文件,在内存中也存在多个对应的文件对象,但对应的索引节点和目录项是唯一的。

文件对象由file结构体表示,定义在中,主要包含:类似于目录项,文件对象也没有实际的磁盘数据,只有当进程打开文件时,才会在内存中产生一个文件对象。

每个进程都有自己打开的一组文件,由file_struct结构体标识,该结构体由进程描述符中的files字段指向。主要包括:fd_array数组指针指向已打开的文件对象,如果打开的文件对象个数> NR_OPEN_DEFAULT,内核会分配一个新数组,并将 fdt指向该数组。

除此之外,内核还为所有打开文件维持一张文件表,包括:关于多进程打开同一文件以及文件共享更详细的信息,可以阅读《UNIX环境高级编程》第三章。

Linux支持了很多种类的文件系统,包含本地文件系统ext3、ext4到网络文件系统NFS、HDFS等,VFS系统屏蔽了不同文件系统的操作差异和实现细节,提供了统一的实现框架,也提供了标准的操作接口,这大大降低了操作文件和接入新文件系统的难度。

linux的VFS(虚拟文件系统)详解

VFS,或虚拟文件系统,是一个在内核层面上,为POSIX文件系统接口提供抽象的软件层。它允许应用程序通过统一接口访问不同文件系统,同时提供不同文件系统间的通信桥梁。VFS架构在Linux系统中的地位如下:用户使用GLIBC作为应用运行时库,通过操作系统将应用的I/O操作转换为系统调用。VFS层在此基础上,通过抽象模型将POSIX API与具体文件系统接口分离,实现对不同存储设备操作的统一。VFS的关键在于提供统一文件模型,让底层文件系统实现POSIX API功能,最终完成物理存储设备的操作。这种设计避免了系统调用过于复杂,确保不同存储设备特性得到妥善处理。VFS为不同设备或文件系统间访问提供了媒介,如用户执行文件拷贝操作,VFS在用户层面上实现对不同文件系统的读写操作,无需用户关心底层细节。VFS抽象接口覆盖了Linux系统支持的所有文件系统操作。统一文件模型作为VFS的核心设计,定义了文件系统的四种对象,构建起统一文件模型。Linux VFS遵循Unix家族的VFS标准,为所有Unix系统提供支持。超级块(Superblock)作为文件系统的基础元信息,定义文件系统类型并支持挂载。内存中维护的超级块链表和根目录指针(s_root),以及设备信息(s_bdev),共同维护文件系统状态。超级块中的“super_operations”结构体指针(s_op),链接了具体文件系统支持的操作。通过系统调用注册和卸载文件系统,实现对不同文件系统的管理。每个文件系统在使用前需进行挂载,超级块包含文件系统类型信息。索引节点(Index node)在创建文件系统时生成,记录文件系统元信息,动态创建于内存中,包含与文件对象关联的操作指针。目录项(Directory entry)用于记录文件名与inode间的对应关系,实现文件系统树状层次结构,包括硬链接、缓存和多级目录功能。文件对象在打开文件后创建,与进程和用户关联,包含文件操作集合(f_op)等关键信息。VFS组件间的关系可以从用户视角清晰理解,通过文件描述符连接文件对象、dentry、inode和具体存储设备。这种设计确保了Linux系统的高效、灵活和兼容性。

什么是虚拟文件系统优点是什么Linux常用的文件系统是什么

你好

虚拟文件系统(vfs)是由sun

icrosystems公司在定义网络文件系统(nfs)时创造的。它是一种用于网络环境的分布式文件系统,是允许和操作系统使用不同的文件系统实现的接口。

优点是:

vfs使linux同时安装、支持许多不同类型的文件系统成为可能。vfs拥有关于各种特殊文件系统的公共界面,如超级块、inode、文件操作函数入口等。实际文件系统的细节,统一由vfs的公共界面来索引,它们对系统核心和用户进程来说是透明的。

linux

中经常使用

reiserfs

文件系统

阅读剩余
THE END