虚拟文件系统介绍
Linux使用了虚拟文件系统(VFS,Virtual Filesystem,下文统称“虚拟文件系统”),它不是磁盘文件的组织格式,而是抽象出来的文件树的集合,它通过标准接口动态的向其中增加或移除对应的目录。虚拟文件系统支持以下归类的三种类型的文件系统:
- 磁盘文件系统,存储在本地磁盘、U盘、CDROM等的文件系统,它包含各种不同的文件系统格式,比如Windows NTFS、VFAT,BSD的UFS,CD的CD-ROM等
- 网络文件系统,它们存储在网络中的其他主机上,通过网络进行访问,例如 NFS
- 特殊文件系统,内存的映射、例如/proc
案例如以下截图,Linux上的进程通过Sytem Calls(系统调用)将数据经过VFS最终的转写入不同的文件系统,再通过文件系统的驱动最终写入硬件设备。这里的Sytem Calls就包含read()、write()和lseek()等。
虚拟文件系统对象类型
虚拟文件系统,有四个主要对象类型:
- Superblock 表示特定加载的文件系统
- Inode 表示特定的文件
- Dentry 表示一个目录项,路径的一个组成部分
- File 表示进程打开的一个文件
Superblock
超级块(spuerblock)对象由各自的文件系统实现,用来存储文件系统的信息。这个对象对应为文件系统超级块或者文件系统控制块,它存储在磁盘特定的扇区上。不是基于磁盘的文件系统临时生成超级块,并保存在内存中。
Inode
索引节点对象包含了内核在操作文件或目录时需要的全部信息。对于Unix文件系统来 说,这些信息可以从磁盘索引节点直接读入。如果一个文件系统没有索引节点,那么,不管这些相关信息在磁盘上是怎么存放的,文件系统都必须从中提取这些信息。
Dentry
为了方便查找,虚拟文件系统引入目录项的概念。每个Dentry代表路径中一个特定部分。对于“/bin/ls”、“/”、“bin”和“ls”都是目录项对象。前面是两个目录,最后一个是普通文件。在路径中, 包括普通文件在内,每一个部分都是目录项对象。
File
虚拟文件系统最后一个主要对象是文件对象,文件对象表示进程已打开的文件。如果我们站在用户空间的角度考虑虚拟文件系统
,文件对象会首先进入我们的视野。进程直接处理的是文件而不是超级块、索引节点或目录。文件对象包含我们非常熟悉的信息(如访问模式、当前偏移等), 文件操作和我们非常熟悉的系统调用read()和write()等也很类似。文件对象是已打开的文件在内存中的表示。该对象(不是物理文件)由相应的open()系统调用创建,由close()系统调用销毁,所有这些文件相关的调用实际上都是文件操作 表中定义的方法。
文件名与路径
文件名则被指定,由文件系统的根目录开始到指定的文件位置的完整路径( /etc/sysconfig/network )称为“绝对路径”,此外表示路径的方法还有“相对路径”。在使用路径时有两种符号:
- “.” 表示当前目录
- “..” 表示上一级目录
另外 Linux 有很多不同于其他操作的特征:
- 把所有的外部设备看作是文件(即一切揭“文件”),为了保证输入输出操作的一致性 Linux把所有的对外部设备的操作都设计成为等同于操作文件,因此无论什么外部设备的特征,都被文件系统隐藏了。
- 文件的用有者可以指定其他的组或用户读,写和执行文件的权限,从而起到提高文件的安全性。
参考文章
http://www.ilinuxkernel.com/files/Linux.Virtual.Filesystem.pdf