当前位置:Linux教程 - Linux - LINUX文件系统介绍

LINUX文件系统介绍

文件系统的作用就是在应用概念的文件和存储设备之间提供一个中间层,以使多个文件驻留在一个存储设备上,由文件系统来管理所有文件的存储。文件系统将每个存储设备化为一系列目录,每个目录含有若干文件。

块(block)分配
传统的Unix文件系统使用块分配机制,例如UFS,并且提供一个灵活有效的块分配策略(policy)。磁盘块在被使用时分配,就是说只为文件分配一个最小的文件系统块数,以保存存储空间。
当文件扩展时,从一个空闲块位图中分配块,所以有时块是随机分配的。随机分配会导致过多的磁盘搜寻,随后从文件系统读数据会导致磁盘机制搜寻文件扩展期间所分配的所有随机块位置。随机块分配可以通过块分配策略的优化来避免,它试图分配连续序列的块。
更小的块分配获得大的连续分配,大量减少了磁盘搜寻。然而,连续的文件系统块分配最终导致了文件系统中的文件块碎片,结果文件系统访问最终又会回到随机的本质。
块分配方案也要保存文件扩展时每个被分配的新块的位置信息,以及文件是否是每次一块的扩展。额外的磁盘I/O被要求读写文件系统块结构信息。文件系统块结构信息成为元数据(metadata)。文件系统元数据总是同步写入存储设备,所以对一个文件大小的改变需要等待每个元数据操作完成。因此,元数据操作极大降低了文件系统的整体性能。

范围(extent)分配
基于范围的文件系统每次按一大群来分配磁盘块,因此要强制进行顺序分配。一个文件被写入时,大量块在文件创建时被分配给文件;然后,可以进行大群或簇顺序块的写入。文件系统元数据在文件首次创建是写入;在块的第一个分配范围内的写不要求额外的元数据写,直到被分配下一个范围。
这种方法优化了磁盘搜寻方式,到簇的群化块写入允许文件系统提交对存储设备的更大的物理磁盘写入,节省了许多小SCSI转换的开销。图1比较了块分配和范围分配。我们可以看到,在块分配的文件中每个逻辑块都需要有一个块地址号,导致每个文件有许多的元数据。在范围分配方法中,每个接连的数据块范围只需有起始块号和长度就够了。所以包含有一些大范围块的文件只有少量的元数据。

范围分配的文件系统为顺序文件访问提供了更好的性能,因为他的顺序分配策略以及块聚集为更大的写。然而,对于正在用来作随机I/O的文件系统,范围文件系统的长处往往得不到发体现。
举个例子,如果我们想要通过一个基于范围的文件进行顺序读,只需读取起始块号和长度;然后可以继续读取此范围内的所有数据,这意味着在顺序读时只有很小的元数据读开销。相反,如果要以随机方法来读,就要先查询我们想要的每个数据块的块地址,这相当于必须要处理一个基于块的文件系统。

元数据日志
最常见的文件系统日志形式是元数据日志。文件系统要对它磁盘上的结构作改动时,使用几个无连接的同步写来完成这些操作。如果期间发生断电或其它故障,则文件系统的状态未知,必须对整个文件系统作一致性检查。
举个例子,如果在一个文件末尾加上一个块(block),就需要对告诉文件系统文件的每一块的位置信息的磁盘位图进行读、修改和重写,然后才能写入这个数据块。故障发生时,必须在系统引导时检查文件系统,文件系统不知道这个块的位图是否正确,也不知道崩溃期间哪个文件发生的改动。这种状态意味着要扫描整个文件系统,经常要花费几分钟,甚至几小时。
元数据日志文件系统在磁盘上有一个循环的只附加的日志域,可以用来记录每次磁盘事务的状态。任何磁盘结构改动前都要写一个目的改变(intent-to-change)记录到日志。然后才改变目录结构,完成后,此日志条目被标记为完成。由于文件系统的所有改动都记录在日志中,我们就可以通过查看日志来检查文件系统的一致性,而不必扫描整个文件系统。在挂载时,如果找到一个目的改变条目,而且它没有标记为完成,则检查那个块对应的文件结构,并在需要是进行调整。

