Jun*_*aga 5 filesystems devices block-device
这张来自 TLDP 的图片非常棒。它表明,在为用户空间提供对文件系统的实际读、写和开放访问权限之前,这些块已映射到虚拟文件系统上。
和维基百科说,有不同的层上的文件系统的3个版本。
那么,标准(sd 节点)是指物理文件系统还是在LVM映射之后的虚拟文件系统?
还是他们只是指分区?(这意味着直接写入分区会跳过文件系统驱动程序,否则您甚至无法与文件本身进行交互)
如果是这种情况,什么设备代表文件系统驱动程序/或文件系统或....我只是不知道..有人可以链接我一些解释内核磁盘使用情况的东西吗?
tl;dr:/dev/sdaX
代表一个分区。我认为您的一个基本误解是文件系统和分区之间的区别。分区真的很简单——基本上它只是磁盘的一部分,在磁盘开头的分区表中定义。然而,文件系统是一种更高级的东西。文件系统本质上是一种数据结构,用于跟踪内核(特别是文件系统驱动程序)能够读写的文件。该数据结构在技术上可以放在磁盘上的任何位置,但预计 fs 数据结构的开头与分区的开头相同。
您在问题中提到了 LVM - 让我们暂时忘记这一点,因为这是一个更高级的主题(我将在最后解释 LVM)。
假设您有一个只有零的 100GB 硬盘。在这种情况下,您将拥有一个/dev/sda
文件,您可以从中获取 100GB(尽管例如du
将其报告为零长度,因为它是一个特殊的块)并且只包含零。/dev/sda
是内核将原始设备内容暴露给用户空间进行读写的方法。这就是为什么它与您的磁盘具有相同的数据量并且与您的磁盘具有相同的内容。如果将第五位翻转/dev/sda
为 1 而不是零,内核将翻转物理驱动器上的第五位以匹配。在您提供的图表中,此写入将通过系统调用接口进入内核,然后通过 IDE 硬盘驱动程序,最后到达硬盘本身。
现在假设您想对该驱动器执行一些有用的操作,例如在其上存储文件。现在你需要一个文件系统。在 Linux 内核中有多种文件系统可供您使用。他们每个人都在磁盘上使用不同的数据结构来跟踪文件,他们也可能以不同的方式修改他们的数据结构,例如提供原子写保证(即写要么成功要么不成功;永远不会有即使机器崩溃,也可以写入一半的数据)。这就是人们谈论“文件系统驱动程序”时的意思:文件系统驱动程序是一段代码,它了解如何在磁盘上读写特定文件系统的数据结构。示例包括 ext4、btrfs、XFS 等。
所以你要存储文件。假设您选择 ext4 作为文件系统。您现在需要做的是格式化磁盘,以便磁盘上存在空文件系统的数据结构。为此,您使用mkfs.ext4
并告诉它写入/dev/sda
. mkfs.ext4
然后将写入一个空的 ext4 文件系统,从/dev/sda
. 然后内核将写入/dev/sda
并将它们应用到物理磁盘的开头。现在磁盘包含文件系统的数据结构,您可以执行例如mount /dev/sda /mnt
挂载全新的文件系统,将文件移动到其中等。对文件的任何写入/mnt
然后将通过系统调用接口,然后到 ext4 文件系统驱动程序(它知道如何将更抽象的“将此数据写入某个文件”转换为需要对 fs 数据进行的具体更改结构在磁盘上),然后是 IDE 硬盘驱动程序,最后是驱动器本身。
现在,上面的方法会起作用,但这不是人们做事的方式。通常他们使用驱动器上的分区。分区基本上只是驱动器的特定部分。当您使用分区时,在驱动器的开头有一个分区表,说明每个分区的物理位置。分区很整洁,因为它们允许您将驱动器分成可用于不同目的的多个部分。
因此,假设您要在驱动器上创建两个文件系统,均为 ~50GB(即一半一半)。首先,您必须对驱动器进行分区。为了做到这一点,您需要使用类似fdisk
或的工具gdisk
,这两种工具都会创建不同类型的分区表,并且您会告诉您的工具写入/dev/sda
. 当你完成分区,你必须/dev/sda
,/dev/sda1
和/dev/sda2
。/dev/sda1
和/dev/sda2
是内核表示磁盘中不同分区的方式。如果你写到 的开头/dev/sda2
,它会写到第二个分区的开头,也就是磁盘的中间。
解释这一点的另一种方法是谈论/dev/sda
. 回想一下,/dev/sda
物理硬盘驱动器的内容。并且/dev/sda1
是逐位表示硬盘驱动器第一个分区的内容。这意味着/dev/sda
有一点数据 - 分区标头 - 后面是/dev/sda1
,然后的确切内容/dev/sda2
。/dev/sda1
并/dev/sda2
映射到磁盘上的特定区域,这些区域是您配置的分区。
从这里我们可以mkfs.ext4
再次使用在 上创建文件系统/dev/sda1
,它将直接写入分区头之后的磁盘。如果我们使用mkfs.ext4
on /dev/sda2
,它会从分区的开头开始写入,该分区位于磁盘的中间(因此在/dev/sda
的内容中间)。
现在,你可以做例如mount /dev/sda2 /mnt
。这告诉内核从第二个分区的开头开始读取文件系统数据,并以更有用的形式向您公开它 - 即该位置的文件和目录/mnt
。同样,内核使用文件系统驱动程序来实际执行此映射。
现在让我们简单地谈谈 LVM。LVM 基本上只是对分区的抽象。分区非常非常直接地映射到磁盘上的物理位置。在上面的双分区示例中,假设您要删除第一个分区并将第二个分区扩展到新释放的空间。因为分区直接映射到磁盘区域,所以唯一的方法是将整个 50GB 的分区数据物理移动到磁盘的开头,然后将分区扩展到结尾。
LVM 旨在减轻这种痛苦。基本上,您给 LVM 一堆原始存储,然后告诉它如何使用该存储。LVM 为您提供了一个虚拟“磁盘”,它可以像分区一样进行划分,但其底层存储可以位于您为其分配的原始存储池中的任何位置。使用上面的例子,如果你给 LVM 整个磁盘使用,然后把它分成两个,你可以删除第一个“分区”并扩展第二个“分区”以立即填充该空间,因为 LVM 能够跟踪数据在磁盘上的位置,而不要求它严格“按顺序”。
有关 LVM 工作原理的更多详细信息,请参阅此答案:https : //unix.stackexchange.com/a/106871/29146