常用的文件系统简介

Overview

overview

文件系统算是计算机软件中比较底层的一部分,可能很多程序员都不会直接接触到。
今天简单学习了一下,做个笔记。

FAT 文件系统

FAT 文件系统起源于二十世纪七十年代,最初用于 DOS 系统。早期设计比较简单,后来随着存储介质的发展,逐渐出现了一些增强版本。
所以现在主要包含这几个版本:FAT8、FAT12、FAT16、FAT32。
这些版本名后面的数字是什么意思呢?其实就是「簇」地址编码占用的位宽。例如,FAT12 的意思是簇编址采用 12 bit 宽度,因此这种文件系统最多只能寻址 2 ** 12 = 4096 个簇。其他 FAT 变种类似,就不赘述了。

这里需要注意:FAT 不是一种日志文件系统。至于「日志文件系统」,稍后会简单介绍一下。

NTFS 文件系统

NTFS(New Technology File System)是微软公司推出的、用于大型存储介质的 日志 文件系统,从 Windows 2000 左右的版本开始支持。
从技术角度看,NTFS 相对比较先进,主要特点如下:

  • 安全性高:NTFS 支持基于文件或目录的 ACL,并支持加密文件系统(EFS)。
  • 可恢复性:NTFS 支持基于原子事务概念的文件恢复,更符合服务器文件系统的要求。
  • 文件压缩:NTFS 支持基于文件或目录的文件压缩,可以更方便地节省磁盘空间。
  • 磁盘配额:NTFS 支持磁盘配额,可针对系统中每个用户分配磁盘资源。

日志文件系统

日志文件系统不是一种具体的文件系统,这里主要突出「日志」这两个字。
日志式文件系统起源于 Oracle、Sybase 等大型数据库。数据库操作往往由多个相关、相互依赖的子操作组成,任何一个子操作的失败都意味着整个操作的无效性,因此对数据库数据的任何修改都要恢复到操作以前的状态。Linux 日志式文件系统就是由此发展而来的。日志文件系统通过增加一个叫做日志的、新的数据结构来解决这个“fsck”问题。这个日志是位于磁盘上的结构:在对元数据做任何改变以前,文件系统驱动程序会向日志中写入一个条目,这个条目描述了它将要做些什么,所以日志文件具有可伸缩性和健壮性。在分区中保存日志记录文件的好处是:文件系统写操作首先会对记录文件进行操作;若整个写操作由于某种原因(如系统掉电)而中断,则在下次系统启动时就会读日志记录文件的内容,恢复未完成的写操作,这个过程一般只需要两三分钟。

我们可以看到,日志文件系统是大型数据库系统的基础。现在 Linux 上的文件系统基本上都是日志文件系统。

Ext

ext 是第一种专门为 Linux 开发的文件系统类型,叫做扩展文件系统。它于 1992 年 4 月完成,对 Linux 早期的发展产生了重要作用。但是,由于其在稳定性、速度和兼容性上存在许多缺陷,现在已经很少使用了。

Ext 不是一种日志文件系统,它不支持日志功能。

Ext2

ext2 是为解决 ext 文件系统的缺陷而设计的可扩展、高性能文件系统,又被称为二级扩展文件系统。ext2 于 1993 年发布,设计者是 Rey Card。它是 Linux 文件系统类型中使用最多的格式,并且在速度和 CPU 利用率上较为突出,是 GNU/Linux 系统中标准的文件系统。它存取文件的性能极好,对于中、小型文件更显示出优势,这主要得益于其簇快取层的优良设计。ext2 可以支持 256 字节的长文件名;其单一文件大小和文件系统本身的容量上限,与文件系统本身的簇大小有关。在常见的 Intel x86 兼容处理器系统中,簇最大为 4KB,单一文件大小上限为 2048GB,而文件系统的容量上限为 6384GB。尽管 Linux 可以支持种类繁多的文件系统,但是 2000 年以前几乎所有的 Linux 发行版都使用 ext2 作为默认的文件系统。

ext2 也有一些问题。由于它在设计时主要考虑的是文件系统性能,而在写入文件内容的同时,并没有写入文件的 meta-data(和文件有关的信息,例如权限、所有者及创建和访问时间)。换句话说,Linux 先写入文件内容,然后等到有空的时候才写入文件的 meta-data。如果出现文件内容写入完成后、但在写入 meta-data 之前系统突然断电,就可能造成文件系统处于不一致的状态。在一个有大量文件操作的系统中,出现这种情况会导致很严重的后果。另外,由于目前 Linux 的 2.4 内核所能使用的单一分割区最大只有 2048GB,尽管文件系统的容量上限为 6384G,但是实际上能使用的文件系统容量最多也只有 2048GB。

