常用的文件系统简介

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

FAT 文件系统

FAT 文件系统起源于二十世纪七十年代,当时用于 DOS 系统。当时的设计比较简单,后来由于存储媒介的发展渐渐有一些增强的版本出现。
所以现在主要包含这这几个版本:FAT8,FAT12,FAT16,FAT32。
这几个版本后面带的数字是啥意思呢?其实就是「簇」的编码地址所占用的宽度。例如,FAT12的意思是簇的编址采用12bit宽度的数,所以这种文件系统最多只能寻址 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+。

分享到