当前位置: 首页 > Linux

翻译:Linux文件系统简介

时间:2023-04-06 22:38:06 Linux

原文地址:https://opensource.com/life/1...原文翻译地址:http://www.tony-yin.top/2017/...本文旨在深入讨论Linux文件系统概念。本文既不是对特定类型文件系统(例如ext4)的基本描述,也不是文件系统命令的教程。每台通用计算机都需要将各种类型的数据存储在硬盘驱动器(HDD)或USB等类似设备上。存储在这些设备上有几个原因,首先,当计算机断电时,RAM会丢失其内容,尽管也有非易失性类型的存储器可以在电源关闭后保持数据存储(例如闪存也是使用USB和SSD的闪存),但闪存比一些标准的、易失性内存(如DDR3和其他类似类型)贵得多。数据需要存储在硬盘驱动器上的第二个原因是,即使是标准的RAM也比磁盘空间更昂贵。RAM和磁盘成本都在迅速下降,但RAM的每字节成本仍然更高。基于16GBRAM和2TB硬盘驱动器成本的每字节成本快速计算表明,RAM比硬盘驱动器贵大约71倍。目前,RAM的典型成本约为每字节0.0000000043743750。说白了,在计算的早期,一种基于CRT屏幕上的点的内存大约1美元一块,非常非常昂贵!定义您可能听到人们经常使用不同的或混淆的术语方式来谈论文件系统这个词。这个词本身可能有多种含义,您可能需要从讨论或文档的上下文中辨别真正的含义。我将尝试根据我在不同情况下的使用方式来定义“文件系统”的各种含义。请注意,在尝试遵循标准的“官方”含义时,我的意图是根据其各种用法来定义该术语。本文后面的小节将更详细地讨论这些影响。整个Linux目录结构从顶级(/)根目录开始。各种特定类型的数据存储格式,如EXT3、EXT4、BTRFS、XFS等。Linux支持近百种文件系统,包括一些非常古老的和一些非常新的。每种文件系统类型都使用自己的元数据结构来定义数据的存储和访问方式。可以将使用特定类型的文件系统格式化的分区或逻辑卷挂载到Linux文件系统的指定挂载点。基本文件系统功能需要磁盘存储,这引入了一些有趣且不可避免的细节。显然,文件系统的设计目的就是为数据的非易失性存储提供空间,这是它最根本的功能。但它还有许多其他重要功能,可满足不同的需求。所有的文件系统都需要提供命名空间(namespace)——即命名和组织方式。它定义了文件的命名方式,特别是文件名的长度和可用于文件名的字符子集,这些字符可以取自完整的字符集。它还定义了磁盘上数据的逻辑结构,例如使用目录来组织文件而不是将它们集中在一个巨大的文件集中。一旦定义了名称空间,就需要元数据结构来为该名称空间提供逻辑基础。其中,元数据包括支持分层目录结构所需的数据结构;用于确定磁盘上哪些块空间已使用以及哪些可用的结构;允许维护文件和目录名称的结构;有关文件的信息,例如它们的大小和时间,例如创建时间、修改时间或上次访问时间等;以及属于该文件的数据在磁盘上的位置。还有一些其他元数据用于存储有关磁盘分区的高级信息,例如逻辑卷和分区。这种更高级别的元数据及其表示的结构包含描述存储在驱动器或分区上的文件系统的信息,这与上面提到的一般文件系统元数据是分开的。文件系统还需要一个API接口来提供对系统函数调用的访问,这些系统函数调用操作文件系统对象(例如文件和目录)。API提供创建、移动和删除文件等接口。它还提供算法来确定文件在文件系统中的位置。这些算法还可用于确定速度或最小化磁盘碎片等。现代文件系统还提供了一种安全模型,这是一种用于定义文件和目录访问权限的方案。Linux文件系统安全模型有助于确保用户只能访问自己的文件,而不能访问其他人或操作系统本身的文件。最后的构建块是完成所有这些工作所需的软件。为了提高系统和程序员的效率,Linux采用了两部分软件实现。

