Fantacity

Stand Alone Complex

Linux 文件系统

Linux支持多种类型的文件系统来管理文件和目录。每种文件系统都在存储设备上实现了虚拟目录结构,只是特性略有不同。

基本的Linux文件系统

最早,Linux系统用的是模仿Unix文件系统功能的一个简单文件系统。

1.ext文件系统
Linux操作系统中引入的最早的文件系统叫做扩展文件系统(extended filesystem, 简记ext)。它为Linux提供了一个基本的类Unix文件系统:使用虚拟目录来操作硬件设备,在物理设备上按定长的快来存储数据。
ext文件系统采用称为索引节点的系统来存放虚拟目录中所存储文件的信息。索引节点系统在每个物理设备中创建一个单独的表(称为索引节点表)来存储这些文件的信息。存储在虚拟目录中的每一个文件在索引节点表中都有一个条目。条目名称的扩展部分来自其跟踪每个文件的额外数据,包括:

  • 文件名
  • 文件大小
  • 文件的属主
  • 文件的属组
  • 文件的访问权限
  • 指向存有文件数据的每个硬盘块的指针

Linux通过唯一的数值(称作索引节点号)来引用索引节点表中的每个索引节点,这个值是创建文件时由文件系统分配的。文件系统通过索引节点号而不是文件全名及路径来标识文件。

缺点:文件大小不得超过2GB等。

2. ext2文件系统
在Linux出现后不久,ext文件系统就升级到了第二扩展文件系统,称作ext2。
ext2文件系统是ext文件系统基本功能的一个扩展,但维护着同样的结构。ext2文件系统扩展了索引节点表的格式来保存系统上每个文件的更多信息。

扩展内容包括:ext2的索引节点表为文件添加了创建时间值、修改时间值和最后访问时间值来帮助系统管理员追踪文件的访问情况。ext2文件系统还将允许的最大文件大小增加到了2TB(在ext2的后期版本中,增加到了32TB),以容纳数据库服务器中常见的大文件。
除了扩展索引节点表外,ext2文件系统还改变了文件在数据块中存储的方式。ext文件系统常见的问题是在文件写入到物理设备时,存储数据用的块很容易就分散在这个设备上(称作碎片化,fragmentation)。数据块的碎片化会降低文件系统的性能,因为需要更长的时间查找存储设备来访问特定文件的所有块。
保存文件时,ext2文件系统通过按组分配磁盘快来减轻碎片化。通过将数据块分组,文件系统不需要为了数据块查找整个物理设备来读取文件。

致命缺点:文件系统每次存储或更新文件,它都要用新信息来更新索引节点表,但它并不是连成一气的。如果在存储文件和更新索引节点表的过程中,计算机系统发生了什么故障,二者就不同步了。

总结:ext2在索引节点表项,最大文件大小,数据块存储方式这3大方面扩展了ext文件系统。缺点为文件系统会因为索引节点表和文件数据更新不同步而损坏(系统崩溃或断电时)。

日志文件系统

日志文件系统取代了之前先将数据直接写入存储设备再更新索引节点表的做法,改为先将文件的更改写入到临时文件(称作日志,journal)中,然后在数据成功写到存储设备和索引节点表之后,再删除对应的日志条目。
如果系统在数据被写入到存储设备之前崩溃了或者断电了,日志文件系统下次会读取日志文件并处理上次留下的未写入的数据。
Linux中有3种不同的广泛使用的日志方法,每个都有不同等级的保护,如下表所示。

方 法 描述
数据模式 索引节点和文件都会被写入日志;丢失数据风险低,但性能差
排序模式 只有索引节点数据会被写入日志:但只有数据成功写入后才删除:性能和安全之间的良好折中
回写模式 只有索引节点数据会被写入日志:但不管文件数据何时写入;丢失数据风险高,但仍比不用日志好

数据模式日志方式是目前为止最安全的保护数据的方法,但它同时也是最慢的。所有写到存储设备上的数据都必须写两次:第一次写到日志,第二次写到真正的存储设备上。这样会导致性能很差,尤其是对要做大量数据写入的系统。

扩展的Linux日志文件系统

1. ext3文件系统
2001年,ext3文件系统加到了Linux内核中,它采用和ext2文件系统相同的索引节点表结构,但给每个存储设备增加了一个日志文件来将准备写入存储设备的数据先写进日志文件。
默认情况下,ext3文件系统用排序模式的日志功能——只将索引节点信息写入日志文件,直到数据块都被成功写入存储设备才删除。

缺点:虽然ext3文件系统为Linux文件系统添加了基本的日志功能,但它仍然缺一些东西。例如ext3文件系统无法恢复误删的文件,它没有任何内建的数据压缩功能(虽然有个需单独安装的补丁支持这个功能),ext3文件系统也不支持加密文件。

2. ext4文件系统
ext4文件系统在2008年时被Linux内核官方支持,现在已是大多数流行的Linux发行版采用的默认文件系统,比如Fedora和Ubuntu。
除了支持数据压缩和加密,ext4文件系统还支持一个称作区段(extent)的特性。区段在存储设备上按块分配空间,但索引节点表中只保存起始块的位置。由于无需列出所有用来存储文件中数据的数据快,它可以在索引节点表中节省一些空间。
ext4还整合了块预分配(block preallocation)。如果你想在存储设备上给一个你知道要变大的文件预留空间,通过ext4文件系统你可以为文件分配所期望的块,不只是物理上存在的块。ext4文件系统用0填满预留的数据快,并知道不要将它们分配给其他文件。

3. Reiser文件系统
2001年,Hans Reiser为Linux创建了第一个日志文件,成为ReiserFS。ReiserFS文件系统只支持回写日志模式——只把索引节点表数据写到日志文件。ReiserFS文件系统是Linux上最快的日志文件系统之一
整合进ReiserFS文件系统的两个有意思的特性是:你可以在线调整已有文件系统的大小;它还采用了一项称作尾部压缩(tail packing)的技术,该技术能将一个文件的数据填进另一个文件的数据块中的空白空间。如果你必须为已有文件系统扩容来容纳更多的数据,在线调整文件系统大小功能非常好用。

4. JFS文件系统
作为可能依然在用的最老的日志文件系统之一,JFS(journaled File System, 日志文件系统)是IBM在1990年为它的Unix衍生版——AIX开发的。然而,直到第2版它才被移植到Linux环境中。
JFS文件系统采用顺序日志方法,即只在日志中保存索引节点表数据,直到真正的文件数据被写进存储设备时才删除它。
JFS文件系统采用基于区段的文件分配,即为每个写入存储设备的分配一组块。这个过方法可以减少存储设备上的碎片。

5. XFS文件系统
XFS日志文件系统是另一个文件系统,最初是为一个商业Unix开发的,现在正在逐渐走进Linux世界。硅图公司(SGI)最早在1994年为它的IRIX Unix系统开发了XFS。在2002年,为了共用,它被发布到了Linux环境。
XFS文件系统采用回写模式的日志,它提供了很好的性能但也引入了相当大的风险,因为真是数据依然未存进日志文件。XFS文件系统还允许在线调整文件系统大小,类似由于ReiserFS文件系统,除了XFS文件系统只可扩大不能缩小。