文件系统层次结构标准

作者:Kyle Rankin

这些奇怪的目录是什么?它们为什么在那里?

如果您是 Linux 命令行新手,您可能会发现自己想知道为什么有这么多不寻常的目录,它们是用来做什么的,以及为什么事物的组织方式是这样的。事实上,如果您不习惯 Linux 如何组织文件,这些目录看起来可能完全是任意的,名称被奇怪地截断,并且在许多情况下名称是冗余的。事实证明,这种“疯狂”背后是有方法的,它基于数十年的 UNIX 惯例,在本文中,我将介绍 Linux 目录结构。

尽管每个 Linux 发行版都有其自身的怪癖,但大多数发行版(在很大程度上)都符合文件系统层次结构标准 (FHS)。FHS 项目始于 1993 年,其目标是就目录应如何组织以及哪些文件应存储在何处达成共识,以便发行版可以有一个单一的参考点来开展工作。关于目录结构的许多决定都是基于传统的 UNIX 目录结构,重点是服务器,并假设磁盘空间是宝贵的,因此机器可能具有多个硬盘驱动器。

/bin 和 /sbin

/bin 和 /sbin 目录旨在存储二进制可执行文件。这两个目录都存储被认为是启动系统所必需的可执行文件(例如 mount 命令)。这些目录之间的主要区别在于,/sbin 目录旨在用于系统二进制文件,或管理员将用于管理系统的二进制文件。

/boot

此目录存储所有引导加载程序文件(现在通常是 GRUB)、内核文件和 initrd 文件。它通常被视为一个单独的小分区,以便引导加载程序可以更轻松地读取它。通过将 /boot 放在单独的分区上,您的根文件系统可以使用更复杂的功能,这些功能需要内核支持,无论是异构文件系统、磁盘加密还是逻辑卷管理。

/etc

/etc 目录旨在存储系统配置文件。如果您需要在 Linux 系统上配置服务,或更改网络或其他核心设置,这是首先要查找的地方。这也是一个小型且易于备份的目录,其中包含您可能对计算机在系统级别进行的大多数自定义设置。

/home

/home 目录是 Linux 系统上用户被赋予目录以存储其自身文件的位置。/home 下的每个目录都以特定用户的用户名命名,并且归该用户所有。在服务器上,这些目录可能存储用户的电子邮件、其 SSH 密钥,有时甚至存储用户在高端口上运行的本地服务。

在桌面系统上,/home 目录可能是用户与之交互的主要目录。任何桌面设置、图片、媒体、文档或用户需要的其他文件最终都存储在其 /home 目录中。在桌面上,这是最重要的备份目录,并且通常是一个被赋予自己分区的目录。通过为 /home 提供自己的分区,您可以试验不同的 Linux 发行版,并在单独的 / 分区上重新安装完整的系统,然后当您挂载此 /home 分区时,您的所有文件和设置都将在您离开的位置。

/lib

/lib 目录存储 /bin 和 /sbin 中的基本二进制文件运行所需的基本共享库。这也是存储内核模块的目录。

/usr, /usr/bin, /usr/lib 和 /usr/sbin

/usr 目录(它既代表 UNIX 源代码库,也代表 UNIX 系统资源)旨在成为一个只读目录,用于存储启动系统不需要的文件。通常,当您从发行版安装其他软件时,其二进制文件、库和支持文件会放在此处,分别位于其对应的 /usr/bin、/usr/sbin 或 /usr/lib 目录以及其他一些目录中。当存储空间很宝贵时,您通常会将此目录单独挂载在自己的较大磁盘上,以便它可以在您添加新软件时独立增长。

如今,这种逻辑分离的需求较少——特别是由于系统倾向于将所有内容放在一个大的根分区中,并且 initrd 文件倾向于拥有挂载该文件系统所需的工具。一些发行版开始通过符号链接将 /bin、/sbin 和 /lib 与其对应的 /usr 目录合并。

/usr/local

/usr/local 目录是 /usr 的一个特殊版本,它具有自己的 bin、lib 和 sbin 目录的内部结构,但 /usr/local 旨在成为用户可以在发行版提供的软件之外安装自己的软件的地方,而无需担心覆盖任何发行版文件。

/opt

关于 /usr/local 和 /opt 之间的争论是传奇的,Bill Childers 和我甚至在我们自己的 Linux Journal 观点/反驳文章 中参与了一场辩论。本质上,这两个目录的用途相同——为用户提供一个在其发行版之外安装软件的位置——但 /opt 目录以不同的方式组织它。与 /usr 和 /usr/local 一样,/opt 目录不是将不同软件的二进制文件和库存储在共享目录中,而是为每个软件授予其自己的子目录,并按照其喜欢的方式组织其下的文件。这里的想法是,从理论上讲,您可以通过删除该软件的目录来卸载 /opt 中的软件。有关此方法相对优缺点的更多详细信息,请查看观点/反驳文章

/root