这种日志方法已经在几个文件系统上成功实现,并成为SolarisUFS文件系统日志的基础。它为UFS在磁盘上保存文件系统结构,并且可以随时启动或禁止而无需改变磁盘上的数据。Veritas VxFS文件系统也使用元数据日志。
有一些文件系统将日志嵌在文件系统数据的相同分区内,还有一些文件系统则允许日志独立于文件系统。Solaris DiskSuite中非绑定的UFS日志允许日志和数据隔离开;Solaris 7中绑定的UFS日志则不。Veritas则只在你购买了Verista Accelerator选装件时才能将日志单独放置。

数据和元数据日志
一些文件系统提供了一个选项以使文件数据和元数据都记录进日志。这种方法对小的同步写尤其有用,它会为每个应用write申请对磁盘不同部分的两个或更多的写(一个写数据,一个写日志)。通过将数据记入日志,可以避免二次搜寻和写入。数据首先写入日志,然后再放入文件系统。这种技术所作工作有两个:确保数据完整性直到(但不包括)最后的块写入,,同时帮助提高小的同步写的性能。Veritas VxFS文件系统有一个选装件来对数据和元数据都记日志。

日志结构的文件系统
传统的文件系统是按块分配的,设备块分配自一个空闲块位图。另一种替代的文件系统形式是日志结构的文件系统,它将整个文件系统作为一个日志来实现。日志结构的文件系统在每次块被写到一个文件时将数据块加到日志的末尾,进行时将以前写的块置为无效。这种方法允许每个文件被顺序写入;不管写的块顺序,因此提供了更快的写速度。
日志结构的文件系统用降低读性能的代价换来很高的写性能,同时也增加了复杂性。读性能性能经常由于块按照写时的顺序分配而变得更慢,因为这样可能会使文件以随机顺序在磁盘中分散放置。由于要增加一个单独的垃圾收集或清除程序来扫描文件系统、移除无效块,所以会增加复杂性。然而,需要一个复杂的缓存/查询机制来支持高效的查询,因为块是以随机顺序分配的,并且每个文件的块位置信息必须保存起来。
日志结构的文件系统在元数据密集环境中证明是高效的,但是还要被证明对数据密集的工作量更有效。注意日志结构的文件系统和文件系统日志的不同是重要的。日志结构的文件系统也叫做“随机写文件系统结构”(WAFL)。
Solaris目前没有日志结构的文件系统。

扩大和缩小文件系统
对在线存储管理的一个普通要求是有增大和缩小文件系统的能力。早期的文件系统不支持这种能力,因为那时的磁盘大小是固定的。如今通过卷管理可得到虚拟磁盘,因此可以改变底层设备的大小。如果不能使文件系统的大小扩大,就需要备份文件系统,再次用mkfs/newfs构造文件系统,然后恢复所有的文件系统数据。能够在线扩张大小的文件系统则无须进行这些步骤。Soalris UFS文件系统可以用mkfs 命令进行扩展,对挂载的文件系统要用 –M 选项,对未挂载的文件系统要使用 –G 选项。
我们有时不单要扩大文件系统,还可能需要缩小文件系统。比如,从一个设备收取一些空间分配给另一设备,就需要首先缩减这个文件系统,以便从这个正在被缩减的文件系统尾端移出一些被分配的文件块。

文件系统 扩大 缩小
基本的UFS Yes,使用mkfs -M No
VxFS Yes,使用fsadm Yes,使用fsadm
QFS Yes,使用growqfs No

参考书目:
1.Linux操作系统内核分析 陈莉君 编著 人民邮电出版社
2.Linux系统分析与高级编程技术 周巍松 等编著 机械工业出版社