5.10. 文件系统

5.10.1. 什么是文件系统?

文件系统 是操作系统用于跟踪磁盘或分区上文件的方法和数据结构;也就是说,文件在磁盘上的组织方式。这个词也用来指代用于存储文件的分区或磁盘,或者文件系统的类型。因此,可以说“我有两个文件系统”,意思是你有两个分区,你在上面存储文件,或者你正在使用“扩展文件系统”,意思是文件系统的类型。

磁盘或分区及其包含的文件系统之间的区别非常重要。一些程序(包括,合理地,创建文件系统的程序)直接在磁盘或分区的原始扇区上操作;如果那里存在一个现有的文件系统,它将被销毁或严重损坏。大多数程序在文件系统上操作,因此无法在不包含文件系统的分区(或包含错误类型的文件系统)上工作。

在可以将分区或磁盘用作文件系统之前,需要对其进行初始化,并将簿记数据结构写入磁盘。这个过程被称为创建文件系统

大多数 UNIX 文件系统类型都有类似的总体结构,尽管确切的细节差异很大。中心概念是超级块inode数据块目录块间接块。超级块包含关于整个文件系统的信息,例如它的大小(这里的确切信息取决于文件系统)。inode 包含关于文件的所有信息,除了它的名称。名称存储在目录中,与 inode 的编号一起。目录条目由文件名和代表文件的 inode 的编号组成。inode 包含若干数据块的编号,这些数据块用于存储文件中的数据。然而,inode 中只有少量空间用于存储数据块编号,如果需要更多,则动态分配更多用于指向数据块的指针的空间。这些动态分配的块是间接块;该名称表明,为了找到数据块,必须首先在间接块中找到其编号。

UNIX 文件系统通常允许在文件中创建一个空洞(这是通过lseek()系统调用完成的;查看手册页),这意味着文件系统只是假装在文件中的特定位置只有零字节,但没有为该文件中的位置保留实际的磁盘扇区(这意味着该文件将使用更少的磁盘空间)。这种情况尤其经常发生在小型二进制文件、Linux 共享库、某些数据库和一些其他特殊情况下。(空洞是通过在间接块或 inode 中存储一个特殊值作为数据块的地址来实现的。这个特殊的地址意味着没有为文件的那部分分配数据块,因此,文件中有一个空洞。)

5.10.2. 丰富的文件系统

Linux 支持几种类型的文件系统。截至撰写本文时,最重要的有

minix

最古老,被认为是可靠性最高的,但在功能上非常有限(缺少一些时间戳,文件名最多 30 个字符)并且在容量上受到限制(每个文件系统最多 64 MB)。

xia

Minix 文件系统的修改版本,取消了对文件名和文件系统大小的限制,但没有引入其他新功能。它不是很流行,但据报道工作得很好。

ext3

ext3 文件系统具有 ext2 文件系统的所有功能。不同之处在于,添加了日志功能。这提高了性能,并在系统崩溃时缩短了恢复时间。它已变得比 ext2 更受欢迎。

ext2

本机 Linux 文件系统中功能最丰富的。它被设计为易于向上兼容,以便新版本的文件系统代码不需要重新创建现有的文件系统。

ext

Ext2 的旧版本,不向上兼容。它几乎不再用于新安装,大多数人已转换为 ext2。

reiserfs

一种更强大的文件系统。使用日志功能,这使得数据丢失的可能性更小。日志记录是一种机制,用于记录要执行或已经执行的事务。这使得文件系统能够在例如不正确的关机造成的损坏后相当容易地重建自身。

jfs

JFS 是 IBM 设计的日志文件系统,可在高性能环境中使用。

xfs

XFS 最初由 Silicon Graphics 设计,用作 64 位日志文件系统。XFS 还被设计为在使用大文件和文件系统时保持高性能。

此外,还存在对几种外国文件系统的支持,以便更容易地与其他操作系统交换文件。这些外国文件系统的工作方式与本机文件系统相同,只是它们可能缺少一些常见的 UNIX 功能,或者有奇怪的限制或其他怪癖。

msdos

与 MS-DOS(以及 OS/2 和 Windows NT)FAT 文件系统的兼容性。

umsdos