Ext2 也不是一种日志文件系统,它也不支持日志功能。

Ext3

ext3 是由开源社区开发的日志文件系统,早期主要开发人员是 Stephen Tweedie。ext3 被设计成 ext2 的升级版本,尽可能方便用户从 ext2 向 ext3 迁移。ext3 在 ext2 的基础上加入了记录元数据的日志功能,努力保持向前和向后的兼容性,也就是在保有目前 ext2 格式的前提下再加上日志功能。和 ext2 相比,ext3 提供了更佳的安全性,这就是数据日志和元数据日志之间的不同。ext3 是一种日志式文件系统,日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,如不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。因此,每当系统要关机时,必须将其所有的文件系统全部卸下后才能进行关机。如果在文件系统尚未卸下前就关机(如停电),那么重开机后就会造成文件系统的资料不一致,故这时必须做文件系统的重整工作,将不一致与错误的地方修复。然而,这个过程相当耗时,特别是容量大的文件系统,不能百分之百保证所有的资料都不会流失,在大型服务器上可能会出现问题。除了与 ext2 兼容之外,ext3 还通过共享 ext2 的元数据格式继承了 ext2 的其它优点。比如,ext3 用户可以使用一个稳固的 fsck 工具。由于 ext3 基于 ext2 的代码,所以它的磁盘格式和 ext2 相同,这意味着一个干净卸载的 ext3 文件系统可以作为 ext2 文件系统毫无问题地重新挂载。如果现在使用的是 ext2 文件系统,并且对数据安全性要求很高,这里建议考虑升级使用 ext3。

Ext4

第四扩展日志文件系统(fourth extended journaling file system,ext4fs)是由 ext3fs 演化而来。Ext4 文件系统被设计为具有向前和向后兼容性,但它具有许多新的高级特性(其中的一些特性破坏了兼容性)。这就意味着您可以将 ext4fs 的一部分作为 ext3fs 挂载,反之亦然。

首先,ext4fs 是 64 位文件系统,并被设计为可以支持很大的容量(1 exabyte)。它还可以使用分区,但是这样做将失去与 ext3fs 的兼容性。像 XFS 和 Reiser4 一样,ext4fs 还支持在必要时采取延时分配方式分配块(这样可以减少磁盘碎片)。日志的内容也已经执行过校验和(checksum)检查,使日志更加可靠。ext4fs 并没有采用标准的 B+ 或者 B* 树,取而代之的是 B 树的一种变体,叫做 H 树,它支持更大的子目录(ext3 的上限为 32KB)。

虽然延时分配的方法可以减少磁盘碎片,但时间久了,一个大的文件系统仍可能产生碎片。为解决这个问题,开发了在线磁盘碎片整理工具(e4defrag)。您可以使用这个工具来整理单个文件或者整个文件系统。

ext3fs 与 ext4fs 间的另一个有趣区别就在于文件的时间分辨率。在 ext3 中,时间戳的最小分辨率为 1 秒。而 Ext4fs 是面向未来的:那时处理器和接口的速度会持续加快,需要更高的分辨率。因此,ext4 中时间戳的最小分辨率为 1 纳秒。

Ext4 已经在 Linux 2.6 以后的版本中应用非常广泛了。

ZFS

ZFS 是一种比 Ext4 更先进的文件系统,是一种比日志文件系统更先进的「事务性文件系统」,起源于 Sun 公司的 Solaris 系统。主要有以下特点:

  • 引入「存储池」的概念,理论上没有存储容量限制。
  • 支持写时拷贝。
  • 支持事务性语义。
  • 支持校验和自我恢复。
  • 支持快照。

HFS

分层文件系统(Hierarchical File System,HFS)是一种由苹果计算机开发,并使用在 macOS 上的文件系统。最初被设计用于软盘和硬盘,同时也可以在只读媒体(如 CD-ROM)上见到。

HFS+

HFS+ 是一个 HFS 的改进版本,支持更大的文件,并用 Unicode 来命名文件或文件夹,代替了 Mac OS Roman 或其他一些字符集。和 HFS 一样,HFS+ 也使用 B 树来存储大部分分卷元数据。
尽管 HFS+ 比现有的先进文件系统(NTFS、ZFS)落后许多,但现在的 macOS 依然使用 HFS+。

Share