无需外部存储即可将整个硬盘转换为 LVM

无需外部存储即可将整个硬盘转换为 LVM

最近,我的 2TB 硬盘空间不足,所以我又买了一个来补充。我的旧硬盘安装在特定文件夹中(没有系统文件或任何东西)。从技术上讲,我可以创建一个新文件夹并将其用作新硬盘的挂载点,但如果我可以使用 LVM 将两个硬盘合并起来,这样就只有一个挂载点了,这样就简洁多了。

有没有办法将我现有的 2TB 驱动器实时转换为 LVM?我没有任何外部存储可用作传输介质,也没有其他足够的备份介质,所以我需要一种方法来转换它而不实际删除它上面的任何内容(并且驱动器已满,所以我无法创建新分区并将其用作备份)。

答案1

不可以,您无法将现有的已满驱动器转换为 LVM,除非暂时将数据移至其他地方。您需要在驱动器上创建一个或多个新分区,然后pvcreate在新文件系统上运行以创建 LVM 物理卷。然后在此基础上创建并激活卷组,等等

但是,你说你买了一个新硬盘,所以我假设它至少有 2TB,对吗?如果你能同时在系统中运行两个硬盘,那么这将为你提供一条迁移路径。

首先,将新的大驱动器作为第二个驱动器(我假设是 SATA 驱动器)连接。它将在系统中显示为 /dev/sdb。使用 fdisk 在其上创建两个分区。其中一个应该是小型启动分区,1GB 可能就足够了。将其余部分用作新的 lvm 分区。使用 lvm 工具(pvcreate、vgcreate 等)在第二个驱动器上设置 LVM。将小型启动分区留空。

关闭机器并断开旧的 2TB 驱动器。将新驱动器移至主 SATA 接口,或使用 BIOS 将其设为主 SATA 接口。使用安装 DVD 启动机器。仅在您创建的小型启动分区上安装新的 Linux 系统。

一旦工作正常,重新连接原来的驱动器,现在位于辅助 SATA 通道上。启动系统并将新的基于 LVM 的文件系统配置为 /newdrive(记住,现在位于 /dev/sda 上)。将旧驱动器挂载到某个位置,例如/olddrive

使用类似 rsync 的程序将 /olddrive 的内容复制到 /newdrive,从而将所有数据从旧硬盘复制到新硬盘。现在,您已将所有数据转移到新的 LVM 文件系统。

现在到了最可怕的部分:擦除原始驱动器。请仔细考虑这一点,因为如果您擦除错误的设备,您将丢失所有原始数据。也许您可以从其他人那里借用另一个驱动器作为临时备份?

原始驱动器清空后,使用 pvcreate 将其设置为 LVM 设备。然后,您可以使用 vgextend 和 lvresize 将 LVM 卷组扩展到新设备上。这可以在系统运行时完成,不会影响新驱动器上的数据。完成该操作后,您将拥有一个 4TB 的卷组。您可以在生成的文件系统上使用 resizefs 使其填满整个空间。

请注意,有很多方法可以搞砸这个操作,但这是可行的。我强烈建议您以某种方式进行额外的备份。还请注意,在两个单独的驱动器上运行一个大型卷组并不是很可靠 - 如果一个驱动器发生故障,您可能会丢失大量数据。更好的想法通常是在两个镜像驱动器的 raid zero 阵列上运行 lvm。这样您只能获得 2TB 的空间,但一个驱动器坏掉不会导致所有东西都完全失效。以下是我如何执行了 LVM 迁移之前看过,可以参考一下。

另一个选择是在机器上安装第三个驱动器,并仅将其用于启动。这会使事情变得简单一些,因为您不必在启动设备上设置单独的常规分区和 lvm 分区。实际上,现代 Linux 发行版可能已经修复了这个问题,但我知道几年前 grub 等引导加载程序无法与 lvm 配合使用,因此您总是必须从非 lvm 设备启动。

答案2

看来我自己解决了这个问题:我仅使用新硬盘创建了一个卷组,因此我可以将数据复制到新驱动器,然后擦除旧驱动器并将其添加到卷组中。

答案3