扩展了 Linux 下的 msdos 文件系统驱动程序以获得长文件名、所有者、权限、链接和设备文件。这允许将普通的 msdos 文件系统用作 Linux 文件系统,从而无需为 Linux 分配单独的分区。

vfat

这是 FAT 文件系统的一个扩展,称为 FAT32。它支持比 FAT 更大的磁盘尺寸。大多数 MS Windows 磁盘都是 vfat。

iso9660

标准 CD-ROM 文件系统;自动支持流行的 CD-ROM 标准 Rock Ridge 扩展,该扩展允许更长的文件名。

nfs

一个网络文件系统,允许在多台计算机之间共享文件系统,以便轻松地从所有计算机访问文件。

smbfs

一个网络文件系统,允许与 MS Windows 计算机共享文件系统。它与 Windows 文件共享协议兼容。

hpfs

OS/2 文件系统。

sysv

SystemV/386、Coherent 和 Xenix 文件系统。

NTFS

最先进的 Microsoft 日志文件系统,与以前的 Microsoft 文件系统相比,提供更快的文件访问速度和稳定性。

要使用的文件系统的选择取决于具体情况。如果兼容性或其他原因使得有必要使用非本机文件系统之一,则必须使用该文件系统。如果可以自由选择,那么使用 ext3 可能是最明智的选择,因为它具有 ext2 的所有功能,并且是一个日志文件系统。有关文件系统的更多信息,请参见第 5.10.6 节。您还可以阅读位于 http://www.tldp.org/HOWTO/Filesystems-HOWTO.html 的 Filesystems HOWTO。

还有一个 proc 文件系统,通常可以作为/proc目录访问,即使它看起来像文件系统,但它实际上根本不是文件系统。proc 文件系统可以轻松访问某些内核数据结构,例如进程列表(因此得名)。它使这些数据结构看起来像一个文件系统,并且可以使用所有常用的文件工具来操作该文件系统。例如,要获取所有进程的列表,可以使用以下命令

$ ls -l /proc
total 0
dr-xr-xr-x   4 root     root            0 Jan 31 20:37 1
dr-xr-xr-x   4 liw      users           0 Jan 31 20:37 63
dr-xr-xr-x   4 liw      users           0 Jan 31 20:37 94
dr-xr-xr-x   4 liw      users           0 Jan 31 20:37 95
dr-xr-xr-x   4 root     users           0 Jan 31 20:37 98
dr-xr-xr-x   4 liw      users           0 Jan 31 20:37 99
-r--r--r--   1 root     root            0 Jan 31 20:37 devices
-r--r--r--   1 root     root            0 Jan 31 20:37 dma
-r--r--r--   1 root     root            0 Jan 31 20:37 filesystems
-r--r--r--   1 root     root            0 Jan 31 20:37 interrupts
-r--------   1 root     root      8654848 Jan 31 20:37 kcore
-r--r--r--   1 root     root            0 Jan 31 11:50 kmsg
-r--r--r--   1 root     root            0 Jan 31 20:37 ksyms
-r--r--r--   1 root     root            0 Jan 31 11:51 loadavg
-r--r--r--   1 root     root            0 Jan 31 20:37 meminfo
-r--r--r--   1 root     root            0 Jan 31 20:37 modules
dr-xr-xr-x   2 root     root            0 Jan 31 20:37 net
dr-xr-xr-x   4 root     root            0 Jan 31 20:37 self
-r--r--r--   1 root     root            0 Jan 31 20:37 stat
-r--r--r--   1 root     root            0 Jan 31 20:37 uptime
-r--r--r--   1 root     root            0 Jan 31 20:37 
version
$
(但是,会有一些不对应于进程的额外文件。上面的示例已被缩短。)

请注意,即使它被称为文件系统,proc 文件系统的任何部分都不会触及任何磁盘。它只存在于内核的想象中。每当有人试图查看 proc 文件系统的任何部分时,内核都会使其看起来好像该部分存在于某处,即使它不存在。因此,即使存在一个多兆字节的/proc/kcore文件,它也不占用任何磁盘空间。

5.10.3. 应该使用哪个文件系统?

通常没有必要使用许多不同的文件系统。目前,ext3 是最流行的文件系统,因为它是一个日志文件系统。目前,它可能是最明智的选择。Reiserfs 是另一种流行的选择,因为它也是日志记录的。根据簿记结构的开销、速度、(感知的)可靠性、兼容性和各种其他原因,建议使用另一个文件系统。这需要根据具体情况决定。

