文件系统基本概念

| 分类 分布式文件系统  | 标签 文件系统 

前言

本文档主要介绍什么是文件系统、文件系统中的元数据、硬链接和软链接、日志等等,这对理解MDS的实现原理有非常好的帮助

文件系统

在使用计算机过程中,需要对数据进行读写等一系列的操作。比如存储一份数据,只需要打开文件编辑器写入数据点击保存,文件内容最终会保存到磁盘上,但我们并不知道这些数据存储在磁盘的具体位置;同理,获取一份数据时,也只需要知道对应的文件名和所在目录,使用相关应用程序打开即可,同样不需要关心从磁盘的具体哪个位置来获取。其实当我们在保存和读取文件时,需要操作系统通过文件系统来完成一系列动作,才能定位到磁盘的具体位置来存储或者读取数据。那么什么是文件系统呢?简言之,文件系统是一种针对磁盘(或者其他存储介质)上的用户数据进行组织和追踪的机制,其中元数据负责记录用户数据位置、所有者、访问权限、修改记录等关键信息,本身也要和用户数据一并写入磁盘。 常见的本地文件系统有:Ext2/3/4、XFS、BTRFS、FAT、NTFS;常见传统网络文件系统有:NFS、CIFS。随着互联网的快速发展,数据规模越来越庞大,企业对存储的要求也越来越高,传统的文件系统已经不能满足需求,分布式文件系统应运而生,常见的有:CephFS、Lustre、HDFS、GFS、GlusterFS等。 文件系统种类繁多、形态各异,那么类似Linux/Unix这样的操作系统应该如何去适配这些文件系统呢?以 Linux 操作系统为例,它通过一个名为VFS(Virtual File System)的虚拟文件系统,要求所有接入文件系统必须实现 VFS 所定义的统一并且符合 POSIX 语义的接口,以此来屏蔽不同的本地文件系统以及网络文件系统之间的差异,这个过程如下图所示:

下图展示了VFS在 Linux 操作系统中的位置和作用

文件系统中的元数据

实现上,VFS 为了适配不同类型的文件系统,定义了4种基本数据类型,分别为:SuperBlock,用于管理某一类文件系统信息;Inode,类Unix文件系统中的一种数据结构,每个Inode保存文件系统中的一个文件系统对象(包括文件、目录、设备文件、socket、管道等等在内)的概要信息,但不包括文件名和文件内容本身;Dentry,类Unix文件系统中某个Inode的链接,通过它们连接不同的Inodes,并最终实现文件系统目录树功能。Dentry是一个内存结构,由文件系统在内存中直接建立,Dentry中包含了文件名、文件的Inode号等信息;File(文件操作句柄),和进程相关,表示一个打开的文件,File和Inode之间是多对一的关系,因为多个进程可以打开同一个文件,每一次打开操作,系统都会创建一个File。 上述四种基本数据类型中,SuperBlock和File用于面向前端(客户端)提供服务,而Inode和Dentry则需要后端(服务端)文件系统提供服务功能。Inode 和 Dentry 是理解文件系统中数据组织形式的关键,下面重点进行介绍: (1)Inode Inode只记录数据块在存储介质上的位置和分布,以及文件对象属性(包括权限、属性组、数据块信息、时间戳等)信息,不包含文件名、内容等变长数据,这样可以使得Inode结构大小固定,方便查找。但我们发现要找到具体的存储位置,还缺少文件在目录树中的位置信息,因此需要引入Dentry。 (2)Dentry Dentry在文件系统中起到连接不同文件对应Inode的作用。Dentry包含文件名、文件Inode等信息。一般而言,在 Linux 操作系统下,读取或者写入文件时,需要给出文件所在的绝对路径或者相对路径,文件系统查找文件实际就是按照给出的路径从当前目录(如果是绝对路径,则从根目录开始)到叶子(文件)进行深度遍历过程。所有文件入口都从根目录开始,而Dentry是联接目录到文件之间的关键要素,原理如下:本级Dentry记录了本级目录或者文件名以及下一级目录或者文件的Dentry位置(为了快速搜索,也会记录上一级目录的Dentry位置),此外,因为Dentry本身也需要承载在具体的Inode对象中,所以Dentry也有自己的Inode号(根目录的Inode号一般默认设置为1)。Dentry的内容就像一张表,记录文件名与Inode之间的映射关系,而Dentry的Inode就像纽带,根据映射关系将它们连接起来,最终组成从根到叶子节点的完整路径,即构成了文件系统目录树。文件Dentry中记录的Inode会指向具体的存储介质的位置和范围,以实现文件内容的获取。上述过程如下图:

硬链接和软链接

文件系统中,为了实现文件共享、隐藏文件路径、增加权限安全和节省存储空间等功能,还需要引入链接这个重要的概念。链接包括硬链接和软链接两种方式。 硬链接指多个文件名指向同一个Inode号,即相同的存储内容可以使用不同的文件名来表示,特点是目录不能用来创建硬链接(防止出现目录环)、删除一个硬链接不影响其他文件(即只有所有指向同一个 Inode 的所有文件都被删除,文件才会被真正删除)、只能对已经存在的文件创建和不能跨文件系统进行链接,一般可以通过ln/link命令来创建,目录中隐藏的.和..就是典型的硬链接。 软链接即创建一个新的Inode,Inode存储的内容是另外一个文件路径名的指向,即软链接和普通的Inode除了存储的内容不同,没有其他差别。它的特点是可以灵活地实现诸多不做限制的要求:既可对存在或者不存在的文件和目录创建软链接,也可以链接到不同的文件系统,还可以在删除链接时不影响指向的文件等。下图展示软链接和硬链接之间的关系:

日志

日志是一种特殊的文件,用于循环记录文件系统的修改,并定期提交到文件系统进行保存。一旦系统发生崩溃,则日志会起到一个检测点的作用,用于恢复尚未保存的数据,防止文件系统出现数据(包括元数据和数据)丢失。下面是典型的日志文件系统写入流程:

日志文件系统有许多种类,但常见的设计模式无非有以下3种: (1)writeback 模式 writeback 模式只有元数据会被记录到日志,而数据仍然写入数据盘。这样虽然可以保证元数据一致性,但可能引起数据崩溃,例如在日志写入后、数据写入前系统发生崩溃的场景。 (2)ordered模式 ordered 模式也是只将元数据写入到日志,但前提是数据已经写入了数据盘。这样可以保证系统崩溃后日志数据与文件系统的一致性,缺点是不能最大限度的保证数据不丢失,例如在数据写入后、元数据写入前系统崩溃的场景。 (3)data模式(writeahead) data 模式将元数据和数据都记录到日志中,这样可以最大程度的防止文件系统崩溃和数据丢失,但由于数据写入了两次,性能会下降。 日志提交有两种常见的策略:超时提交和满时提交。超时提交指在规定时间到达后,日志内容会主动同步到数据存储介质上;满时提交是指日志存储空间已经达到上限,会触发同步数据到存储介质上。一般文件系统会同时启用这两种策略,来最大程度的保证数据安全和一致性。


上一篇     下一篇