任何一个操作系统都必须要提供持久性存储和管理数据的手段。 在Linux 系统中,“文件”用来保存数据,而“文件系统”可以让用户组织、操纵以及存取不同的文件,文件系统的基本组成单位是文件,文件系统中的所有文件通过目录、链接等组织成一个完整的树形结构,其“根”为“/”,文件在“叶子”位置,各子目录处在中间节点的位置。
Linux 的一个最重要的特点是它可以支持许多不同的文件系统。 这让它非常灵活,可以和许多其他操作系统共存。 目前,Linux 已经可以支持20 种以上的文件系统。 例如:ext、ext2、xia、minix、umsdos、msdos、fat、vfat,autofs、romfs、proc,smb、ncp、iso9660、sysv、hpfs、affs、qnx4、nfs、ntfs 和ufs 等。
文件系统建立在块设备上(如硬盘、软盘、光盘等)。 块设备上存储的是定长且可任意访问的数据块,对块设备的访问以块为单位,因此,对块设备的访问都需要经过缓冲区。 每个块设备都有一个编号对应一个设备特殊文件,如系统中的第一个IDE 磁盘驱动器的第一个分区,即IDE 磁盘分区/dev/hdal,是一个块设备。 Linux 文件系统将这些块设备看成简单的线性块的组合,无须去关心底层物理磁盘的尺寸。 块设备驱动程序负责将对设备特定块的读/写请求映射到设备能理解的术语,这个块保存在硬盘上的磁道、扇区和柱面等。 一个文件系统,无论它保存在什么设备上,都应该用同样的方式工作,有同样的观感。
当磁盘初始化时(比如用fdisk),利用分区结构可以将物理磁盘划分成一组逻辑分区。每一个分区都可以放一个文件系统,如在一个Linux 和Win 95 共存的磁盘上,至少要有两个分区,分别用于建立fat 和exit2 文件系统。 在同一个文件系统中,一个文件是物理设备的一组数据块,用该文件系统的一个数据结构-inode 节点描述。 一个inode 节点集中描述了个文件的所有信息,如文件名、文件大小、文件属性、文件在磁盘上的位置等。 一个文件系统的所有文件通过磁盘上的目录、符号链接等组织成一个树形结构,文件系统的所有信息由它的管理结构描述。(www.xing528.com)
不同的文件系统中这些信息的内容以及组织形式都不尽相同,这直接导致文件系统的实现算法也各不相同,互不兼容。 文件系统的互不兼容性给用户带来许多不便。
当EXT 文件系统增加到Linux 时,进行了一个重要的改进。 引入了一个接口层,通过它将真实的文件系统与操作系统内核的其余部分(如文件系统服务等)分离开来,这个接口称为虚拟文件系统或VFS。 VFS 是一个由内核实现的虚拟文件系统,它是操作系统内核和真实文件系统之间的一个软件层。 VFS 提供了两个接口,其下层提供了一个与具体的文件系统的接口,它规定了一个具体文件系统的实现必须提供的服务以及服务的格式。 Linux 支持的每一个真实文件系统,都必须向VFS 提供这些接口函数的一个具体的实现方式。 换句话说,只要一个文件系统的实现提供了这些函数,Linux 就可以通过VFS 支持这种(通常是不同的)文件系统。 VFS 提供的另外一个接口是其上层对用户的接口,这是一个由一组标准的系统函数组成的接口,用户可以通过这组标准的函数操纵文件系统,而不用理会其类型和实现细节。Linux 文件系统的所有细节都通过软件进行转换,对于Linux 内核的其余部分和系统中运行的程序来说,所有的文件系统显得都一样,Linux 用户看见的只有VFS。 正是虚拟文件系统层使得Linux 能够同时透明地安装许多不同的文件系统。
Linux 虚拟文件系统的实现,使得对于它的文件的访问尽可能地快速和有效。 当然,VFS也必须保证文件和文件数据的正确性,这两个要求相互可能不一致。 Linux VFS 在安装和使用每一个文件系统时,都在内存中高速缓存它的有关信息(快速、有效)。 在文件和目录被创建、写和删除时,这些高速缓存中的数据会被改动,因此,必须非常小心,以保证正确更新文件系统(保证cache 中数据和磁盘上数据的一致性)。 如果能看到运行着的内核中有关文件系统的数据结构,就能够看到正在被文件系统读/写的数据块。 描述正在被访问的文件和目录的数据结构会被创建和撤销,设备驱动程序会不停地运转来获取和保存数据。 在这些高速缓存中,最重要的是Buffer cache,因为它被组合在文件系统中,访问它们底层块设备,当块被访问时,它们被放到Buffer cache 中,并根据它们的三种状态,在不同的队列中排队,Buffer cache不仅缓存数据,它也帮助管理块设备驱动程序的异步接口。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。