使用日志记录的文件系统也称为日志文件系统。日志文件系统维护一个日志,或日志,记录文件系统上发生的事情。在系统崩溃时,或者如果你的 2 岁儿子像我的儿子喜欢做的那样按下电源按钮,则日志文件系统旨在用于文件系统的日志来重新创建未保存和丢失的数据。这使得数据丢失的可能性大大降低,并且很可能成为 Linux 文件系统中的标准功能。但是,不要从中获得虚假的安全感。像其他所有事情一样,可能会出现错误。始终确保备份您的数据以防紧急情况。

有关不同文件系统类型的功能的更多详细信息,请参见第 5.10.6 节

5.10.4. 创建文件系统

文件系统是使用 mkfs 命令创建的,即初始化的。实际上,每种文件系统类型都有一个单独的程序。mkfs 只是一个前端,它根据所需的文件系统类型运行适当的程序。使用-t fstype选项选择类型。

mkfs 调用的程序具有略有不同的命令行界面。下面总结了常见且最重要的选项;有关更多信息,请参见手册页。

-t fstype

选择文件系统的类型。

-c

搜索坏块并相应地初始化坏块列表。

-l filename

从名称文件读取初始坏块列表。

还有许多程序被编写为在创建特定文件系统时添加特定选项。例如,mkfs.ext3 添加一个 -b 选项,允许管理员指定应使用什么块大小。请务必查明是否有可用于您要使用的文件系统类型的特定程序。有关确定使用什么块大小的更多信息,请参见第 5.10.5 节

要在软盘上创建 ext2 文件系统,可以给出以下命令

$ fdformat -n /dev/fd0H1440
Double-sided, 80 tracks, 18 sec/track. Total capacity 
1440 KB.
Formatting ... done
$ badblocks /dev/fd0H1440 1440 $>$ 
bad-blocks
$ mkfs.ext2 -l bad-blocks 
/dev/fd0H1440
mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10
360 inodes, 1440 blocks
72 blocks (5.00%) reserved for the super user
First data block=1
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1 block group
8192 blocks per group, 8192 fragments per group
360 inodes per group

