答案1
太长了;博士:/dev/sdaX
代表一个分区。我认为您的一个根本误解是文件系统和分区之间的区别。分区非常简单 - 基本上它只是磁盘的一部分,在磁盘开头的分区表中定义。然而,文件系统是一个更高级的东西。文件系统本质上是一种数据结构,用于跟踪内核(特别是文件系统驱动程序)能够读取和写入的文件。从技术上讲,该数据结构可以放置在磁盘上的任何位置,但预计 fs 数据结构的开头与分区的开头相同。
您在问题中提到了 LVM - 让我们暂时忘记它,因为这是一个更高级的主题(我将在最后解释 LVM)。
假设您有一个 100GB 硬盘,除了零之外什么都没有。在这种情况下,您将拥有一个/dev/sda
100GB 的文件(尽管例如du
将其报告为零长度,因为它是一个特殊的块)并且只包含零。/dev/sda
是内核将原始设备内容公开给用户空间进行读写的方法。这就是为什么它具有与您的磁盘相同的数据量以及与您的磁盘相同的内容。如果将第五位翻转/dev/sda
为 1 而不是 0,内核将翻转物理驱动器上的第五位以进行匹配。在您提供的图中,此写入将通过系统调用接口进入内核,然后通过 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
答案2
/dev/sda
是整个硬盘驱动器的接口。如果您有权限,您可以直接在驱动器中的任何位置进行查找。/dev/sda1
是驱动器上的第一个分区。此时还没有涉及文件系统。分区内可以直接有文件系统,也可以是LVM容器。