Linux文件系统深度讨论

本文旨在对Linux文件系统概念高级工作方式进行的讨论,不是对特定文件系统类型(如EXT4)如何工作的低级描述,也不是对文件系统命令的教程。

每台通用计算机都需要将各种类型的数据存储在硬盘驱动器(HDD)或某些等效设备上,例如USB存储棒。这有几个原因,首先,当计算机关闭时RAM会丢失其内容,有一些非易失性类型的RAM可以在断电后维持存储在那里的数据(例如USB存储棒和固态驱动器中使用的闪存RAM),但闪存RAM比易失性RAM要昂贵得多。

数据需要存储在硬盘驱动器上的第二个原因是,即标准RAM仍然比磁盘空间更昂贵。RAM和磁盘成本都在迅速下降,但RAM仍然在每字节成本方面处于领先地位。根据16GB RAM与2TB硬盘驱动器的成本,计算每字节成本,表明RAM的单位成本比硬盘高出约71倍。 RAM的典型成本约为每字节0.0000000043743750美金。

为了快速记录目前的RAM成本,在计算的早期阶段,一种类型的存储器是基于CRT屏幕上的点。这非常昂贵,每位约1.00美元!

定义

可能会听到人们以多种不同且令人困惑的方式谈论文件系统。单词本身可以有多种含义,可能必须从讨论或文档的上下文中辨别出正确的含义。

我将尝试根据在不同情况下使用它的方式来定义“文件系统”一词的各种含义。请注意,在尝试遵循标准的“官方”含义时,我的意图是根据其各种用法来定义该术语。将在本文的以下部分中更详细地探讨这些含义。

1. 整个Linux目录结构从顶部(/)根目录开始。

2. 特定类型的数据存储格式,例如EXT3,EXT4,BTRFS,XFS等。Linux支持近100种类型的文件系统,包括一些非常旧的文件系统以及一些最新的文件系统。这些文件系统类型中的每一种都使用其自己的元数据结构来定义数据的存储和访问方式。

3. 使用特定类型的文件系统格式化的分区或逻辑卷,可以安装在Linux文件系统上的指定挂载点上。

基本文件系统功能

磁盘存储是必不可少的,它带来了一些有趣且不可避免的细节。显然,文件系统旨在为非易失性数据存储提供空间;这是它的终极功能。但是,还有许多其他重要功能来自该要求。

所有文件系统都需要提供命名空间,即命名和组织方法。这定义了如何命名文件,特别是文件名的长度,以及可用于字符总数中的文件名的字符子集。它还定义了磁盘上数据的逻辑结构,例如使用目录来组织文件,而不是将它们全部集中在一个巨大的文件集合中。

定义命名空间后,需要元数据结构来为该命名空间提供逻辑基础。这包括支持分层目录结构所需的数据结构;用于确定磁盘上哪些空间块,以及哪些可用空间的结构;允许维护文件和目录名称的结构;有关文件的信息,例如它们的大小和创建,修改或上次访问的时间;以及属于磁盘上文件的数据的位置或位置。其他元数据用于存储有关磁盘细分的高级信息,例如逻辑卷和分区。此更高级别的元数据及其表示的结构包含描述存储在驱动器或分区上的文件系统的信息,但是与文件系统元数据分离并独立于文件系统元数据。

文件系统还需要一个应用程序编程接口(API),它提供对系统函数调用的访问,这些函数调用操作文件系统对象,如文件和目录。 API提供创建,移动和删除文件等任务。它还提供了一些算法,用于确定文件放在文件系统中的位置。这样的算法可以解决诸如速度或最小化磁盘碎片之类的目标。

现代文件系统还提供安全模型,该模型是用于定义文件和目录的访问权限的方案。Linux文件系统安全模型有助于确保用户只能访问自己的文件,而不能访问其他文件或操作系统本身。

最后的构建块是实现所有这些功能所需的软件。Linux使用两部分软件实现来提高系统和程序员的效率。

图1:Linux两部分文件系统软件实现