Writing inode tables: done
Writing superblocks and filesystem accounting information: 
done
$
首先,格式化软盘 (-n选项禁止验证(即,坏块检查)。然后使用 badblocks 搜索坏块,并将输出重定向到一个文件,坏块。最后,创建文件系统,并使用 badblocks 找到的坏块列表进行初始化。

The-c选项可以与 mkfs 一起使用,而不是 badblocks 和单独的文件。下面的例子就是这样做的。

$ mkfs.ext2 -c 
/dev/fd0H1440
mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10
360 inodes, 1440 blocks
72 blocks (5.00%) reserved for the super user
First data block=1
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1 block group
8192 blocks per group, 8192 fragments per group
360 inodes per group

Checking for bad blocks (read-only test): done
Writing inode tables: done
Writing superblocks and filesystem accounting information: 
done
$
The-c选项比单独使用 badblocks 更方便,但在创建文件系统后,必须使用 badblocks 进行检查。

在硬盘或分区上准备文件系统的过程与软盘相同,只是不需要格式化。

5.10.5. 文件系统块大小

块大小指定文件系统用于读取和写入数据的大小。 当使用大型文件(例如数据库)时,较大的块大小将有助于提高磁盘 I/O 性能。 这是因为磁盘在搜索下一个块之前可以读取或写入数据更长的时间。

缺点是,如果你的文件系统上有很多较小的文件,比如/etc,则可能浪费大量磁盘空间。

例如,如果将块大小设置为 4096 或 4K,并且创建了一个大小为 256 字节的文件,它仍然会占用硬盘上的 4K 空间。对于一个文件来说,这似乎微不足道,但当你的文件系统包含数百或数千个文件时,这可能会累积起来。

块大小也会影响某些文件系统上支持的最大文件大小。这是因为许多现代文件系统不受块大小或文件大小的限制,而是受块数的限制。因此,您将使用“块大小 * 最大块数 = 最大块大小”公式。

5.10.6. 文件系统比较

表 5-1. 文件系统功能比较

文件系统名称引入年份原始操作系统最大文件大小最大文件系统大小日志功能
FAT161983MSDOS V24GB16MB 到 8GB
FAT321997Windows 954GB8GB 到 2TB
HPFS1988OS/24GB2TB
NTFS1993Windows NT16EB16EB
HFS+1998Mac OS8EB?
UFS22002FreeBSD512GB 到 32PB1YB
ext21993Linux16GB 到 2TB42TB 到 32TB
ext31999Linux16GB 到 2TB42TB 到 32TB
ReiserFS32001Linux8TB816TB
ReiserFS42005Linux??
XFS1994IRIX9EB9EB
JFS?AIX8EB512TB 到 4PB
VxFS1991SVR4.016EB?
ZFS2004Solaris 101YB16EB

图例

表 5-2. 大小

千字节 - KB1024 字节
兆字节 - MB1024 KB
吉字节 - GB1024 MB
太字节 - TB1024 GB
拍字节 - PB1024 TB
艾字节 - EB1024 PB
泽字节 - ZB1024 EB
尧字节 - YB1024 ZB

应该注意的是,艾字节、泽字节和尧字节很少遇到,甚至从未遇到过。 目前估计,世界上的印刷材料总量等于 5 艾字节。 因此,许多人认为其中一些文件系统限制在理论上是存在的。 但是,文件系统软件已经编写成具有这些功能。

有关更多详细信息,您可以访问 http://en.wikipedia.org/wiki/Comparison_of_file_systems

5.10.7. 挂载和卸载

在使用文件系统之前,必须先挂载它。 然后操作系统会执行各种簿记操作以确保一切正常工作。 由于 UNIX 中的所有文件都在单个目录树中,因此挂载操作会使新文件系统的内容看起来像是已挂载的某个文件系统中现有子目录的内容。

例如,图 5-3 显示了三个单独的文件系统,每个文件系统都有自己的根目录。 当最后两个文件系统挂载到/home/usr分别位于第一个文件系统上时,我们可以得到一个像 图 5-4 中那样的单个目录树。

图 5-3. 三个独立的文件系统。

图 5-4./home/usr已被挂载。

挂载可以像以下示例中那样完成

$ mount /dev/hda2 /home
$ mount /dev/hda3 /usr
$
mount 命令接受两个参数。 第一个参数是对应于包含文件系统的磁盘或分区的设备文件。 第二个参数是它将挂载到的目录。 在这些命令之后,这两个文件系统的内容看起来就像/home/usr目录的内容一样。 然后人们会说/dev/hda2 挂载在 /home'上,对于/usr也是如此。 要查看任何一个文件系统,只需查看它所挂载的目录的内容,就像查看任何其他目录一样。 请注意设备文件/dev/hda2和挂载目录/home之间的区别。 设备文件提供对磁盘原始内容的访问,挂载目录提供对磁盘上文件的访问。 挂载目录称为挂载点

Linux 支持多种文件系统类型。 mount 尝试猜测文件系统的类型。 您也可以使用-t fstype选项直接指定类型; 这有时是必要的,因为 mount 使用的启发式方法并不总是有效。 例如,要挂载 MS-DOS 软盘,可以使用以下命令

	$ mount -t msdos /dev/fd0 
	/floppy
	$
	

挂载目录不必为空,但它必须存在。 但是,在挂载文件系统时,将无法通过名称访问其中的任何文件。 (已打开的任何文件仍然可以访问。从其他目录具有硬链接的文件可以使用这些名称访问。)这样做没有坏处,甚至可能有用。 例如,有些人喜欢使/tmp/var/tmp同义,并使/tmp成为/var/tmp的符号链接。 当系统启动时,在挂载/var文件系统之前,将使用位于根文件系统上的/var/tmp目录。 当/var被挂载时,它将使根文件系统上的/var/tmp目录无法访问。 如果/var/tmp不存在于根文件系统上,则在挂载/var.

如果不打算向文件系统写入任何内容,请使用 mount-r开关来执行只读挂载。 这将使内核停止任何写入文件系统的尝试,并且还会阻止内核更新 inodes 中的文件访问时间。 只读挂载对于不可写介质(例如 CD-ROM)是必需的。

细心的读者已经注意到一个轻微的后勤问题。 第一个文件系统(称为根文件系统,因为它包含根目录)是如何挂载的,因为它显然不能挂载到另一个文件系统上? 答案是它是由魔法完成的。 根文件系统在启动时被神奇地挂载,并且人们可以依靠它始终处于挂载状态。 如果无法挂载根文件系统,则系统不会启动。 作为根目录神奇挂载的文件系统的名称要么编译到内核中,要么使用 LILO 或 rdev 设置。

有关更多信息,请参阅内核源代码或 Kernel Hackers' Guide。

根文件系统通常首先以只读方式挂载。 然后启动脚本将运行 fsck 以验证其有效性,如果没有问题,它们将重新挂载它,以便也允许写入。 不得在已挂载的文件系统上运行 fsck,因为在 fsck 运行时对文件系统进行的任何更改都将导致问题。 由于根文件系统在被检查时以只读方式挂载,因此 fsck 可以毫无顾虑地解决任何问题,因为重新挂载操作将刷新文件系统保存在内存中的任何元数据。

在许多系统上,还有其他文件系统也应该在启动时自动挂载。 这些在/etc/fstab文件中指定; 有关格式的详细信息,请参见 fstab 手册页。 额外文件系统的确切挂载时间取决于许多因素,并且可以由每个管理员根据需要进行配置; 请参阅第 8 章

当不再需要挂载文件系统时,可以使用 umount 将其卸载。 umount 接受一个参数:设备文件或挂载点。 例如,要卸载上一个示例的目录,可以使用以下命令

$ umount /dev/hda2
$ umount /usr
$

有关如何使用该命令的更多说明,请参见手册页。 务必始终卸载已挂载的软盘。不要只是将软盘从驱动器中弹出! 由于磁盘缓存,数据不一定会在您卸载它之前写入软盘,因此过早地将软盘从驱动器中取出可能会导致内容变得乱码。 如果您只从软盘读取数据,则这种情况不太可能发生,但如果您写入数据,即使是意外写入,结果也可能是灾难性的。

挂载和卸载需要超级用户权限,即只有 root 用户才能执行此操作。 原因是如果任何用户都可以在任何目录上挂载软盘,那么很容易创建一个软盘,其中包含伪装成/bin/sh或任何其他常用程序的特洛伊木马。 但是,通常有必要允许用户使用软盘,并且有多种方法可以执行此操作

最后一种方法可以通过在/etc/fstab文件中添加如下行来实现。
	/dev/fd0            /floppy      msdos   user,noauto      0     0
	
这些列分别是:要挂载的设备文件,要挂载到的目录,文件系统类型,选项,备份频率(由 dump 使用)以及 fsck 传递号(用于指定文件系统在启动时应检查的顺序;0 表示不检查)。

Thenoauto选项阻止在系统启动时自动完成此挂载(即,它阻止 mount -a 挂载它)。user选项允许任何用户挂载文件系统,并且由于安全原因,禁止从已挂载的文件系统执行程序(普通或 setuid)和解释设备文件。此后,任何用户都可以使用以下命令挂载带有 msdos 文件系统的软盘

	$ mount /floppy
	$
	
软盘可以使用相应的 umount 命令卸载(当然,需要卸载)。

如果要提供对多种类型的软盘的访问,则需要提供多个挂载点。 每个挂载点的设置可以不同。 例如,要同时提供对 MS-DOS 和 ext2 软盘的访问权限,可以在/etc/fstab:

	/dev/fd0    /mnt/dosfloppy    msdos   user,noauto  0  0
	/dev/fd0    /mnt/ext2floppy   ext2    user,noauto  0  0
	
中的以下两行:另一种方法是仅添加类似于以下内容的一行:
        /dev/fd0    /mnt/floppy    auto   user,noauto  0  0
        
文件系统类型列中的“auto”选项允许 mount 命令查询文件系统并尝试确定其自身类型。 此选项并非适用于所有文件系统类型,但在更常见的类型上可以正常工作。

对于 MS-DOS 文件系统(不仅仅是软盘),您可能希望使用uid, gidumask文件系统选项来限制对其的访问,这些选项在 mount 手册页上有详细描述。 如果不小心,挂载 MS-DOS 文件系统会使每个人至少具有对其文件中内容的读取权限,这不是一个好主意。

5.10.8. 文件系统安全

待添加

本节将描述挂载选项以及如何在/etc/fstab中使用它们以提供额外的系统安全性。

5.10.9. 使用 fsck 检查文件系统完整性

文件系统是复杂的生物,因此,它们往往容易出错。可以使用 fsck 命令检查文件系统的正确性和有效性。可以指示它修复发现的任何小问题,并在存在任何无法修复的问题时提醒用户。幸运的是,实现文件系统的代码经过了非常有效的调试,因此几乎没有问题,并且它们通常是由电源故障,硬件故障或操作员错误引起的;例如,未能正确关闭系统。

大多数系统都设置为在启动时自动运行 fsck,以便在系统使用之前检测到(并希望可以纠正)任何错误。使用损坏的文件系统往往会使情况变得更糟:如果数据结构混乱,则使用文件系统可能会使它们更加混乱,从而导致更多的数据丢失。但是,fsck 在大型文件系统上可能需要一段时间才能运行,并且由于如果系统已正确关闭,则几乎永远不会发生错误,因此可以使用一些技巧来避免在这种情况下进行检查。首先,如果文件/etc/fastboot存在,则不进行任何检查。第二个是,ext2 文件系统在其超级块中有一个特殊的标记,用于指示文件系统在上一次挂载后是否已正确卸载。这允许 e2fsckfsck 的 ext2 文件系统版本)避免在标志指示已完成卸载时检查文件系统(假设正确的卸载表明没有问题)。/etc/fastboot技巧是否在您的系统上起作用取决于您的启动脚本,但是每次使用 e2fsck 时,ext2 技巧都有效。必须使用 e2fsck 的选项才能显式绕过它以避免使用它。 (有关详细信息,请参见 e2fsck 手册页。)

