3.1. Linux 文件系统概述

3.1.1. 文件

3.1.1.1. 概述

对 UNIX 系统的一个简单描述(也适用于 Linux)是:

"在 UNIX 系统中,一切皆是文件;如果某样东西不是文件,那就是一个进程。"

这个说法是正确的,因为有一些特殊文件不仅仅是文件(例如,命名管道和套接字),但为了简化起见,说一切皆是文件是一种可以接受的概括。就像 UNIX 一样,Linux 系统不区分文件和目录,因为目录只是包含其他文件名称的文件。程序、服务、文本、图像等等,都是文件。输入和输出设备,以及通常所有的设备,都被系统认为是文件。

为了有条不紊地管理所有这些文件,人们喜欢将它们想象成硬盘上的一个有序的树状结构,就像我们从 MS-DOS(磁盘操作系统)中所了解的那样。大的分支包含更多分支,而末端的分支包含树的叶子或普通文件。现在我们将使用这棵树的图像,但稍后我们将发现为什么这个图像并不完全准确。

3.1.1.2. 文件的种类

大多数文件只是文件,被称为普通文件;它们包含普通数据,例如文本文件、可执行文件或程序、程序的输入或输出等等。

虽然假设在 Linux 系统上遇到的所有东西都是文件是相当安全的,但也有一些例外情况。

  • 目录:是其他文件的列表的文件。

  • 特殊文件:用于输入和输出的机制。 大多数特殊文件都在/dev,我们将在后面讨论它们。

  • 链接:一种使文件或目录在系统文件树的多个部分可见的系统。 我们将详细讨论链接。

  • (域)套接字:一种特殊的文件类型,类似于 TCP/IP 套接字,提供受文件系统访问控制保护的进程间网络。

  • 命名管道:功能或多或少类似于套接字,形成进程相互通信的一种方式,而无需使用网络套接字语义。

ls 命令的-l选项通过使用每个输入行的第一个字符来显示文件类型。

jaime:~/Documents> ls -l
total 80
-rw-rw-r--   1 jaime   jaime   31744 Feb 21 17:56 intro Linux.doc
-rw-rw-r--   1 jaime   jaime   41472 Feb 21 17:56 Linux.doc
drwxrwxr-x   2 jaime   jaime    4096 Feb 25 11:50 course

下表概述了确定文件类型的字符。

表 3-1. 长列表中的文件类型

符号含义
-普通文件
d目录
l链接
c特殊文件
s套接字
p命名管道
b块设备

为了不必总是执行长列表来查看文件类型,许多系统默认情况下不会仅仅发出 ls,而是发出 ls -F,它会使用字符 "/=*|@" 为文件名称添加后缀以指示文件类型。为了让初学者更容易上手,通常会组合使用-F--color选项,请参阅 第 3.3.1.1 节。 为了更好地可读性,我们将在本文档中使用 ls -F

作为用户,您只需要直接处理普通文件、可执行文件、目录和链接。 特殊文件类型的存在是为了让您的系统按照您的要求执行操作,它们由系统管理员和程序员处理。

现在,在查看重要文件和目录之前,我们需要更多地了解分区。

3.1.2. 关于分区

3.1.2.1. 为什么要分区?

大多数人都对分区有一个模糊的了解,因为每个操作系统都有创建或删除它们的能力。 即使在使用标准安装程序时,Linux 也会在同一磁盘上使用多个分区,这似乎很奇怪,因此需要一些解释。

拥有不同分区的目标之一是在发生灾难时实现更高的数据安全性。 通过将硬盘划分为分区,可以对数据进行分组和分离。 发生意外时,只有受到冲击的分区中的数据会损坏,而其他分区上的数据很可能会幸存下来。

该原则可以追溯到 Linux 没有日志文件系统并且电源故障可能导致灾难的时代。 出于安全性和稳健性的原因,仍然使用分区,因此系统某一部分的漏洞并不意味着整个计算机都处于危险之中。 这目前是分区最重要的原因。 一个简单的例子:用户创建一个脚本、程序或 Web 应用程序,开始填满磁盘。 如果磁盘仅包含一个大的分区,则如果磁盘已满,整个系统将停止运行。 如果用户将数据存储在单独的分区上,则只有该(数据)分区会受到影响,而系统分区和可能的其他数据分区保持运行。