这个由两部分组成的实现的第一部分是Linux虚拟文件系统。这个虚拟文件系统为内核和开发人员提供了一组命令来访问所有类型的文件系统。虚拟文件系统软件调用与各种类型的文件系统接口所需的特定设备驱动程序。特定于文件系统的设备驱动程序是实现的第二部分。设备驱动程序将标准文件系统命令集解释为特定于分区或逻辑卷上的文件系统类型的命令。

目录结构

作为一个非常有处女座情节的人,我喜欢存储在较小的,有组织的目录,而不是把所有东西都放到一个目录中。目录的使用帮助我能够存储,并且在我想要时,找到相关文件,目录也称为文件夹。

在Linux和许多其他操作系统中,目录以树状层次结构构建。Linux目录结构在文件系统层次结构标准(FHS)中得到了很好的定义和记录。访问它们时引用这些目录是通过使用正斜杠(/)连接的顺序更深的目录名来完成的,例如/var/log和/var/spool/mail,这些被称为路径。

下表提供了标准,众所周知和已定义的顶级Linux目录及其用途的简要列表。

表1:Linux文件系统层次结构的顶级

表1中具有青色背景的表示目录及其子目录及,被视为根文件系统的组成部分。也就是说,它们不能创建为单独的文件系统并在启动时挂载。这是因为它们(具体地说,它们的内容)必须在引导时出现,以便系统正确引导。

/media和/mnt目录是根文件系统的一部分,但它们永远不应包含任何数据。相反,它们只是临时挂载点。

其余目录(表1中没有背景颜色的目录)在引导期间不需要必须存在,但是将在稍后,在准备主机执行有用工作的启动期间安装。

请务必参阅官方Linux文件系统层次结构标准(FHS)网页,以获取有关每个目录及其许多子目录的详细信息。维基百科也对FHS有很好的描述。应尽可能遵循该标准,以确保操作和功能的一致性。无论主机上使用的文件系统类型如何,此分层目录结构都是相同的。

Linux统一目录结构

在某些非Linux PC操作系统中,如果有多个物理硬盘驱动器或多个分区,则会为每个磁盘或分区分配一个驱动器号。有必要知道文件或程序所在的硬盘驱动器,例如C:或D:。然后将驱动器号作为命令D:发出,例如,更改为D:驱动器,然后使用cd命令切换到正确的目录以找到所需的文件。每个硬盘驱动器都有自己独立的完整目录树。

Linux文件系统将所有物理硬盘驱动器和分区统一到一个目录结构中。这一切都从顶部,根(/)目录开始。所有其他目录及其子目录位于单个Linux根目录下。这意味着只有一个目录树可用于搜索文件和程序。

这可以起作用,因为可以在/(根)文件系统上的单独物理硬盘驱动器,不同分区或不同逻辑卷上创建文件系统,例如/home,/tmp,/var,/opt或/usr然后作为根文件系统树的一部分挂载在mountpoint(目录)上。甚至可移动驱动器(如USB驱动器或外部USB或ESATA硬盘驱动器)也将安装到根文件系统上,并成为该目录树的组成部分。

在从一个版本的Linux发行版升级到另一个版本,或从一个发行版更改为另一个发行版时,挂载是显而易见的一个很好的理由。一般而言,除了Fedora中的dnf-upgrade之类的任何升级实用程序之外,在升级期间偶尔重新格式化包含操作系统的硬盘驱动器是明智的,以积极地消除随时间累积的任何残余物。如果/home是根文件系统的一部分,它也将被重新格式化,然后必须从备份中恢复。通过将/home作为单独的文件系统,安装程序将其称为单独的文件系统,并且可以跳过它的格式化。这也适用于/var,其中存储数据库,电子邮件收件箱,网站和其他可变用户和系统数据。

将Linux目录树的某些部分维护为单独的文件系统还有其他原因。例如,很久以前,当我还没有意识到将所有必需的Linux目录作为/(根)文件系统的一部分的潜在问题时,我设法填充了我的主目录中的大量非常大文件。由于/ home目录和/ tmp目录都不是单独的文件系统,而是根文件系统的子目录,因此整个根文件系统都已填满。操作系统没有空间来创建临时文件或扩展现有数据文件。起初,应用程序开始抱怨没有保存文件的空间,然后操作系统本身开始表现得非常奇怪。引导到单用户模式并清除主目录中的有问题的文件,允许我再次开始。然后,我使用非常标准的多文件系统设置重新安装Linux,并且能够防止再次发生整体的系统崩溃。