自动检查仅适用于在启动时自动挂载的文件系统。手动使用 fsck 检查其他文件系统,例如软盘。

如果 fsck 发现无法修复的问题,则您需要深入了解文件系统的工作方式以及特定损坏的文件系统的类型,或者需要良好的备份。后者很容易(尽管有时很繁琐)安排,如果您自己没有专业知识,则可以通过朋友,Linux 新闻组和邮件列表或某些其他支持来源来安排前者。我想告诉您更多有关它的信息,但我在这一方面的教育和经验不足阻碍了我。Theodore Ts'o 的 debugfs 程序应该有用。

fsck 必须仅在未挂载的文件系统上运行,而绝不能在已挂载的文件系统上运行(启动期间的只读根目录除外)。 这是因为它访问原始磁盘,因此可以在操作系统不知道的情况下修改文件系统。 如果操作系统感到困惑,将会出现问题。

5.10.10. 使用 badblocks 检查磁盘错误

定期检查坏块可能是一个好主意。 这是通过 badblocks 命令完成的。 它输出它可以找到的所有坏块的编号列表。 可以将此列表馈送给 fsck 以记录在文件系统数据结构中,以便操作系统不会尝试使用坏块来存储数据。 以下示例将说明如何完成此操作。

	$ badblocks /dev/fd0H1440 1440 > 
	bad-blocks
	$ fsck -t ext2 -l bad-blocks 
	/dev/fd0H1440
	Parallelizing fsck version 0.5a (5-Apr-94)
	e2fsck 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10
	Pass 1: Checking inodes, blocks, and sizes
	Pass 2: Checking directory structure
	Pass 3: Checking directory connectivity
	Pass 4: Check reference counts.
	Pass 5: Checking group summary information.
	
	/dev/fd0H1440: ***** FILE SYSTEM WAS MODIFIED *****
	/dev/fd0H1440: 11/360 files, 63/1440 blocks
	$
	