请注意,拥有日志文件系统仅在发生电源故障和突然断开存储设备的情况下提供数据安全保障。 这不能保护您的数据免受文件系统中的坏块和逻辑错误的影响。 在这些情况下,您应该使用 RAID(廉价磁盘冗余阵列)解决方案。

3.1.2.2. 分区布局和类型

Linux 系统上有两种主要分区

  • 数据分区:正常的 Linux 系统数据,包括包含启动和运行系统所有数据的根分区;以及

  • 交换分区:计算机物理内存的扩展,硬盘上的额外内存。

大多数系统包含一个根分区、一个或多个数据分区以及一个或多个交换分区。 混合环境中的系统可能包含用于其他系统数据的分区,例如具有用于 MS Windows 数据的 FAT 或 VFAT 文件系统的分区。

大多数 Linux 系统在安装时使用 fdisk 来设置分区类型。 正如您在第 1 章的练习中可能已经注意到的,这通常会自动发生。 但是,在某些情况下,您可能没有那么幸运。 在这种情况下,您需要手动选择分区类型,甚至手动进行实际分区。 标准 Linux 分区的交换分区编号为 82,数据分区编号为 83,数据分区可以是日志型 (ext3) 或普通型(旧系统上的 ext2)。 如果您忘记这些值,fdisk 实用程序具有内置帮助。

除了这两种之外,Linux 还支持多种其他文件系统类型,例如相对较新的 Reiser 文件系统、JFS、NFS、FATxx 以及许多其他(专有)操作系统上本机可用的文件系统。

标准根分区(用单个正斜杠 / 表示)约为 100-500 MB,包含系统配置文件、最基本的命令和服务器程序、系统库、一些临时空间以及管理用户的家目录。 标准安装需要大约 250 MB 的根分区。

交换空间(用 swap 表示)仅可供系统本身访问,并且在正常操作期间是隐藏的。 像在正常的 UNIX 系统上一样,交换可确保您可以继续工作,无论发生什么情况。 在 Linux 上,由于这种额外的内存,您实际上永远不会看到诸如内存不足,请先关闭一些应用程序然后再试一次之类的令人讨厌的消息。 交换或虚拟内存程序现在已被 UNIX 世界之外的操作系统广泛采用。

在硬盘上使用内存自然比使用计算机的真实内存芯片慢,但是拥有这一点点额外内存是一种极大的安慰。 在 第 4 章讨论进程时,我们将了解更多关于交换的信息。

Linux 通常依赖于以硬盘上的交换空间形式存在的物理内存的两倍。 安装系统时,您必须知道如何执行此操作。 在具有 512 MB RAM 的系统上的一个示例:

  • 第一种可能性:1 GB 的交换分区

  • 第二种可能性:两个 512 MB 的交换分区

  • 第三种可能性:对于两个硬盘:每个磁盘上 1 个 512 MB 的分区。

当预计有大量 I/O 时,最后一种选择将产生最佳结果。

阅读软件文档以获取特定指南。 某些应用程序(例如数据库)可能需要更多交换空间。 其他一些应用程序(例如某些手持系统)可能由于缺少硬盘而根本没有交换空间。 交换空间也可能取决于您的内核版本。

内核在许多发行版中也位于单独的分区上,因为它​​是系统中最重要的文件。 如果是这种情况,您会发现您还有一个 /boot 分区,其中包含您的内核和随附的数据文件。

硬盘的其余部分通常分为数据分区,尽管所有非系统关键数据可能驻留在单个分区上,例如,当您执行标准工作站安装时。 当非关键数据分离到不同的分区上时,通常会遵循一定的模式:

  • 用于用户程序的分区 (/usr)

  • 包含用户个人数据的分区 (/home)

  • 存储临时数据(如打印和邮件队列)的分区 (/var)

  • 用于第三方和额外软件的分区 (/opt)

一旦创建了分区,您只能添加更多分区。 更改现有分区的大小或属性是可能的,但不建议这样做。

将硬盘划分为分区由系统管理员决定。 在较大的系统上,他甚至可以使用适当的软件将一个分区分布在多个硬盘上。 大多数发行版都允许针对工作站(普通用户)和通用服务器用途优化的标准设置,但也接受自定义分区。 在安装过程中,您可以使用发行版特定的工具(通常是一个简单的图形界面)或 fdisk(一个用于创建分区和设置其属性的基于文本的工具)来定义您自己的分区布局。

