什么是文件系统?
文件系统是操作系统用于明确存储设备(通常是磁盘,也可能是基于 NAND Flash 的固态硬盘)或分区上文件的方法和数据结构;即在存储设备上组织文件的方式。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,以及对象及其属性。从系统的角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体而言,它负责为用户建立文件,存入、读取、修改、转储文件,控制文件的存取,以及在用户不再需要时撤销文件等。
在 Linux 系统下,我们首先执行以下命令并查看输出:
ls -l /
对于 Linux 软件开发人员来说,对 Linux 系统的目录结构应该已经非常熟悉了。文件系统可以根据其结构而变化,但在大多数情况下,它们应该遵循文件系统层次标准。执行 ls -l /
命令来查看根目录下列出的目录。你的目录可能与我的有些许不同,但它们应该大致如下所示:
我们来看一下各个目录都是做什么用的:
文件系统分很多种类,有许多不同的文件系统实现可用。有些比其他的更快,有些支持更大容量的存储,而另一些只能在更小容量的存储上工作。不同的文件系统有不同的组织数据的方式。由于有很多不同的实现,应用程序需要一种方法来处理不同的操作。因此,有一种东西叫做虚拟文件系统抽象层。它是应用程序和不同文件系统类型之间的一层,因此无论拥有什么文件系统,你的应用程序都能够使用它。
你的磁盘上可以有许多文件系统,这取决于它们是如何分区的。
Linux系统中日志记录
在大多数文件系统类型上,日志记录是默认的,但是为了以防万一,你应该知道它是做什么的。假设你正在复制一个大文件,突然断电。如果你使用的是一个没有日志记录的文件系统,那么文件最终会损坏,你的文件系统也会不一致,然后当你重新启动时,系统将执行文件系统检查以确保一切正常。但是,修复可能需要一段时间,这取决于你的文件系统有多大。
现在,如果你使用的是带日志记录的系统,在你的机器开始复制文件之前,它会将你将要做的事情写入日志文件。当你实际复制文件时,一旦它完成,日志将该任务标记为完成。因此,文件系统总是处于一致的状态,因此,如果你的机器突然关闭,它将确切地知道你停止的位置。这也减少了引导时间,因为它不检查整个文件系统,只查看日志。
常见桌面文件系统类型
查看以下Ubuntu系统上的文件系统:
硬盘可以细分为多个分区,本质上就是多个块设备。回想一下这样的例子,/dev/sda1和/dev/sda2, /dev/sda是整个磁盘,但是/dev/sda1是磁盘上的第一个分区。分区对于分离数据非常有用,如果你需要某个文件系统,可以轻松地创建一个分区,而不是将整个磁盘设置为一种文件系统类型。
分区表每个磁盘都有一个分区表,这个表告诉系统磁盘是如何分区的。该表告诉你分区的开始和结束位置,哪些分区是可引导的,磁盘的哪些扇区分配给哪些分区等等。有两种主要的分区表方案,主引导记录(MBR)和GUID分区表(GPT)。
分区磁盘由帮助我们组织数据的分区组成。你可以在一个磁盘上有多个分区,它们不能相互重叠。如果有未分配给分区的空间,则称为空闲空间。分区的类型取决于你的分区表。在一个分区中,你可以拥有一个文件系统,也可以将一个分区专用于其他功能,如交换分区。
MBR
GPT
文件系统结构
文件系统是文件和目录的有组织的集合。在其最简单的形式中,它由一个管理文件的数据库和实际文件本身组成。
让我们看一下不同的分区表。下面是一个使用MBR分区表(msdos)的分区示例。你可以看到系统上的主分区、扩展分区和逻辑分区。
如果我们需要对磁盘进行分区。有很多工具可以做到这一点:
你可以创建一个文件系统:
sudo mkfs -t ext4 /dev/sdb2
就这么简单!mkfs(制作文件系统)工具允许我们指定我们想要的文件系统类型和位置。你只希望在新分区的磁盘上创建文件系统,或者在对旧磁盘重新分区时创建文件系统。如果你试图在现有文件系统之上创建一个文件系统,那么很可能会使你的文件系统处于损坏状态。
在你可以查看文件系统的内容之前,你必须挂载它。要做到这一点,我需要设备位置、文件系统类型和挂载点,挂载点是系统上文件系统将要附加的目录。我们要把设备挂载到一个挂载点。
首先创建挂载点,然后进行挂载:
mkdir /myTest sudo mount -t ext4 /dev/sdb2 /myTest
就这么简单!现在当我们转到/myTest目录时,我们可以看到文件系统的内容,-t指定文件系统的类型,然后是设备位置,然后是挂载点。
从挂载点卸载设备:
sudo umount /myTest 或者 sudo umount /dev/sdb2
请记住,内核按照找到设备的顺序命名设备。如果我们的设备名称在我们挂载它之后因为某种原因改变了怎么办? 你可以使用设备的通用唯一ID (UUID)而不是名称。
查询系统中块设备的uuid:
我们可以看到我们的设备名称、它们对应的文件系统类型和它们的uuid。现在,当我们想要挂载某个设备时,我们可以使用:
sudo mount UUID=59c03b23-fd61-4bfc-b9fa-570edf47a0b9 /myTest
大多数情况下,你不需要通过设备的uuid来挂载设备,使用设备名称要容易得多,而且通常情况下,操作系统知道挂载常见的设备,如USB驱动器。如果你需要在启动时自动挂载文件系统,就像你添加了一个辅助硬盘驱动器一样,可能会使用UUID。
当我们想在系统启动时自动挂载文件系统,我们可以将它们添加到文件系统表的缩写文件/etc/fstab
中。该文件包含已挂载的文件系统的永久列表。
每一行代表一个文件系统,字段是:
要添加一个条目,只需使用上面的条目语法直接修改/etc/fstab文件。修改这个文件时要小心,如果搞砸了,可能会给带来一些麻烦
其中swap
属于交换分区,这个交换分区是什么?交换是我们用来给系统分配虚拟内存的。如果内存不足,系统会使用这个分区将空闲进程的内存“交换”到磁盘,这样就不会陷入内存困境。
使用分区作为交换空间假设我们希望将/dev/sdb2分区设置为交换空间。
mkswap /dev/sdb2
初始化交换区swapon /dev/sdb2
将启用交换设备swapoff /dev/sdb2
通常应该分配大约两倍于内存的交换空间。但是现在系统通常已经足够强大并且有足够的内存。
你可以使用一些工具来查看磁盘的利用率:
df
命令显示当前挂载的文件系统的利用率。-h
标志提供了一种可读的格式。你可以看到设备是什么,以及有多少容量被使用和可用。
假设你的磁盘快要满了,你想知道哪些文件或目录占用了这些空间,你可以使用du
命令。
du -h
有时我们的文件系统并不总是处于最佳状态,如果我们突然关闭系统,我们的数据可能会损坏。这取决于系统是否试图让我们回到工作状态。
fsck
(文件系统检查)命令用于检查文件系统的一致性,甚至可以尝试为我们修复它。通常,当你启动磁盘时,fsck将在磁盘挂载之前运行,以确保一切正常。但有时磁盘非常糟糕,需要手动执行此操作。但是,一定要在你处于修复磁盘或可以在不挂载的情况下访问文件系统的地方执行此操作。
sudo fsck /dev/sdb1
还记得我们的文件系统是如何由实际文件和管理这些文件的数据库组成的吗?该数据库称为索引节点表。
**什么是索引节点?**索引节点(inode)是该表中的一个条目,每个文件都有一个索引节点。它描述了关于文件的所有内容,例如:
**什么时候创建索引节点?**创建文件系统时,也会为索引分配空间。有一些算法可以根据磁盘容量等确定需要多少索引节点空间。你可能在某些时候看到过磁盘空间不足的错误问题。同样的情况也会发生在索引节点上,你可能会耗尽索引节点,因此无法创建更多的文件
索引节点信息索引节点是由数字标识的,当一个文件被创建时,它被分配一个索引号,这个编号是按顺序分配的。然而,有时你可能会注意到,当你创建一个新文件时,它得到的索引号比其他文件低,这是因为一旦索引被删除,它们就可以被其他文件重用。查看索引编号执行ls -li
命令:
该命令的第一个字段列出了索引号。
你还可以使用stat
查看有关文件的详细信息,它还会告诉你有关索引节点的信息。
在Windows操作系统中,有一种叫做快捷键的东西,快捷键只是其他文件的别名。如果对原始文件做了一些操作,可能会破坏快捷方式。在Linux中,等同于快捷方式的是符号链接
(或软链接或符号链接)。symlinks允许我们通过文件名链接到另一个文件。Linux中的另一种类型的链接是硬链接
,它们实际上是另一个指向索引节点的链接文件。
可以看到,我创建了一个名为myFile1Link的符号链接,指向myFile1。符号链接用->
表示。注意我是如何获得一个新的节点号的,符号链接只是指向文件名的文件。当你修改符号链接时,文件也会被修改。节点号对于文件系统是唯一的,你不能在一个文件系统中有两个相同的节点号,这意味着你不能通过节点号在不同的文件系统中引用文件。但是,如果你使用符号链接,它们不使用节点号,而是使用文件名,因此可以跨不同的文件系统引用它们。
硬链接只是创建另一个文件,该文件具有到同一节点的链接。因此,如果我修改了myFile2或myFile2link的内容,两者都将看到更改,但如果我删除了myFile2,则仍然可以通过myFile2link访问该文件。这就是ls命令中的链接计数发挥作用的地方。链接数是一个节点拥有的硬链接的数量,当你删除一个文件时,它会减少链接数。只有当节点的所有硬链接都被删除时,节点才会被删除。当你创建一个文件时,它的链接计数是1,因为它是唯一指向该节点的文件。与符号链接不同,硬链接不跨文件系统,因为索引节点对于文件系统是唯一的。
好了,这次就总结到这里吧。本文我们总结了Linux系统下文件系统相关的常用且重要的知识点,希望对小伙伴们有所帮助!喜欢的小伙伴记得
点赞👍、分享📃、再看☕
,你的每一个动作都是对作者的最大支持!