如果 badblocks 报告了一个已经被使用的块,则 e2fsck 将尝试将该块移到另一个位置。 如果该块确实很糟糕,而不仅仅是边缘化,则该文件的内容可能会损坏。

5.10.11. 消除碎片?

将文件写入磁盘时,并非总能将其写入连续的块中。 未存储在连续块中的文件是 碎片化的。 读取碎片文件需要更长的时间,因为磁盘的读写头将必须移动更多。 避免碎片是可取的,尽管在具有预读功能的良好缓冲缓存的系统中,碎片不是什么大问题。

现代 Linux 文件系统通过将文件中的所有块保持在一起(即使无法将它们存储在连续的扇区中)来最大程度地减少碎片。 某些文件系统(例如 ext3)有效地分配与文件中的其他块最接近的空闲块。 因此,无需担心 Linux 系统中的碎片。

在 ext2 文件系统的早期,人们曾担心文件碎片问题,这导致开发了一个称为 defrag 的碎片整理程序。 仍然可以在 http://www.go.dlr.de/linux/src/defrag-0.73.tar.gz 下载它的副本。 但是,强烈建议您不要使用它。 它是为旧版本的 ext2 设计的,并且自 1998 年以来未进行更新! 我仅在此处出于参考目的提及它。

有很多 MS-DOS 碎片整理程序可以在文件系统中移动块以消除碎片。 对于其他文件系统,必须通过备份文件系统,重新创建文件系统以及从备份还原文件来完成碎片整理。 备份文件系统后再进行碎片整理对于所有文件系统来说都是一个好主意,因为在碎片整理过程中可能会出现许多问题。

