在不使用 LVM 的情况下添加 HDD 时扩展文件系统?

Lê *_*uân 2 filesystems hard-disk

当我在不使用 LVM 的情况下向文件系统添加更多硬盘时,是否有任何方法可以扩展文件系统?那些是什么 ?

Jon*_*lin 7

在这个答案中,我将生成的设备称为“卷”,并将用于创建它的分区称为“设备”。

LVM 在内部使用该dmsetup工具来设置其卷,并使用部分存储空间来存储元数据,即有关如何设置设备的信息。

另一种方法是dmsetup手动创建设备,而无需为元数据显式分配存储空间。它还允许您开始对已包含数据的分区使用此功能。假设您目前有一个驱动器 /dev/sda5,它是一个 ext4 文件系统。它有 100 GB 大,要在您运行的扇区中获得它的确切大小:

# blockdev --getsz /dev/sda5
195310000
Run Code Online (Sandbox Code Playgroud)

假设您有一个 300GB 的新硬盘驱动器 sdb,并想用它来扩展 sda5。为此,您可以使用没有分区表的整个 sdb 设备,但为了您自己的长期理智,也许最好创建一个跨越整个磁盘的分区,以便您以后记住磁盘是如何使用的。所以你有 sdb1,它的大小 blockdev 报告为

# blockdev --getsz /dev/sdb1
583984375
Run Code Online (Sandbox Code Playgroud)

因此,要将这两者合并在一起,您要做的第一件事就是确保您的旧设备已卸载。当然,我应该说,在此之前,如果出现任何问题,请备份您的数据。因此,在备份过程之后,运行:

# umount /dev/sda5
Run Code Online (Sandbox Code Playgroud)

为了确定。注意:我从来没有在带有 systemd 的系统上尝试过这个,所以请检查是否有更好的方法来避免它可能会撤消您的手动卸载。

接下来,我们将创建一个文件,其中包含设置新卷的命令。它需要一些手动计算。基本上,我们创建的文件会一次一行地告诉您新卷的每个部分在磁盘上的位置。所以我们希望扇区 0-195309999(总共 195310000 个扇区)映射到设备 /dev/sda5 扇区 0-195309999。然后我们希望扇区 195310000-779294374(总共 583984375 个扇区)映射到设备 /dev/sdb1 扇区 0-583984374。为此,我们使用以下几行创建一个文件 /etc/mybigvolume.dmsetup.txt:

0 195310000 linear /dev/sda5 0
195310000 583984375 linear /dev/sdb1 0
Run Code Online (Sandbox Code Playgroud)

每行具有以下格式(扇区中的所有单位 = 512 字节):

<offset inside volume> <number of sectors> "linear" <source device> <source device offset>
Run Code Online (Sandbox Code Playgroud)

所以,大声朗读,这些行的意思是:

  • 目标卷的扇区将从 0 开始,向前移动 195310000 个扇区,位于设备 /dev/sda5 中,从 /dev/sda5 中的扇区 0 开始

  • 目标卷的扇区将从 195310000 开始,向前移动 583984375 个扇区,位于设备 /dev/sdb1 中,从 /dev/sdb1 中的扇区 0 开始

旁注:为了数字的理解,如果您想稍后再添加另一个相同的300G磁盘,文件内容将是:

0 195310000 linear /dev/sda5 0
195310000 583984375 linear /dev/sdb1 0
779294375 583984375 linear /dev/sdc1 0
Run Code Online (Sandbox Code Playgroud)

回到原来的例子;创建文件后,我们现在可以设置卷,以便我们可以开始使用它。我们dmsetup create为此使用。

0 195310000 linear /dev/sda5 0
195310000 583984375 linear /dev/sdb1 0
Run Code Online (Sandbox Code Playgroud)

如果一切顺利,即它什么都不输出,您的新卷现在应该作为一个名为/dev/mapper/mybigvolume195310000 + 583984375 = 779294375 个扇区的新设备存在。让我们验证一下:

<offset inside volume> <number of sectors> "linear" <source device> <source device offset>
Run Code Online (Sandbox Code Playgroud)

你可以跑

0 195310000 linear /dev/sda5 0
195310000 583984375 linear /dev/sdb1 0
779294375 583984375 linear /dev/sdc1 0
Run Code Online (Sandbox Code Playgroud)

随时查看哪些设备已使用 dmsetup 进行设置。

好极了!现在需要考虑一些重要的事情:

  • 您现在必须开始使用 /dev/mapper/mybigvolume 来访问您的磁盘。总是。如果您使用 /dev/sda5,您可能会破坏您的文件系统。因此,请确保您在任何地方都没有 /dev/sda5 了。当然,除了/etc/mybigvolume.dmsetup.txt您存储 dmsetup 配置的地方或任何地方。

  • 您的文件系统仍然只使用磁盘的前 195310000 个扇区,直到您特别要求它开始使用新的可用空间。检查您的文件系统管理工具以获取信息。如果您使用了 LVM,则仍然需要执行此步骤。

  • 此设置(例如 dmsetup 配置)仅持续到重新启动。因此,您需要将系统配置为dmsetup create ...在安装文件系统之前在启动时自动运行命令,或者在每次启动时手动运行它,然后手动安装卷。前者的完成方式高度依赖于您的 Linux 发行版。但它可能类似于 cryptsetup 的实现方式(也使用 dmsetup 来设置设备)。

/etc/fstab 中的示例条目:

/dev/mapper/mybigvolume  /data  ext4  defaults,noatime  0 0
Run Code Online (Sandbox Code Playgroud)

最后我想指出,卷失败的风险当然高于单个设备失败的风险。但我不知道你的设置,也许你使用这个 /dev/mapper/mybigvolume 作为 raid-1 阵列的一部分!不管怎样,祝你好运!:)

附注。随意问的问题!