Linux文件系统

  • Linux文件系统
    • 虚拟文件系统
    • 日志
    • Ext2
    • Ext3
    • ReiserFS
    • 日志文件系统
    • XFS
      Linux作为开源操作系统,最大的优势是它可以支持各类文件系统。现代的Linux内核能够支持几乎每种文件系统,从基础的FAT到高性能的日志文件系统(JFS)都能可以。然而,由于Ext2、Ext3和ReiserFS是原生的Linux文件系统,被大多数Linux发行版(ReiserFS只受Novell Suse Linux商业支持)支持,所以,我们将重点学习它们,同时也会大概的介绍一下其它特别常用的Linux文件系统。要了解更多文件系统和磁盘子系统的内容,可以参考4.6 “磁盘子系统优化”

1.3.1 虚拟文件系统

虚拟文件系统(VFS)是一个处于用户进程和各类文件系统之间的抽象接口层,VFS提供访问文件系统对象的通用对象模型(例如,i-node、文件对象、页缓存、)和方法,它对用户进程隐藏了各种文件系统的差别。正是因为有VFS,所以用户进程不用关心使用的是那种文件系统,也更不需要知道各个文件系统应该使用哪个系统调用。下图显示了VFS的概况。vfs概念

日志

在非日志文件系统上,当执行写操作时,内核先修改文件系统的元数据,然后写入实际的用户数据。这个操作可能会丢失数据的完整性。如果在写入文件系统元数据的时候系统突然崩溃,文件系统的一致性就可能被破坏。fsck会在下次启动时检查所有的元数据,并修复文件系统上的不一致,但是如果卷特别大的时候,这个修复过程就会变得很漫长,只能干等着fsck工作完之后才能使用这系统。日志文件系统解决了这个问题,在写入实际的文件系统之前,他先把要修改的数据写入一个叫做日志区域(journal area)的地方。日志区域可以在文件系统上,也可以不在文件系统上。写入日志区域的数据叫做日志记录(joutnal log)。如果系统支持的话,它内容包括文件系统元数据和真正的文件数据。因为在写入真正用户数据之前要写记录日志,和非日志文件系统相比会产生性能开销。维护数据高度一致性所牺牲的性能开销大小,取决于在写入用户数据之前要写入多少信息到磁盘上。后面的1.3.4中Ext3一节中会讨论这个问题。记录的概念

Ext2

Ext2文件系统是Ext3的前身。和大多数现代文件系统不一样,Ext2是一个简单和快速的文件系统,没有日志功能。下图展示了Ext2的文件系统数据结构,文件系统由一个引导扇区(boot sector)开始,后面跟着块组(block groups)。整个文件系统被分成许多小块组来获得高性能,因为i-node表和保存用户数据的数据块驻留在较前的磁盘,所以节约寻址时间。一个块组包含如下项目:

  1. + 超级块(Super block 磁盘上信息存放在这里,超级块的副本保存在每个块组的顶部。
  2. + 块组描述符(Block group descriptor 块组的信息存在这里
  3. + 数据块位图(Data block bitmaps 空闲块管理
  4. + i-node位图(i-node bitmaps 空闲i-node管理
  5. + i-node表(i-node tables 存放i-node表。每个文件都有相应的i-node表,存放文件的元数据,譬如文件模式、uidgidatimectimemtimedtime和数据块的指针。
  6. + 数据块(Data blocks 存放真正的用户数据。

ext2文件系统数据结构为了找到组成文件的数据块,内核首先搜索文件的i-node。在接到进程打开/var/log/messages文件的请求时,内核分析文件路径,然后搜索/(根目录)的条目,其中包含了它自己目录下的文件和目录信息。这时候,内核会找到/var目录的i-node,然后再来看看/var目录,它也有它自己目录下的文件和目录的信息。内核会一直执行上面的过程,直到找到/var/log/messages文件的i-node。Linux内核使用对象缓存,比如目录条目缓存或者i-node缓存来加速寻找i-node的过程。

一旦内核找到了文件的i-node,然后就试着访问真正的用户数据块。如前面解释的那样,i-node有数据块的指针。参照它,内核就能获得数据块了。对于大文件来说,Ext2提供到数据块的直接/非直接参照。下图展示了它是如何工作的。Ext2文件系统到数据块的直接和非直接参照不同的文件系统其文件系统结构和文件访问操作也不一样。所以,各个文件系统都有其特色。

Ext3

现在,Linux的企业发行版都已经支持Ext3(Extended 3)文件系统,它是被广泛使用的Ext2的更新版本。Ext3和Ext2的基本结构是相似的,主要区别是Ext3支持日志。Ext3有如下亮点:

  • 可用性: Ext3采用一致性的方式把数据写入磁盘,所以,当系统出现意外宕机(断电或者系统崩溃),服务器再次启动时不用检查数据的一致性。可以把系统恢复时间从几小时缩短到几秒钟!
  • 数据完整性: 在mount命令中使用data=journal打开日志记录模式,所有的数据,包括文件和元数据都会记录日志!
  • 速度: 通过指定日志模式data=writeback,你可以在你的业务场景下,在速度和完整性之间做权衡。在有大量同步写的时候,这个效果会十分显著。
  • 灵活性: 把现有的Ext2很简单就能升级到Ext3,而且不用重新格式化。通过执行tune2fs命令和修改/etc/fstab文件,你能够很简单的把Ext2升级到Ext3文件系统!同样,在关掉Ext3日志的情况下,Ext3能够作为Ext2文件系统进行挂载。很多第三方工具都能修改Ext3的文件系统!例如,PartionMagic能够修正Ext3分区。
    日志模式

Ext3支持3种日志模式。

  • 日志(journal) 通过记录文件数据和元数据,这个模式提供了最高的数据一致性。它的性能消耗也是最大的。
  • 有序(ordered) 该模式下只记录元数据。然而,优先保证写入文件数据!
  • 回写(writeback) 这个日志选项提供最快的数据访问能力,但是牺牲了数据的一致性!保证数据一致性的元数据也会被记录,但是没有处理确定的文件数据,在系统崩溃的时候,这可能导致旧的数据出现在文件中。

ReiserFS

ReiserFS是一个快速的日志文件系统,具备优化磁盘空间利用率和快速的崩溃恢复功能!在Novell的帮助下,ReiserFS已经变得十分好用。ReiserFS只在Novell SUSE Linux上享受商业支持!

日志文件系统

日志文件系统(Journal File System,JFS)是一个全64位文件系统,能支持超大文件和分区。JFS起初由IBM为AIX开发,现在已经在GPL许可证下发布。在高性能计算(high performance computing,HPC)和数据库这类需要支持超大分区和文件大小的情况下,JFS是一个理想的文件系统。如果想进一步了解JFS,参考http://jfs.sourceforge.net

在 Novell SUSE Linux Enterprise Server 10上,JFS不再作为新的文件系统支持!

XFS

扩展文件系统(eXtended File System,XFS)是一个起初由硅图形公司(Silicon Graphics Incorporated)为他们的IRIX系列系统开发高性能日志文件系统。它和IBM的JFS的特点较为相识,也支持超大文件和分区。而且,使用场景也很相似。

原文: https://lihz1990.gitbooks.io/transoflptg/content/01.理解Linux操作系统/1.3.Linux文件系统.html