Unix/Linux编程:文件系统

文件系统

文件系统是对常规文件和目录的组织集合。用于创建文件系统的命令是 mkfs。

Linux 的强项之一便是支持种类繁多的文件系统,如下所示。

  • 传统的 ext2 文件系统。
  • 各种原生(native)UNIX 文件系统,比如,Minix、System V 以及 BSD 文件系统
  • 微软的 FAT、FAT32 以及 NTFS 文件系统
  • ISO 9660 CD-ROM 文件系统。
  • Apple Macintosh 的 HFS
  • 一系列网络文件系统,包括广为使用的 SUN NFS(Linux 对 NFS 的实现信息请参见
    http://nfs.sourceforge.net/)、IBM 和微软的 SMB、Novell NCP 以及 Carnegie Mellon 大学开发的 Coda 文件系统
  • 一系列日志文件系统,包括 ext3、ext4、Reiserfs、JFS、XFS 以及 Btrfs。

从 Linux 的专有文件/proc/filesystems 中可以查看当前为内核所知的文件系统类型。

Linux 2.6.14 中,添加了 FUSE(用户空间文件系统)工具。采用这一机制,可为内核添加挂钩(hook),以便以用户空间程序来完整实现文件系统,而无需对内核进行修补或重新编译。详细信息请见 http://fuse.sourceforge.net/

文件系统结构

文件系统是对磁盘的一个多层次的抽象

在文件系统中,用来分配空间的基本单位是逻辑块,亦即文件系统所在磁盘设备上若干连续的物理块。例如,在 ext2 文件系统上,逻辑块的大小为 1024、2048 或 4096 字节。(使用mkfs(8)命令创建文件系统时,可指定逻辑块的大小作为命令行参数。

下图所示为磁盘分区和文件系统之间的关系,以及一般文件系统的组成
在这里插入图片描述
文件系统由以下几部分组成。

  • 引导块:
    • 总是作为文件系统的首块。
    • 引导块不为文件系统所用,只是包含用来引导操作系统的信息。
    • 操作系统虽然只需一个引导块,但所有文件系统都设有引导块(其中的绝大多数都未使用)
  • 超级块:
    • 存放文件系统本身的结构信息,其中包括: i 节点表容量;每个区块的大小;未被使用的磁盘块的信息等
    • 驻留于同一物理设备上的不同文件系统,其类型、大小以及参数设置(比如,块大小)都可以有所不同。这也是将一块磁盘划分为多个分区的原因之一
  • i 节点表:
    • 每个文件都有一些属性,比如大小、文件所有者和最近修改时间等。这些性质被记录在一个叫做i-节点的结构中。
    • 所有的i-节点都有相关的大小,并且i-节点表是这些结构的一个列表
    • 文件系统中的每个文件或目录在该表中都有一个i节点
    • 表中的每个i-节点都通过位置来标识。比如,标识为2的i-节点(inode 2)位于文件系统i-节点表中的第三个位置
  • 数据块:
    • 文件的内容就保存在这个区域

磁盘上所有块大小都是一样的,如果文件包含了超过一个块的内容,那么文件内容就会存放在多个磁盘块中。

i节点

针对驻留于文件系统上的每个文件,文件系统的 i 节点表会包含一个 i 节点(索引节点的简称)。对 i 节点的标识,采用的是 i 节点表中的顺续位置,以数字表示。文件的 i 节点号(或简称为 i 号)是 ls –li 命令所显示的第一列。i 节点所维护的信息如下所示

  • 文件类型(比如,常规文件、目录、符号链接,以及字符设备等)
  • 文件属主(亦称用户 ID 或 UID)
  • 文件属组(亦称为组 ID 或 GID)
  • 3 类用户的访问权限:属主(有时也称为用户)、属组以及其他用户(属主和属组用户之外的用户)
  • 3 个时间戳:对文件的最后访问时间(ls –lu 所显示的时间)、对文件的最后修改时间(也是 ls –l 所默认显示的时间),以及文件状态的最后改变时间(ls –lc 所显示的最后改变 i 节点信息的时间)。值得注意的是,与其他 UNIX 实现一样,大多数 Linux 文件系统不会记录文件的创建时间
  • 指向文件的硬链接数量
  • 文件的大小,以字节为单位。
  • 实际分配给文件的块数量,以 512 字节块为单位。这一数字可能不会简单等同于文件的字节大小,因为考虑文件中包含空洞的情形,分配给文件的块数可能会低于根据文件正常大小(以字节为单位)所计算出的块数
  • 指向文件数据块的指针

Unix文件系统的内部结构比较简单,仅仅是一些相互链接的数据结构。节点被称为i-节点,指针的集合被称为目录,叶子节点被称为链接。

虚拟文件系统(VFS)

Linux 所支持的各种文件系统,其实现细节均不相同。举例来说,这些差异包括文件块的分配方式,以及目录的组织方式。如果每个与文件打交道的程序都需要理解各种文件系统的具体细节,那么编写与各类文件系统交互的程序将近乎于不可能完成的任务。虚拟文件系统(VFS,有时也称为虚拟文件交换)是一种内核特性,通过为文件系统操作创建抽象层来解决上述问题:
在这里插入图片描述

  • VFS针对文件系统定义了一套通用接口。所有与文件交互的程序都会按照这一接口来进程操作
  • 每种文件系统都会提供VFS接口的实现。

这样一来,程序只需要理解VFS接口,而无需过问具体文件系统的实现细节。

VFS 接口的操作与涉及文件系统和目录的所有常规系统调用相对应,这些系统调用有open()、read()、write()、lseek()、close()、truncate()、stat()、mount()、umount()、mmap()、mkdir()、link()、unlink()、symlink()以及 rename()。

VFS 的抽象层建模精确仿照传统的 UNIX 文件系统模型。当然,还有一些文件系统,尤其是非 UNIX 文件系统,并不支持所有的 VFS 操作。(比如,微软的 VFAT 就不支持使用 symlink()创建的符号链接概念。)对于这种情况,底层文件系统会将错误代码传回 VFS 层,表明不支持相应操作,而 VFS 随之会将错误代码传递给应用程序

日志文件系统

exit2文件系统是传统Unix文件系统的优秀典范,自然也受制于其短板:系统崩溃之后,为确保文件系统的完整性,重启时必须对文件系统的一致性进行检测(fcsk)。由于系统每次崩溃时,对文件的更新可能只完成了一部分,而文件系统元数据也将处于不一致状态,一旦这一问题得不到修复,那么文件系统就会遭到进一步破坏。如有可能,就必须进行修复,否则,将会丢弃那些无法获取的信息(可能会包含文件数据)

问题在于,一致性检查需要遍历整个文件系统。如果文件系统较小,只需几秒或几分钟便可完成。而在大型文件系统上,上述操作可能会历时数小时,这对于需要保持高可用性的系统来说(比如,网络服务器),情况就非常严重。

采用日志文件系统,则无需在系统崩溃后对文件进行漫长的一致性检查。在实际更新元数据之前,日志文件系统会将这些更新操作记录于专用的磁盘日志文件中。对元数据更新的记录是按照其相关性分组(以事务的方式记录)进行的。在事务处理过程中,一旦系统崩溃,系统重启时便可利用日志重做(redo)任何不完整的更新,同时为文件系统恢复一致性状态。(借用数据库的说法,日志文件系统能够确保总是将文件元数据事务作为一个完整单元来提交。)系统崩溃之后,即便是超大型的日志文件系统,通常也会在几秒之内复原,因而对于有高可用性需求的系统极具吸引力。

日志文件系统最为昭著的臭名在于增加了文件更新的时间,当然,良好的设计可以降低这方面的开销

某些日志文件系统只会确保文件元数据的一致性。由于不记录文件数据,因此一旦系
统崩溃,可能会造成数据丢失。ext3、ext4 和 Reiserfs 文件系统提供了记录数据更新的选项,但若记录的东西过多,则会降低文件 I/O 的性能

以下列出了 Linux 所支持的日志文件系统。

  • Reiserfs 是首个被集成进内核(版本号为 2.4.1)的日志文件系统。Reiserfs 提供了一种名为 tail packing (或 tail merging)的特性:可将小文件(以及较大文件的最后一片)与文件元数据装入相同的磁盘块。而许多系统都拥有(或由应用程序创建了)众多小文件,因此这会节省大量的磁盘空间。
  • ext3 文件系统,源于一个旨在以最小改动为 ext2 追加日志功能的项目。从 ext2 升级到 ext3 非常简单(无需备份和恢复操作),还支持反向降级。内核版本 2.4.15 集成了ext3。
  • JFS 由 IBM 开发,内核版本 2.4.20 对其进行了集成
  • XFS (http://oss.sgi.com/projects/xfs/)最初是由 SGI(Silicon Graphics)于 20 世纪 90 年代初期开发,所针对的是自己的私有 UNIX 实现:Irix。2001 年,XFS 被移植到了 Linux平台,并成为自由软件项目。2.4.24 内核对其进行了集成。
  • ext4 文件系统(http://ext4.wiki.kernel.org/)是 ext3 文件系统的“接班人”。Linux2.6.19将其首个实现并入,内核的后续版本中又陆续添加了各种特性。ext4 的规划(或已实现的)特性包括 extents(预留连续存储块)、旨在降低文件碎片化的其他分配特性、在线文件系统的磁盘碎片整理、更为快捷的文件系统检查以及对纳秒级时
    间戳的支持。
  • Btrfs(B-树 FS,一般读作“butter FS”,http://btrfs.wiki.kernel.org/)是一种自下而上进行设计的新型文件系统,意在提供一系列现代化特性,其中包括 extents、可写快照(等价于对元数据和数据的日志功能)、对数据和元数据的校验和、在线文件系统检查、在线文件系统的磁盘碎片整理、高效利用空间的小文件打包存放和可检索目录。内核版本 2.6.29 中集成了该文件系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值