工作站或客户端安装主要供同一人使用。安装时选择的软件也反映了这一点,重点是常见的用户软件包,例如漂亮的桌面主题、开发工具、电子邮件客户端程序、多媒体软件、Web 和其他服务。所有内容都放在一个大型分区上,交换空间是 RAM 的两倍,这样就完成了一个通用的工作站,为个人使用提供了尽可能多的磁盘空间,但缺点是在出现问题时可能会丢失数据完整性。

在服务器上,系统数据往往与用户数据分开。提供服务的程序与该服务处理的数据保存在不同的位置。将在这些系统上创建不同的分区。

  • 包含启动机器所需的所有数据的分区。

  • 包含配置数据和服务器程序的分区。

  • 一个或多个包含服务器数据的分区,例如数据库表、用户邮件、ftp 存档等。

  • 包含用户程序和应用程序的分区。

  • 一个或多个用于用户特定文件的分区(主目录)。

  • 一个或多个交换分区(虚拟内存)。

服务器通常具有更多的内存,因此也具有更多的交换空间。某些服务器进程(例如数据库)可能需要比平时更多的交换空间;请参阅具体文档以获取详细信息。为了获得更好的性能,交换空间通常分为不同的交换分区。

3.1.2.3. 挂载点

所有分区都通过挂载点连接到系统。挂载点定义了文件系统中特定数据集的位置。通常,所有分区都通过 *root* 分区连接。在此分区(用斜杠 (/) 表示)上,将创建目录。这些空目录将是附加到它们的分区的起点。一个例子:给定一个包含以下目录的分区

videos/		cd-images/	pictures/

我们希望将此分区附加到文件系统中,位于一个名为/opt/media的目录中。为了做到这一点,系统管理员必须确保目录/opt/media存在于系统上。最好,它应该是一个空目录。如何做到这一点将在本章稍后解释。然后,使用 mount 命令,管理员可以将分区附加到系统。当您查看以前为空的目录的内容时/opt/media它将包含已挂载介质(硬盘或硬盘分区、CD、DVD、闪存卡、USB 或其他存储设备)上的文件和目录。

在系统启动期间,所有分区都将按照文件中的描述进行挂载/etc/fstab。某些分区默认情况下不会挂载,例如,如果它们没有持续连接到系统,例如您的数码相机使用的存储设备。如果配置正确,设备将在系统注意到它已连接时立即挂载,或者它可以是用户可挂载的,即您无需成为系统管理员即可将设备附加和分离到系统和从系统中分离。在第 9.3 节中有一个例子。

在运行的系统上,可以使用 df 命令(代表 *disk full* 或 *disk free*)显示有关分区及其挂载点的信息。在 Linux 中,df 是 GNU 版本,并支持-h或 *human readable* 选项,该选项极大地提高了可读性。请注意,商业 UNIX 机器通常有自己的 df 和许多其他命令版本。它们的行为通常相同,尽管 GNU 版本的常用工具通常具有更多更好的功能。

df 命令仅显示有关活动非交换分区的信息。这些可以包括来自其他网络系统的分区,如下面的示例所示,其中主目录是从网络上的文件服务器挂载的,这种情况在企业环境中经常遇到。

freddy:~> df -h
Filesystem          Size  Used Avail Use% Mounted on
/dev/hda8           496M  183M  288M  39% /
/dev/hda1           124M  8.4M  109M   8% /boot
/dev/hda5            19G   15G  2.7G  85% /opt
/dev/hda6           7.0G  5.4G  1.2G  81% /usr
/dev/hda7           3.7G  2.7G  867M  77% /var
fs1:/home           8.9G  3.7G  4.7G  44% /.automount/fs1/root/home

3.1.3. 更多文件系统布局

3.1.3.1. 可视化

为了方便起见,Linux 文件系统通常被认为是树形结构。在标准 Linux 系统上,您会发现布局通常遵循下面介绍的方案。

图 3-1. Linux 文件系统布局

这是一个来自 RedHat 系统的布局。根据系统管理员、操作系统和 UNIX 机器的任务,结构可能会有所不同,并且可以随意省略或添加目录。甚至名称也不是必需的;它们只是一种约定。

文件系统的树从树干或 *slash* 开始,用正斜杠 (/) 表示。此目录包含所有底层目录和文件,也称为 *根目录* 或文件系统的 "根"

