LINUX文件系统介绍
文件系统的作用就是在应用概念的文件和存储设备之间提供一个中间层,以使多个文件驻留在一个存储设备上,由文件系统来管理所有文件的存储。文件系统将每个存储设备化为一系列目录,每个目录含有若干文件。
块(block)分配
传统的Unix文件系统使用块分配机制,例如UFS,并且提供一个灵活有效的块分配策略(policy)。磁盘块在被使用时分配,就是说只为文件分配一个最小的文件系统块数,以保存存储空间。
当文件扩展时,从一个空闲块位图中分配块,所以有时块是随机分配的。随机分配会导致过多的磁盘搜寻,随后从文件系统读数据会导致磁盘机制搜寻文件扩展期间所分配的所有随机块位置。随机块分配可以通过块分配策略的优化来避免,它试图分配连续序列的块。
更小的块分配获得大的连续分配,大量减少了磁盘搜寻。然而,连续的文件系统块分配最终导致了文件系统中的文件块碎片,结果文件系统访问最终又会回到随机的本质。
块分配方案也要保存文件扩展时每个被分配的新块的位置信息,以及文件是否是每次一块的扩展。额外的磁盘I/O被要求读写文件系统块结构信息。文件系统块结构信息成为元数据(metadata)。文件系统元数据总是同步写入存储设备,所以对一个文件大小的改变需要等待每个元数据操作完成。因此,元数据操作极大降低了文件系统的整体性能。
范围(extent)分配
基于范围的文件系统每次按一大群来分配磁盘块,因此要强制进行顺序分配。一个文件被写入时,大量块在文件创建时被分配给文件;然后,可以进行大群或簇顺序块的写入。文件系统元数据在文件首次创建是写入;在块的第一个分配范围内的写不要求额外的元数据写,直到被分配下一个范围。
这种方法优化了磁盘搜寻方式,到簇的群化块写入允许文件系统提交对存储设备的更大的物理磁盘写入,节省了许多小SCSI转换的开销。图1比较了块分配和范围分配。我们可以看到,在块分配的文件中每个逻辑块都需要有一个块地址号,导致每个文件有许多的元数据。在范围分配方法中,每个接连的数据块范围只需有起始块号和长度就够了。所以包含有一些大范围块的文件只有少量的元数据。
范围分配的文件系统为顺序文件访问提供了更好的性能,因为他的顺序分配策略以及块聚集为更大的写。然而,对于正在用来作随机I/O的文件系统,范围文件系统的长处往往得不到发体现。
举个例子,如果我们想要通过一个基于范围的文件进行顺序读,只需读取起始块号和长度;然后可以继续读取此范围内的所有数据,这意味着在顺序读时只有很小的元数据读开销。相反,如果要以随机方法来读,就要先查询我们想要的每个数据块的块地址,这相当于必须要处理一个基于块的文件系统。
元数据日志
最常见的文件系统日志形式是元数据日志。文件系统要对它磁盘上的结构作改动时,使用几个无连接的同步写来完成这些操作。如果期间发生断电或其它故障,则文件系统的状态未知,必须对整个文件系统作一致性检查。
举个例子,如果在一个文件末尾加上一个块(block),就需要对告诉文件系统文件的每一块的位置信息的磁盘位图进行读、修改和重写,然后才能写入这个数据块。故障发生时,必须在系统引导时检查文件系统,文件系统不知道这个块的位图是否正确,也不知道崩溃期间哪个文件发生的改动。这种状态意味着要扫描整个文件系统,经常要花费几分钟,甚至几小时。
元数据日志文件系统在磁盘上有一个循环的只附加的日志域,可以用来记录每次磁盘事务的状态。任何磁盘结构改动前都要写一个目的改变(intent-to-change)记录到日志。然后才改变目录结构,完成后,此日志条目被标记为完成。由于文件系统的所有改动都记录在日志中,我们就可以通过查看日志来检查文件系统的一致性,而不必扫描整个文件系统。在挂载时,如果找到一个目的改变条目,而且它没有标记为完成,则检查那个块对应的文件结构,并在需要是进行调整。
块(block)分配
传统的Unix文件系统使用块分配机制,例如UFS,并且提供一个灵活有效的块分配策略(policy)。磁盘块在被使用时分配,就是说只为文件分配一个最小的文件系统块数,以保存存储空间。
当文件扩展时,从一个空闲块位图中分配块,所以有时块是随机分配的。随机分配会导致过多的磁盘搜寻,随后从文件系统读数据会导致磁盘机制搜寻文件扩展期间所分配的所有随机块位置。随机块分配可以通过块分配策略的优化来避免,它试图分配连续序列的块。
更小的块分配获得大的连续分配,大量减少了磁盘搜寻。然而,连续的文件系统块分配最终导致了文件系统中的文件块碎片,结果文件系统访问最终又会回到随机的本质。
块分配方案也要保存文件扩展时每个被分配的新块的位置信息,以及文件是否是每次一块的扩展。额外的磁盘I/O被要求读写文件系统块结构信息。文件系统块结构信息成为元数据(metadata)。文件系统元数据总是同步写入存储设备,所以对一个文件大小的改变需要等待每个元数据操作完成。因此,元数据操作极大降低了文件系统的整体性能。
范围(extent)分配
基于范围的文件系统每次按一大群来分配磁盘块,因此要强制进行顺序分配。一个文件被写入时,大量块在文件创建时被分配给文件;然后,可以进行大群或簇顺序块的写入。文件系统元数据在文件首次创建是写入;在块的第一个分配范围内的写不要求额外的元数据写,直到被分配下一个范围。
这种方法优化了磁盘搜寻方式,到簇的群化块写入允许文件系统提交对存储设备的更大的物理磁盘写入,节省了许多小SCSI转换的开销。图1比较了块分配和范围分配。我们可以看到,在块分配的文件中每个逻辑块都需要有一个块地址号,导致每个文件有许多的元数据。在范围分配方法中,每个接连的数据块范围只需有起始块号和长度就够了。所以包含有一些大范围块的文件只有少量的元数据。
范围分配的文件系统为顺序文件访问提供了更好的性能,因为他的顺序分配策略以及块聚集为更大的写。然而,对于正在用来作随机I/O的文件系统,范围文件系统的长处往往得不到发体现。
举个例子,如果我们想要通过一个基于范围的文件进行顺序读,只需读取起始块号和长度;然后可以继续读取此范围内的所有数据,这意味着在顺序读时只有很小的元数据读开销。相反,如果要以随机方法来读,就要先查询我们想要的每个数据块的块地址,这相当于必须要处理一个基于块的文件系统。
元数据日志
最常见的文件系统日志形式是元数据日志。文件系统要对它磁盘上的结构作改动时,使用几个无连接的同步写来完成这些操作。如果期间发生断电或其它故障,则文件系统的状态未知,必须对整个文件系统作一致性检查。
举个例子,如果在一个文件末尾加上一个块(block),就需要对告诉文件系统文件的每一块的位置信息的磁盘位图进行读、修改和重写,然后才能写入这个数据块。故障发生时,必须在系统引导时检查文件系统,文件系统不知道这个块的位图是否正确,也不知道崩溃期间哪个文件发生的改动。这种状态意味着要扫描整个文件系统,经常要花费几分钟,甚至几小时。
元数据日志文件系统在磁盘上有一个循环的只附加的日志域,可以用来记录每次磁盘事务的状态。任何磁盘结构改动前都要写一个目的改变(intent-to-change)记录到日志。然后才改变目录结构,完成后,此日志条目被标记为完成。由于文件系统的所有改动都记录在日志中,我们就可以通过查看日志来检查文件系统的一致性,而不必扫描整个文件系统。在挂载时,如果找到一个目的改变条目,而且它没有标记为完成,则检查那个块对应的文件结构,并在需要是进行调整。
顶(0)
踩(0)
上一篇:Linux信号简介
下一篇:Linux崩溃恢复工具介绍
- 最新评论