Ext3 和 ext4磁盘文件系统与扩展文件系统本文主要探讨如何使用 Linux 上的扩展文件系统家族。Linux 支持许多磁盘文件系统类型,比如 XFS、ReiserFS、B 树文件系统(B-tree file system,Btrfs)和 IBM 日志文件系统(Journaled File System 和 JFS)等。您可能会发现其中一个文件系统比扩展文件系统更适合,具体情况取决于您的环境和系统用途。但是了解扩展文件系统是一个不错的开端,因为大部分 Linux 发行版默认情况下都使用了 ext3 或 ext4。
Ext3 是较老的 ext2 的下一个演化版本,至今仍被广泛使用。相对于 ext2,它的一个主要优势是日志记录功能。Ext3 向后兼容 ext2,所以您无需重新分区即可将 ext2 安装转换为 ext3。使用具有根特权的帐户并键入 tune2fs -j 通常就可以完成此项工作。例如,如果 ext2 文件系统位于第一个硬盘的第二个分区,那么可以键入 tune2fs -j /dev/sda2 来转换它。
除了日志记录功能,ext3 还在 ext2 基础上进行了一些改进,比如更快的写入速度和健壮性。没有日志记录功能,在意外断电或系统崩溃时,ext2 会遇到不干净的系统关闭。完成引导之后,必须检查每个 ext2 系统之后才能挂载它们。对于如今的大型文件系统,一致性检查所花的时间在许多环境中都是让人无法接受的,因为它严重限制了可用性。如果使用日志记录功能(NTFS 文件系统具有日志记录功能),则会将写入到磁盘的数据标记为完整或不完整数据。如果发生不干净的系统关闭,那么只会检查标记为不完整的文件,这样就消除了检查整个文件系统的需要。使用 ext3,您可以选择以下 3 种日志模式之一:
- 日志。执行完整数据日志记录。所有数据(不仅仅是元数据)会首先写入到日志(最慢的模式)。
- 顺序。在技术上讲,只记录元数据,但可通过首先写入到数据块来帮助解决写回出错问题。
- 写回。没有数据记录功能,仅记录元数据(最快的模式)。
Ext4 是扩展文件系统目前的演化版本,它向后兼容 ext2 和 ext3。Ext4 主要在 ext3 的基础之上改进了健壮性和速度。Ext4 自 Linux 内核版本 2.6.28 推出时就是可用的。
表 1 给出了最流行的 Linux 文件系统的一些主要特征。如果计划设计分区模式或转换现有分区,理解这些特征会有所帮助。
表 1. 扩展文件系统的演化文件系统
扩展文件系统(约 1991 年推出)最早的 Linux 文件系统,会产生大量碎片Ext2(约 1993 年推出)非常健壮,但没有日志记录功能;在系统崩溃或意外关闭后,会在整个文件系统上运行 fsckExt3(约 2001 年推出)可包含最多 32,000 个子目录;引入了日志记录功能;向后兼容 ext2 Ext4(约 2008 年推出)可包含最多 64,000 个子目录;在现有的 ext3 上进行了改进,可以选择完全关闭日志;向后兼容 ext3 和 ext2
理解数据的存储方式Linux 文件系统存储两种类型的数据。一种是用户数据,这是用户(包括您自己)使用的正常文件和目录。文件可能具有 4 种类型:常规文件、链接、FIFO(即管道)和套接字。
您可能听说过 “Linux 中一切都是文件或进程。” 这句话道出了 Linux 中没有注册表概念的事实。相反,所有内容都存储在一种文件类型中。文件系统存储的另一种数据类型为元数据,这是索引节点,通常称为 inode。inode 是 Linux 对文件属性建立索引的方式。每个文件有一个 inode,这些 inode 通常包含有关文件的信息,比如:
标准用户帐户和根特权命令对于本文中的清单,需要注意的是,每个命令都以 $ 或 # 开头。在 Linux shell 中,这些符号具有特殊的含义。shell 提示符下的 $ 符号表明用户具有标准帐户特权,而 # 表示根用户(管理员)特权。当执行清单中具有 # 的命令时,需要使用 sudo 访问特权或直接访问根用户帐户来执行该命令。
- 文件大小
- 用户和组所有者
- 文件权限
- 硬链接和软链接数量
- 文件访问和修改时间
- 访问控制列表 (ACL) 信息
- 定义的任何其他文件属性,比如不可变性。
stat 命令可提供这些 inode 信息,如清单 1 所示。
清单 1. 使用 stat 命令1
2
3
4
5
6
7
8
| $ stat /etc/services
File: `/etc/services'
Size: 362031 Blocks: 728 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 1638437 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-12-19 00:01:25.000000000 -0600
Modify: 2006-02-23 07:09:23.000000000 -0600
Change: 2011-09-18 17:29:37.000000000 -0500
|
清单 1 在 /etc/services 文件上使用 stat 命令。所有 inode 信息和文件属性都以某种适用的格式提供。
目录当从 Linux 中的命令行工作时,会看到文件夹常常被称为目录。在 Windows 或 Linux 的图形用户界面 (GUI) 环境中,目录与文件夹具有相同的作用。但实际上,目录只是空文件,它们可对文件或者甚至其他目录进行分类。
所有目录都分类在一个分层结构中,根 (/) 目录位于分层结构的顶部。这实际上是一种逻辑分类,因为并不是所有目录都位于相同的分区或文件系统中。事实上,即使挂载一个网络文件系统,比如 NFS,挂载点也将位于分层结构中根目录下的某个位置。这是 Linux 与 Windows 的一个重大区别,您可能已习惯于驱动器 C 中通常包含磁盘文件系统,而顺序文件系统(比如网络映射、CD-ROM 和 USB)挂载在它们自己的驱动器上,比如 D、E、F 或 G。
超级块在文件系统的最高级别上,超级块包含与文件系统本身相关的信息。尽管使用超级块可能不是很有趣,但可以使用 dump2fs 命令理解这一概念,这可以帮助您了解文件系统的存储概念。
清单 2 中的命令包含 /dev/sda1 上的一个分区的信息,在本例中该分区为一个 /boot 分区。grep -i superblock 命令以一种不区分大小写的方式使用 grep,仅输出与字符串 superblock 相关的信息。
清单 2. 使用 dumpe2fs 获取超级块信息1
2
3
4
5
6
7
| # dumpe2fs /dev/sda1 | grep -i superblock
Primary superblock at 1, Group descriptors at 2-2
Backup superblock at 8193, Group descriptors at 8194-8194
Backup superblock at 24577, Group descriptors at 24578-24578
Backup superblock at 40961, Group descriptors at 40962-40962
Backup superblock at 57345, Group descriptors at 57346-57346
Backup superblock at 73729, Group descriptors at 73730-73730
|
查看文件系统状态通常,您希望为文件系统的增长分配、安全检查点和性能预期建立一种基准。GNU 库包含许多用于处理文件系统的工具。流行的工具包括 df、du、fsck 和 fdisk。一些有用但不常见的工具包括 iostat 和 sar。
du 和 df 命令可以使用 df 和 du 命令了解磁盘使用情况和空闲空间。du -csh /var 命令显示 /var 文件系统上的目录大小信息。如果您希望获取位于 /var 中的子目录的文件大小,那么使用 du -h 命令就足够了。
1
2
3
| # du -csh /var
73M /var
73M total
|
df -h 命令以人类可读的 (- h) 格式报告 Linux 计算机上各个挂载点的磁盘文件系统使用情况:
1
2
3
4
5
| # df -h
File System Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00 37G 3.2G 32G 10% /
/dev/sda1 99M 12M 82M 13% /boot
tmpfs 506M 0 506M 0% /dev/shm
|
fsck 命令要检查(以及可能修复)文件系统中的错误,可以使用 fsck 命令。例如,如果想检查位于 /dev/sda2 上的分区中的错误,可以键入命令 fsck /dev/sda:
1
2
3
4
5
| # umount /var
# fsck /var
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
/dev/sda3: clean, 702/192000 files, 52661/768000 blocks
|
备注:在没有挂载的文件系统上使用此命令。
在上面的例子中,磁盘在单用户模式下执行。位于 /dev/sda3 的 /var 分区首先挂载。fsck 命令没有找到错误,但是,如果找到错误,它会尝试修复它们。 |