问题是寻找无需移动大量数据的就地转换。如果可以接受将 4 MiB(1 个 LVM 区的大小)永久复制到新磁盘,则可以在不缩小文件系统的情况下完成(这是或者手动 lvmifyhttps://superuser.com/questions/493481/fastest-way-to-convert-an-ext4-formatted-disk-to-lvm-with-ext4-on-it):

  1. 备份旧分区的前 16 MiB,因为万一出错,它可能派上用场。如果分区大小不是 4 MiB 的倍数,例如,还请备份最后 8 MiB。tail --bytes记下分区的确切大小。考虑使用数据分区的设备快照进行练习运行,例如使用https://gist.github.com/jowagner/b36024636140ddf453c12eaf6e590b5d

  2. 在新磁盘上创建 PV 和 VG,并创建大小为 4 MiB(1 个范围)的 LV。

  3. 将旧分区的前 4 MiB 恢复或复制到新 LV。验证cmp /dev/mapper/vgname-lvname /dev/sdX1(根据您的设置调整名称)是否报告“字节 4194304 之后的 EOF [...]”(4 MiB 为 4194304 字节)。

  4. --dataalignment 4M在旧分区上创建 PV 。这将覆盖前 1 MiB 中的一小部分数据,但我们有步骤 1 和步骤 3 中的 2 个备份。(如果pvcreate检测到签名并提出擦除它,我们不知道它是否还会擦除超过 4M 的一些数据,因此您可能希望先手动擦除前 4M,这样pvcreate就不会检测到您的有效负载格式。)

4b. 使用 将新的 PV 添加到步骤 2 中创建的卷组vgextend

  1. 运行lvextend以扩大 LV,将旧分区上 PV 的所有扩展添加到 LV,例如查询 PV 上的可用空间(以 MiB 为单位)并在 中指定此数量-l+1234MiB。必须在命令中指定 PV 以从目标 PV 分配。根据cmp步骤 1 中的备份进行验证。它应该报告“字节 16777216 之后的 EOF [...]”,因为我们备份了 16 MiB,而 16 MiB 是 16777216 字节。

  2. 如果旧分区的大小不是 4 MiB 的倍数,则我们的新 LV(以下称为“数据 LV”)中仍然缺少少量数据。否则继续执行步骤 7。

    a) 创建一个只有 1 个范围的 LV(这应该自动转到新磁盘的 PV,因为旧磁盘上的 PV 在此阶段应该不再有任何可用范围),下面称为“微型 LV”。

    b) 将丢失的数据复制到微型 LV。这是旧分区模 4 MiB 的大小,由于它是 512 字节的倍数而不是 4 MiB 的倍数,因此它必须介于 512 和 4,193,792 字节之间。可以使用 从备份中切分数据tail --bytes

    c) 移除微小 LV。

    d) 扩大数据 LV 以吸收我们刚刚准备的范围。

    e) 使用 6.2 中准备的数据切片验证tail --bytes 4194304是否成功cmp。它应该报告切片长度的 EOF。

  3. 对于第一次测试,您可能需要创建一个写时复制快照并运行完整的文件系统检查和/或数据清理,而无需修改旧分区上的任何数据。删除快照以最大限度地利用可用空间以进行下一步。

  4. 最后,可以扩展 LV 并扩大文件系统以使用新磁盘上的可用空间。

  5. 如果这是对设备快照的试运行,请运行lvremovevgremovepvremove取消注册 LVM 设备,删除快照并真正重复所有步骤。(当看到一切都按预期工作时,很容易忘记这一点,除了最终耗尽快照空间,或者在非永久快照的情况下,在关机时丢失所有新数据。)

文件系统日志注意事项

通过上述设置,文件系统的前 4 MiB 将位于新磁盘上,而后 4 MiB 位于旧磁盘上。许多文件系统在文件系统的开头附近保留日志。您可能希望在新磁盘上拥有超过前 4 MiB 的内容,即在步骤 2 中创建更大的 LV。然后,步骤 1 中的备份也必须更大。如果将步骤 4 移到步骤 2 之前,LV 甚至可以是条带 LV。(要使用线性段扩展条带 LV,请使用--stripes 1。)在这两种情况下,都必须在旧磁盘的 PV 上创建额外的填充 LV,以便步骤 5 跳过 LV 中已有的数据。可以在步骤 7 之后删除此填充 LV。

警告

  • 我还没有测试上述确切的步骤,只是在稍微不同的环境中测试了类似的方法。

  • 以上所有内容都依赖于了解 LVM 仅在每个 PV 开始时覆盖元数据、默认情况下扩展区按顺序分配且扩展区大小为 4 MiB。LVM 的未来版本可能会更改其中任何一项。

答案4

是的,可以做到,这是一个老问题,但我需要回答,因为您可以将现有硬盘转换为 LVM,而无需移动数据,而且没有人说过可以做到这一点。您需要在新磁盘上创建一个新的 LVM 分区,然后在旧文件系统上运行带有 -Zn 的 pvcreate 来创建 LVM 物理卷,但请记住在创建 vg 或 lv 时使用 -Zn,否则您将丢失所有数据,如果您购买了新的 2 TB 硬盘,您的总磁盘将是 2+2 TB。

相关内容