仅位于根目录下一级的目录通常以斜杠开头,以指示其位置并防止与可能具有相同名称的其他目录混淆。在启动新系统时,最好先查看根目录。让我们看看你可能会遇到什么

emmy:~> cd /
emmy:/> ls
bin/   dev/  home/    lib/         misc/  opt/     root/  tmp/  var/
boot/  etc/  initrd/  lost+found/  mnt/   proc/    sbin/  usr/

表 3-2. 根目录的子目录

目录内容
/bin系统、系统管理员和用户共享的常用程序。
/boot启动文件和内核,vmlinuz。在一些最新的发行版中,还有grub数据。Grub 是 GRand Unified Boot 加载器,旨在摆脱我们今天知道的许多不同的引导加载程序。
/dev包含对所有 CPU 外围硬件的引用,这些硬件表示为具有特殊属性的文件。
/etc最重要的系统配置文件位于/etc,此目录包含类似于 Windows 中控制面板中的数据。
/home常用用户的主目录。
/initrd(在某些发行版上)用于启动的信息。请勿删除!
/lib库文件,包括系统和用户所需的所有类型程序的文件。
/lost+found每个分区都有一个lost+found在其上级目录中。在故障期间保存的文件位于此处。
/misc用于各种目的。
/mnt外部文件系统的标准挂载点,例如 CD-ROM 或数码相机。
/net整个远程文件系统的标准挂载点
/opt通常包含额外的和第三方软件。
/proc一个虚拟文件系统,包含有关系统资源的信息。有关proc中文件含义的更多信息,可以通过在终端窗口中输入命令 man proc 来获得。文件proc.txt详细讨论了虚拟文件系统。
/root管理用户的根目录。请注意 /,根目录和 /root,*root* 用户的主目录之间的区别。
/sbin供系统和系统管理员使用的程序。
/tmp供系统使用的临时空间,重新启动时会清除,所以不要用它来保存任何工作!
/usr程序、库、文档等,用于所有用户相关的程序。
/var存储所有变量文件和用户创建的临时文件,例如日志文件、邮件队列、打印后台处理程序区域、用于临时存储从 Internet 下载的文件或用于保存 CD 映像的空间在刻录之前。

您如何找出目录所在的哪个分区?使用 df 命令并使用点 (.) 作为选项会显示当前目录所属的分区,并告知有关此分区上使用的空间量的信息

sandra:/lib> df -h .
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda7             980M  163M  767M  18% /

一般来说,根目录下的每个目录都在根分区上,除非它在 df 的完整列表中有一个单独的条目(或没有其他选项的 df -h)。

阅读更多信息请参考 man hier

3.1.3.2. 现实中的文件系统

对于大多数用户和大多数常见的系统管理任务,接受文件和目录以树状结构排列就足够了。然而,计算机不了解任何关于树或树结构的事情。

每个分区都有自己的文件系统。通过想象所有这些文件系统在一起,我们可以形成整个系统的树形结构的概念,但这并不像那么简单。在文件系统中,文件由 *inode* 表示,这是一种包含有关构成文件的实际数据的信息的序列号:此文件属于谁,以及它在硬盘上的哪个位置。

每个分区都有自己的一组 inode;在具有多个分区的系统中,可以存在具有相同 inode 编号的文件。

每个 inode 描述了硬盘上的数据结构,存储了文件的属性,包括文件数据的物理位置。当初始化硬盘以接受数据存储时,通常在初始系统安装过程或向现有系统添加额外的磁盘时,每个分区会创建固定数量的 inode。此数字将是可以同时存在于分区上的所有类型的文件(包括目录、特殊文件、链接等)的最大数量。我们通常指望每 2 到 8 千字节的存储空间有 1 个 inode。

在创建新文件时,它会获得一个空闲 inode。在该 inode 中包含以下信息

  • 文件的所有者和组所有者。

  • 文件类型(常规、目录...)

  • 文件的权限 第 3.4.1 节

  • 创建、上次读取和更改的日期和时间。

  • inode 中此信息已更改的日期和时间。

  • 指向此文件的链接数(请参阅本章稍后部分)。

  • 文件大小

  • 定义文件数据实际位置的地址。

inode 中未包含的唯一信息是文件名和目录。这些存储在特殊的目录文件中。通过比较文件名和 inode 编号,系统可以构成用户可以理解的树状结构。用户可以使用-i选项来显示 inode 编号。inode 在磁盘上有自己的单独空间。