/root 目录是系统上 root 用户的特殊主目录。它归 root 用户所有且仅可由 root 用户读取,并且它的设计目的是在其他方面像 /home 目录一样运行,但用于 root 用户需要的文件和设置。如今,许多系统禁用 root 用户,而倾向于使用 sudo 来获得超级用户权限,因此此目录的使用频率远不如以前。

/var

正如我所提到的,经典的 UNIX 服务器的磁盘空间非常宝贵,/var 目录旨在存储大小可能变化很大或可能经常写入的文件。与只读的 /usr 不同,/var 目录绝对需要可写,因为在其中您会找到日志文件、邮件服务器假脱机以及其他可能来来去去或以其他方式以不可预测的方式增长大小的文件。

即使在今天,至少在服务器上,如果您必须选择一个根级目录放在自己的大磁盘上,/var 目录也将是列表中的第一个——不仅因为它的大小可能会变得相当大,而且还因为您可能希望将 /var 放在更适合重写操作的磁盘上。此外,如果您的所有目录都在一个大的根分区内,并且您耗尽了磁盘空间,则 /var 目录是开始搜索要删除的文件的好地方。

/dev

您将在此处找到设备文件。UNIX 系统有一个“一切皆文件”的原则,这意味着即使您的硬件最终也会有一个文件。此目录包含系统上设备的文件,从磁盘和分区到鼠标和键盘。

/proc 和 /sys

除了 /dev 之外,还有两个目录最终会包含动态文件,这些文件代表文件以外的其他内容。/proc 目录存储表示系统上所有正在运行的进程的信息的文件。您实际上可以使用 lscat 等工具来读取有关系统上运行的不同进程的状态的信息。此目录通常还包含 /proc/sys 中的文件,这些文件与内核交互,并允许您调整特定的内核参数和轮询设置。

虽然一些内核状态文件已出现在 /proc 中(特别是 /proc/sys),但如今,它们应该存储在 /sys 中。/sys 目录旨在包含所有这些允许您与内核交互的文件,并且此目录会动态填充文件,这些文件通常显示为嵌套的递归符号链接系列——在其中运行 find 等命令时要小心!

/srv

与某些目录相比,/srv 是一个有点新的目录。此目录旨在存储服务器可能在外部共享的文件。例如,这被认为是存储 Web 服务器文件的正确位置(/srv/www 很流行)。

/mnt 和 /media

当您向计算机添加额外的文件系统时,无论是来自 USB 驱动器、NFS 挂载还是其他来源,您都需要一些标准位置来挂载它们。这就是 /mnt 和 /media 的用武之地。/mnt 目录曾经是任何没有其他位置可去的已挂载磁盘的通用目录,但如今,您应该将此目录用于各种 NFS 挂载点和其他旨在始终挂载的磁盘。/media 目录专为临时挂载的磁盘而设计,例如 CD-ROM 和 USB 磁盘。

/tmp, /var/tmp 和 /dev/shm

即使是 Linux 也需要一个杂物抽屉,它提供了许多目录,这些目录旨在根据您希望保留临时文件的时间长短来存储临时文件。这些目录非常适合需要临时将一些数据存储在文件中的程序,但可能不需要数据永远保留,例如进程可以重新创建的缓存数据。使这些目录非常适合此目的的原因是它们是在任何用户都可以写入的权限下创建的。

/tmp 目录旨在存储在重新启动后不需要保留的临时文件。当 Linux 系统启动时,初始启动过程之一会清除 /tmp 目录中的所有文件。另一方面,/var/tmp 目录不会在重新启动之间清除,因此这是一个存储文件的好地方,例如您希望保留的缓存,即使您不是绝对需要它们。最后,/dev/shm 目录是一个小型 ramdisk,存储在那里的任何文件都仅驻留在 RAM 中,并且在系统关闭后,这些文件将被擦除。黑客喜欢出于这个原因将文件存储在 /dev/shm 中。如果您有存储敏感信息(如密码或机密)的临时文件,/dev/shm 目录是三者中最好的,因为它们永远不会接触磁盘——只需确保在将您的机密放在那里之前,为文件赋予适当的权限(如 0600),这样其他人就无法读取它们。

结论

我希望这次 Linux FHS 之旅有助于理解您磁盘上的所有各种目录。我只介绍了标准中定义的部分目录。如果您对系统上的其他一些目录感到好奇——特别是,如果您是开发人员并希望确保将文件存储在正确的位置——请参阅官方文件系统层次结构标准以获取更多详细信息。

资源

Kyle Rankin 是 Linux Journal 的技术编辑和专栏作家,也是 Purism 的首席安全官。他是 Linux Hardening in Hostile NetworksDevOps TroubleshootingThe Official Ubuntu Server BookKnoppix HacksKnoppix Pocket ReferenceLinux Multimedia HacksUbuntu Hacks 的作者,也是许多其他 O'Reilly 书籍的贡献者。Rankin 经常就安全和开源软件发表演讲,包括在 BsidesLV、O'Reilly Security Conference、OSCON、SCALE、CactusCon、Linux World Expo 和 Penguicon 上。您可以在 @kylerankin 上关注他。

加载 Disqus 评论