5.10.12. 所有文件系统的其他工具

一些其他工具对于管理文件系统也很有用。 df 显示一个或多个文件系统上的可用磁盘空间; du 显示目录及其所有文件包含多少磁盘空间。 这些可用于查找浪费磁盘空间的资源。 两者都有手册页,其中详细说明了可以使用的(许多)选项。

sync 强制将缓冲区缓存中的所有未写入块(请参见第 6.6 节)写入磁盘。 通常不需要手动执行此操作。 后台程序 update 会自动执行此操作。 在灾难中,例如当 update 或其辅助进程 bdflush 死机时,或者您必须立即关闭电源并且无法等待 update 运行时,它可能会很有用。 同样,也有手册页。 man 是您在 Linux 中最好的朋友。 它的表亲 apropos 在您不知道所需的命令名称时也很有用。

5.10.13. ext2/ext3 文件系统的其他工具

除了可以直接或通过独立于文件系统类型的前端访问的文件系统创建器(mke2fs)和检查器(e2fsck)之外,ext2 文件系统还有一些其他可能有用的工具。

tune2fs 调整文件系统参数。 一些更有趣的参数是

有关更多信息,请参见 tune2fs 手册页。

dumpe2fs 显示有关 ext2 或 ext3 文件系统的信息,主要来自超级块。 以下是示例输出。 输出中的某些信息是技术性的,需要了解文件系统的工作方式,但是即使对于非管理人员,也可以很容易地理解其中的很多内容。

# dumpe2fs
dumpe2fs 1.32 (09-Nov-2002)
Filesystem volume name:   /
Last mounted on:          not available
Filesystem UUID:          51603f82-68f3-4ae7-a755-b777ff9dc739
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal filetype needs_recovery sparse_super
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              3482976
Block count:              6960153
Reserved block count:     348007
Free blocks:              3873525
Free inodes:              3136573
First block:              0
Block size:               4096
Fragment size:            4096
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         16352
Inode blocks per group:   511
Filesystem created:       Tue Aug 26 08:11:55 2003
Last mount time:          Mon Dec 22 08:23:12 2003
Last write time:          Mon Dec 22 08:23:12 2003
Mount count:              3
Maximum mount count:      -1
Last checked:             Mon Nov  3 11:27:38 2003
Check interval:           0 (none)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal UUID:             none
Journal inode:            8
Journal device:           0x0000
First orphan inode:       655612


Group 0: (Blocks 0-32767)
  Primary superblock at 0, Group descriptors at 1-2
  Block bitmap at 3 (+3), Inode bitmap at 4 (+4)
  Block bitmap at 3 (+3), Inode bitmap at 4 (+4)
  Inode table at 5-515 (+5)
  3734 free blocks, 16338 free inodes, 2 directories

debugfs 是一个文件系统调试器。它允许直接访问存储在磁盘上的文件系统数据结构,因此可以用来修复损坏到 fsck 无法自动修复的磁盘。它也被用于恢复已删除的文件。但是,使用 debugfs 需要您非常了解自己在做什么;如果不了解,可能会破坏所有数据。

dumprestore 可以用来备份 ext2 文件系统。它们是传统 UNIX 备份工具的 ext2 特定版本。有关备份的更多信息,请参见第 12.1 节