8.1  概述

虚拟文件系统又称虚拟文件系统转换(Virual Filesystem Switch ,简称VFS)。说它虚拟,是因为它所有的数据结构都是在运行以后才建立,并在卸载时删除,而在磁盘上并没有存储这些数据结构,显然如果只有VFS,系统是无法工作的,因为它的这些数据结构不能凭空而来,只有与实际的文件系统,如Ext2MinixMSDOSVFAT等相结合,才能开始工作,所以VFS并不是一个真正的文件系统。与VFS相对,我们称Ext2MinixMSDOS等为具体文件系统。

1.虚拟文件系统的作用

在第一章Linux内核结构一节中,我们把VFS称为内核的一个子系统,其它子系统只与VFS打交道,而并不与具体文件系统发生联系。对具体文件系统来说,VFS是一个管理者,而对内核的其它子系统来说,VFS是它们与具体文件系统的一个接口,整个Linux中文件系统的逻辑关系如图8.1所示:


8.1  Linux中文件系统的逻辑关系示意图

VFS提供一个统一的接口(实际上就是file_operatoin数据结构,稍后介绍),一个具体文件系统要想被Linux支持,就必须按照这个接口编写自己的操作函数,而将自己的细节对内核其它子系统隐藏起来。因而,对内核其它子系统以及运行在操作系统之上的用户程序而言,所有的文件系统都是一样的。实际上,要支持一个新的文件系统,主要任务就是编写这些接口函数。

概括说来,VFS主要有以下几个作用:

1)对具体文件系统的数据结构进行抽象,以一种统一的数据结构进行管理。

2)接受用户层的系统调用 ,例如writeopenstatlink等等。

3)支持多种具体文件系统之间相互访问。

4)接受内核其他子系统的操作请求,特别是内存管理子系统。

通过VFSLinux可以支持很多种具体文件系统,表8.1Linux支持的部分具体文件系统。

8.1              Linux支持的部分文件系统

 文件系统

     

Minix

Linux最早支持的文件系统。主要缺点是最大64M的磁盘分区和最

14个字符的文件名称的限制

Ext

第一个Linux专用的文件系统,支持2G磁盘分区,255字符的文件名称。但性能有问题。

Xiafs

Minix基础上发展起来,克服了Minix的主要缺点。但很快被更完善的文件系统取代

Ext2

当前实际上的Linux标准文件系统。性能强大,易扩充,可移植。

Ext3

日志文件系统。Ext3文件系统是对稳定的Ext2文件系统的改进

System V

Unix早期支持的文件系统,也有与Minix同样的限制

NFS

网络文件系统。使得用户可以像访问本地文件一样访问远程主机上的文件。

ISO 9660

光盘使用的文件系统

/proc

一个反映内核运行情况的虚的文件系统,并不实际存在于磁盘上。

Msdos

Dos的文件系统,系统力图使它表现的像Unix

UMSDOS

该文件系统允许MSDOS文件系统可以当作Linux固有的文件系统一样使用

Vfat

fat文件系统的扩展,支持长文件名。

Ntfs

windows NT的文件系统

Hpfs

OS/2的文件系统

 

2 VFS所处理的系统调用

 

8.2列出VFS的系统调用,这些系统调用涉及文件系统、常规文件、目录及符号链接。另外还有少数几个由VFS处理的其它系统调用:诸如ioperm(  )ioctl(  )pipe(  ) mknod(  ),涉及设备文件和管道文件 ,有些内容在下一章进行讨论。由VFS处理的最后一组系统调用,诸如socket(  )connect(  )bind(  ) protocols(  ),属于套接字系统调用并用于实现网络功能。

 

8.2  VFS的部分系统调用

系统调用名

功能

 mount(  )/ umount(  )    

安装/卸载文件系统

sysfs(  )             

获取文件系统信息

statfs(  )/ fstatfs(  ) /ustat(  )

获取文件系统统计信息

chroot(  ) 

更改根目录

chdir(  ) /fchdir(  ) /getcwd(  )

更改当前目录

mkdir(  ) /rmdir(  )

创建/删除目录

getdents(  ) /readdir(  )/ link(  ) unlink(  ) /rename(  )

对目录项进行操作

readlink(  ) /symlink(  )     

对软链接进行操作

chown(  ) /fchown(  ) /lchown(  ) 

更改文件所有者

chmod(  )/ fchmod(  ) /utime(  )

更改文件属性

stat(  ) /fstat(  ) /lstat(  ) access(  )

读取文件状态

open(  ) /close(  ) /creat(  ) /umask(  )

打开/关闭文件

dup(  ) /dup2(  ) /fcntl(  )  

对文件描述符进行操作

select(  ) /poll(  )  

异步I/O通信

truncate(  ) /ftruncate(  )

更改文件长度

lseek(  ) /_llseek(  )

更改文件指针

read(  )/ write(  ) /readv(  ) /writev(  ) sendfile(  )

文件I/O操作

 

pread(  )/ pwrite(  ) 

搜索并访问文件

mmap(  ) /munmap(  )

文件内存映射

fdatasync(  ) /fsync(  ) /sync(  )/ msync(  )

同步访问文件数据

flock(  )  

处理文件锁

前面我们已经提到,VFS是应用程序和具体的文件系统之间的一个层。不过,在某些情况下,一个文件操作可能由VFS本身去执行,无需调用下一层程序。例如,当某个进程关闭一个打开的文件时,并不需要涉及磁盘上的相应文件,因此,VFS只需释放对应的文件对象。类似地,如果系统调用lseek(  )修改一个文件指针,而这个文件指针指向有关打开的文件与进程交互的一个属性,那么VFS只需修改对应的文件对象,而不必访问磁盘上的文件,因此,无需调用具体的文件系统子程序。从某种意义上说,可以把VFS看成“通用”文件系统,它在必要时依赖某种具体的文件系统。