我曾经遇到Linux主机继续运行的情况,但阻止用户使用GUI桌面登录。我能够使用其中一个虚拟控制台在本地使用命令行界面(CLI)登录,并使用SSH远程登录。问题是/tmp文件系统已经填满,并且在登录时无法创建GUI桌面所需的一些临时文件。由于CLI登录不需要在/tmp中创建文件,因此缺少空间并不会阻止我使用CLI登录。在这种情况下,/tmp目录是一个单独的文件系统,并且/tmp逻辑卷所属的卷组中有足够的可用空间。我只是将/tmp逻辑卷扩展到一个大小,以便我对该主机所需的临时文件空间量有了新的理解,并解决了问题。请注意,此解决方案不需要重新启动,并且只要放大/tmp文件系统,用户就可以登录到桌面。

当我在一家大型科技公司担任实验室管理员时,又出现了另一种情况。我们的一位开发人员在错误的位置(/var)安装了一个应用程序。应用程序崩溃是因为/var文件系统已满并且由于缺少空间而无法在该文件系统上的/var/log中存储日志文件。但是,系统保持启动并运行,因为关键/(根)和/tmp文件系统没有填满。删除违规应用程序并在/opt文件系统中重新安装它可以解决该问题。

文件系统类型

Linux支持读取大约100种分区类型;它只能创建和写入其中的一小部分。但是在同一个根文件系统上安装不同类型的文件系统是可能的,而且很常见。在此上下文中,我们讨论了在硬盘驱动器或逻辑卷的分区上存储和管理用户数据,所需的结构和元数据方面的文件系统。此处提供了Linux fdisk命令识别的文件系统分区类型的完整列表,以便了解Linux与许多类型的系统之间的高度兼容性。

0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT- 4 FAT16

支持读取这么多分区类型的能力的主要目的是,允许兼容性和至少一些与其他计算机系统的文件系统的互操作性。使用Fedora创建新文件系统时可用的选项如下表所示。

•btrfs

•cramfs

•ext2

•ext3

•ext4

•fat

•gfs2

•hfsplus

•minix

•msdos

•ntfs

•reiserfs

•vfat

•xfs

其他发行版支持创建不同的文件系统类型。例如,CentOS 6仅支持在上面的列表中创建以粗体突出显示的文件系统。

挂载

mount命令在Linux文件系统可以追溯到计算的早期阶段,当磁带或可移动磁盘包需要物理安装在适当的驱动器设备上时。在物理上放置在驱动器上之后,操作系统将逻辑地安装磁盘包上的文件系统,以使内容可供操作系统,应用程序和用户访问。

挂载点只是一个目录,就像任何其他目录一样,是作为根文件系统的一部分创建的。因此,例如,主文件系统挂载在目录/home上。文件系统可以挂载在其他非根文件系统的挂载点上,但这种情况不太常见。

Linux根文件系统在引导序列的早期挂载在根目录(/)上。其他文件系统稍后由Linux启动程序挂载,可以是SystemV下的rc,也可以是较新Linux版本中的systemd。在启动过程中挂载文件系统由/etc/fstab配置文件管理。记住这一点的一个简单方法是fstab代表“文件系统表”,它是要挂载的文件系统列表,它们的指定挂载点以及特定文件系统可能需要的任何选项。

使用mount命令将文件系统挂载在现有目录/挂载点上。通常,用作挂载点的任何目录都应为空,并且不包含任何其他文件。 Linux不会阻止用户将一个文件系统挂载到已存在的文件系统或包含文件的目录上。如果在现有目录或文件系统上挂载文件系统,则将隐藏原始内容,并且只显示新挂载的文件系统的内容。

结论

我希望本文能够解决围绕术语文件系统的一些可能的混淆。我花了很长时间和一个非常有帮助的导师才能真正理解和欣赏Linux文件系统的复杂性,优雅和功能的所有含义。

https://opensource.com/life/16/10/introduction-linux-filesystems

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181011B1UNQZ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券