图1:Linux两部分文件系统软件实现
这两部分的第一部分是Linux虚拟文件系统。这个虚拟文件系统为内核和开发人员提供了一组命令来访问所有类型的文件系统。虚拟文件系统软件调用特定的设备驱动程序来连接各种类型的文件系统。文件系统特定的设备驱动程序是实施的第二部分。设备驱动程序根据特定分区或逻辑卷上的文件系统类型翻译和解释标准文件系统命令集。目录结构作为一个通常非常有条理的处女座,我喜欢把东西放在那些有条理的小地方,而不是一个大桶里。使用目录可以帮助我存储和定位我要查找的文件。目录也称为文件夹,因为它们可以被认为是您桌面上实际保存文件的文件夹。在Linux和许多其他操作系统中,目录可以按树状层次结构构建。Linux目录结构在Linux文件系统层次结构标准(FHS)中有明确定义和记录。在访问这些目录时引用这些目录是通过使用由正斜杠(/)连接的顺序更深的目录名称(/)来完成的,例如/var/log和/var/spool/mail。这些被称为路径。下表提供了标准的、众所周知的和已定义的顶级Linux目录及其用途的非常简短的列表。目录说明/(根文件系统)根文件系统是文件系统的顶级目录。它必须包含在安装其他文件系统之前启动Linux系统所需的所有文件。它必须包含引导文件系统其余部分所需的所有必需的可执行文件和库。系统启动后,所有其他文件系统都作为根文件系统的子目录安装在标准的、定义明确的安装点上。/binbin目录包含用户可执行文件。/boot包含引导Linux计算机所需的静态引导加载程序和内核可执行文件以及配置文件。/dev该目录包含系统中每个硬件设备的设备文件。这些不是设备驱动程序,而是代表计算机上每个设备并提供对这些设备的轻松访问的文件。/etc包含主机的本地系统配置文件。/home/home目录用于存放用户文件。每个用户在/home目录下都有一个子目录。/lib包含启动系统所需的共享库文件。/media可以挂载外部可移动媒体设备的地方,例如可以连接到主机的U盘。/mnt管理员在修复或操作文件系统时可以使用的常规文件系统(例如不可移动媒体)的临时挂载点。/opt供应商提供的应用程序等可选文件应放在此处。/root这不是根(/)文件系统。它是root用户的主目录。/sbin系统二进制文件。这些是用于系统管理的可执行文件。/tmp临时目录。由操作系统和许多程序用来存储临时文件。用户还可以临时存储文件。请注意,此处存储的文件可能随时被删除,恕不另行通知。/usr这些是可共享的只读文件,包括可执行二进制文件和库、man文件和其他类型的文档。/var可变数据文件存储在这里。这可能包括日志文件、MySQL和其他数据库文件、Web服务器数据文件、电子邮件收件箱等。
表1:Linux文件系统层次结构的顶层
表1所示的目录及其子目录及其子目录,其中背景色为蓝色的目录被认为是根文件系统中必不可少的成分。也就是说,它们不能创建为单独的文件系统,而是在引导时挂载。这是因为它们(尤其是它们的内容)必须在引导时出现,以便系统正确引导。/media和/mnt目录是根文件系统的一部分,但它们不应包含任何数据。相反,它们只是临时挂载点。对于其余目录,表1中没有背景颜色的目录不需要出现在引导序列中,而是稍后安装,让主机准备在引导序列中执行有用的工作。这些目录及其许多子目录的详细信息可以参考官方Linux文件系统层次结构标准(FHS)网页找到。维基百科对FHS也有很好的描述。应尽可能严格遵守该标准,以确保操作和功能的一致性。无论主机上使用的文件系统类型如何,这种分层目录结构都是相同的。Linux统一目录结构在一些非linuxPC操作系统中,如果有多个物理硬盘或多个分区,每个磁盘或分区都会分配一个盘符。要定位文件或程序在硬盘上的位置,需要一个盘符,例如C:或D:。然后,以命令的形式发出盘符D:,例如切换到D:盘,然后用cd命令切换到正确的目录,找到需要的文件。每个硬盘都有自己独立完整的目录树。Linux文件系统将所有物理硬盘和分区统一到一个目录结构中。这一切都从顶级(/)目录开始。所有其他目录及其子目录都位于Linux根目录下。这意味着只有一个目录树可以搜索文件和程序。它们之所以起作用,是因为/home、/tmp、/var、/opt、/usr等文件系统可以在不同分区的单独物理硬盘上创建,或者在不同的逻辑卷/(根)文件系统中创建,然后将其挂载到作为根文件系统树的一部分的挂载点(目录)。甚至像闪存驱动器或外部USB或ESATA硬盘驱动器这样的可移动驱动器也会安装到根文件系统中,并成为该目录树的组成部分。当从一个版本的Linux发行版升级到另一个版本,或者从一个发行版切换到另一个发行版时,文件系统这样做是有充分理由的。一般来说,除了像Fedora的dnf升级这样的升级工具外,偶尔重新格式化包含操作系统的硬盘驱动器是明智的,因为硬盘驱动器会擦除在升级过程中随着时间推移积累的所有内容。如果/home是根文件系统的一部分,它将被重新格式化,然后必须从备份中恢复。通过将/home格式化为一个独立的文件系统,在格式化根文件系统时,它会被识别为一个单独的文件系统,可以跳过当前步骤。这也适用于数据库、电子邮件收件箱、网站和其他可变用户和系统数据存储的目录/var。将Linux目录树的一部分维护为单独的文件系统还有其他原因。例如,很久以前,在我意识到作为/(根)文件系统的一部分所需的所有Linux目录存在潜在问题之前,我曾经用许多非常大的文件填充我的主目录。由于/home目录和/tmp目录不是独立的文件系统,只是根文件系统的子目录,所以填满了整个根文件系统。操作系统没有空间来创建临时文件或扩展现有数据文件。起初,应用程序开始抱怨没有空间来保存文件,然后操作系统本身开始表现得很奇怪。启动到单用户模式,并清除我的主目录中的问题文件让我重新开始。然后,我使用相当标准的多文件系统设置重新安装了Linux,并且能够防止再次发生完整的系统崩溃。我也遇到过Linux主机继续运行,但阻止用户使用GUI桌面登录的情况。我能够使用命令行界面(CLI)在本地使用虚拟控制台,并使用SSH远程使用虚拟控制台。问题是,/tmp文件系统已满,并且无法在登录时创建GUI桌面所需的一些临时文件。由于CLI登录不需要在/tmp中创建文件,空间不足并没有阻止我使用CLI登录。在这种情况下,/tmp目录是一个单独的文件系统,在/tmp逻辑卷所属的卷组中有大量可用空间。我只是将/tmp逻辑卷扩展到足够大的大小(实际上是LVM扩展)以满足我对主机所需的临时文件空间量的新需求,它解决了问题。请注意,此解决方案不需要重新启动,当/tmp文件系统扩大时,用户可以登录到桌面。逻辑卷扩容也可以参考我之前总结的一篇文章,简洁明了:LVM动态扩容另一种情况发生在我在一家大型科技公司做实验室管理员的时候。我们的一位开发人员将应用程序安装在错误的位置(/var)(我个人认为它不是安装在错误的位置,只是安装位置的可用空间不合适)。应用程序崩溃是因为/var文件系统已满,存储在/var/log/上的日志文件由于空间不足而无法添加新消息。然而,系统仍然保持运行,因为关键的/(root)和/tmp文件系统没有被填充。删除有问题的应用程序并将其重新安装到/opt文件系统解决了这个问题。(其实LVM的动态扩展也可以解决这个问题,要么扩大空间大小,要么更换空间大的文件系统。)其中一些而不是全部在分区上创建或写入文件。但是,在同一个根文件系统上挂载不同类型的文件系统是可能的,而且很常见。在这种情况下,我们讨论的是在硬盘分区或逻辑卷上存储和管理用户数据所需的结构和元数据。此处提供了Linuxfdisk命令可识别的文件系统分区类型的完整列表,因此您可以了解Linux与多种类型系统之间的高度兼容性。0空24NECDOS81Minix/oldLinbfSolaris1FAT1227HiddenNTFSWin82Linuxswap/Soc1DRDOS/sec(FAT-2XENIXroot39Plan983Linuxc4DRDOS/sec(FAT-3XENIXusr3cPartitionMagic84OS/2hidden或c6DRDOS/sec(FAT-4FAT16<32M40Venix8028685Linuxextendedc7Syrinx5Extended41PPCPRePBoot86NTFSvolumesetdaNon-FSdata6FAT1642SFS87NTFSvolumesetdbCP/M/CTOS/.7HPFS/NTFS/exFAT4dQNX4.x88LinuxplaintextdeDellUtility8AIX4eQNX4.x2ndpart8eLinuxLVMdfBootIt9AIXbootable4fQNX4.x3rdpart93Amoebae1DOSaccessaOS/2BootManag50OnTrackDM94AmoebaBBTe3DOSR/ObW95FAT3251OnTrackDM6Aux9fBSD/OSe4SpeedStorcW95FAT32(LBA)52CP/Ma0IBMThinkpadhieaRufusalignmenteW95FAT16(LBA)53OnTrackDM6Auxa5FreeBSDebBeOSfsfW95Ext'd(LBA)54OnTrackDM6a6OpenBSDeeGPT10OPUS55EZ-Drivea7NeXTSTEPefEFI(FAT-12/16/11HiddenFAT1256GoldenBowa8DarwinUFSf0林ux/PA-RISCb12Compaqdiagnostic5cPriamEdiska9NetBSDf1SpeedStor14HiddenFAT16<361SpeedStorabDarwinbootf4SpeedStor16HiddenFAT1663GNUHURDorSysafHFS/HFS+f2DOSsecondary17Hidden6HPFS/Netwareb7BSDIfsfbVMwareVMFS18ASTSmartSleep65NovellNetwareb8BSDIswapfcVMwareVMKCORE1bHiddenW95FAT370DiskSecureMultbbBootWizardhidfdLinuxraidauto1cHiddenW95FAT375PC/IXbcAcronisFAT3Hstep2LW95FAT180OldMinixbeSolarisbootffBBT具有支持读取这么多分区类型的能力的主要目的是允许在使用Fedora创建新文件系统时与可用的其他计算机系统的文件系统具有兼容性和一些互操作性,选项如下。btrfscramfsext2ext3ext4fatgfs2hfsplusminixmsdosntfsreiserfsvfatxfs其他发行版支持创建不同的文件系统类型。例如,CentOS6只支持创建上面列表中粗体显示的文件系统。挂载在Linux中,挂载一词是指需要将磁带或可移动磁盘包物理挂载到适当驱动器上的早期计算。磁盘物理放置后,磁盘包上的文件系统由操作系统逻辑挂载,使操作系统、应用程序和用户可以访问其中的内容。挂载点只是一个目录,与其他目录一样,是作为根文件系统的一部分创建的。例如,主文件系统挂载在目录/home上。文件系统可以挂载在其他非根文件系统的挂载点上,但这并不常见。Linux根文件系统在引导序列的早期就挂载在根目录(/)上。后面会安装其他文件系统,通过Linux启动程序,无论是SystemV下的rc还是Linux新版本中的systemd,启动时挂载的文件系统都是由/etc/fstab配置文件管理的。一个容易记住的方法是fstab代表“文件系统表”,它是要挂载的文件系统列表,以及它们指定的挂载点,以及特定文件系统可能需要的任何选项。要在现有目录(挂载点)上挂载文件系统,请使用mount命令。通常,任何用作挂载点的目录都应该是空的,并且其中不包含任何其他文件。Linux不会阻止用户将文件系统挂载到已经存在的文件系统上,或者挂载到包含文件的目录上。如果在现有目录或文件系统上挂载文件系统,原始内容将被隐藏,只有新挂载文件系统的内容可见。结束语我希望本文已经消除了围绕术语“文件系统”的一些可能的混淆。我花了很长时间才真正理解和欣赏Linux文件系统的复杂性、优雅性和功能。如果您有任何问题,请在下面的评论中添加,我会尽力回答。下个月出现的另一个重要概念是,对于Linux,一切皆文件。这个概念对用户和系统管理员有一些有趣和重要的实际应用。我提到这个是因为您可能想在我下个月关于/dev目录的文章之前阅读我的EverythingIsaFile文章。