如何使用 LVM 将 VM 驱动器克隆到较小的驱动器?

如何使用 LVM 将 VM 驱动器克隆到较小的驱动器?

我使用 Ubuntu 17.10 在 Hyper-V 中设置了多个虚拟机,并发现它们配置不正确 - 也就是说,它们是使用 VHDX 文件的默认块大小设置的,并且使用的空间比它们需要的多得多,并且最大 VHDHX 大小比我想要的要高。在一个示例中,我有一个约 50GB 的驱动器,但仅包含 15GB 的数据。

我希望使用更合理的设置创建新的 VHDHX 文件,并将驱动器上的所有内容克隆到新创建的驱动器上,但我遇到了一些问题。现有驱动器显示为具有 2 个分区,如下所示,然后在较大的分区上有 2 个逻辑卷 - 一个用于数据,一个用于交换。

驱动器信息

我希望将其克隆到的驱动器将是一个 30GB VHDHX 文件,我需要一些关于执行此操作的最佳方法的建议。我最初尝试使用 dd 并遇到错误,因为源大于目标。然后,我尝试使用 gparted 来调整较大驱动器的大小,但由于 gparted 将 LVM 分区视为没有可用空间而无法调整大小。我还尝试减小 LVM 分区的大小,然后使用 gparted,但也遇到了错误。我已经能够成功减小 LVM 分区的大小,然后使用 dd 将 LVM 卷克隆到我在新驱动器上创建的另一个 LVM 卷,尽管我担心当我使用 lvreduce 调整原始分区的大小时如果数据不连续并且分布在驱动器上,则可能会切断数据。

我对此很陌生,所以不知道我可能会忽略什么,并且在执行此操作时可能需要考虑什么,但本质上我正在寻找有关所需步骤的一些指导,以确保新驱动器包含所有内容旧的,我可以从它启动。例如,如果我使用 lvreduce 将大卷调整为我需要的大小,我如何验证我在执行此操作时没有丢失任何内容?这是否是正确的方法?

到目前为止我的计划是:

  1. 创建一个新的 Ubuntu VM 用于执行此过程。
  2. 连接原始驱动器 + 用于复制数据的新驱动器。
  3. 缩小原始驱动器上的逻辑卷。
  4. 在新驱动器上创建相同的分区和卷。
  5. 使用 dd 将逻辑卷复制到新驱动器上的等效逻辑卷。

有没有更好的方法来做到这一点,或者我错过了什么?/需要注意的陷阱?

答案1

如果有人遇到这个问题并遇到同样的问题,对我有用的解决方案主要是如上所述。在下面给出的示例中,我的原始驱动器有 2 个分区,一个引导分区和一个带有 2 个逻辑卷的数据分区,目标驱动器以一个引导分区和一个没有逻辑卷的数据分区开始。

  1. 设置连接了两个磁盘的 VM 并使用 Linux Live CD 启动它。
  2. 在源磁盘上运行文件系统检查sudo e2fsck -f /dev/mapper/ubuntu--1704--base--vg-root- 卷名可以从输出中找到sudo fdisk -l
  3. 在调整逻辑卷大小之前,将文件系统缩小到最小大小。这可以使用以下方法完成sudo resize2fs -M /dev/mapper/ubuntu--1704--base--vg-root
  4. 将逻辑卷大小调整为所需大小,在本例中为 28.5 GiB:sudo lvreduce --resizefs -L 28.5G /dev/mapper/ubuntu--1704--base--vg-root
  5. 重命名现有驱动器上的卷组,因为我们将在新驱动器上使用相同的名称:sudo vgrename ubuntu-1704-base-vg ubuntu-1704-base-vg-2
  6. 创建新的物理卷:sudo pvcreate /dev/sda2
  7. 使用从源驱动器上原始卷组获取的名称创建一个新卷组:sudo vgcreate ubuntu-1704-base-vg /dev/sda2
  8. 在新驱动器上创建逻辑卷以与旧驱动器上的逻辑卷相匹配。就我而言,我有一个用于交换,一个用于数据。我从报告的“当前 LE”属性中获取了分配给每个逻辑范围的大小sudo lvdisplay,然后将它们用作 lvcreate 命令的输入,例如:
    • sudo lvcreate --extents 7296 --stripes 1 --name root ubuntu-1704-base-vg
    • sudo lvcreate --extents 255 --stripes 1 --name swap_1 ubuntu-1704-base-vg
  9. 将数据从旧驱动器复制到新驱动器。我通过将源驱动器的引导分区复制到新驱动器上的引导分区上来完成此操作,然后将数据驱动器的逻辑卷复制到目标驱动器上的新逻辑卷。例如:
    • sudo dd if=/dev/sdb1 of=/dev/sda1 bs=64M status=progress
    • sudo dd if=/dev/mapper/ubuntu--1704--base--vg--2-root of=/dev/mapper/ubuntu--1704--base--vg-root bs=64M status=progress

最后,运行文件系统检查以验证驱动器是否正常。可能存在需要修复的错误,尽管执行此操作后我能够从复制的驱动器成功启动并且内容符合预期。 sudo e2fsck -f /dev/mapper/ubuntu--1704--base--vg-root

使用的参考资料: https://blog.shadypixel.com/how-to-shrink-an-lvm-volume-safely/ https://docs.microsoft.com/en-us/azure/virtual-machines/linux/configure-lvm

答案2

如果我理解的话,您实际上需要实现的是将 VM 映像复制到占用空间较小的映像,但仍然在 Hyper-V 中使用它(因此使用 VHDX 格式)。

在这种情况下,我认为没有必要使用新的虚拟机。

VM 磁盘映像可以创建为固定大小或动态大小。当使用固定大小时,整个空间在创建映像时分配,VM映像实际上使用最终大小。使用动态格式时,磁盘占用空间仅随着虚拟机中的实际磁盘使用情况而增加。

因此,您首先应该验证实际使用的格式:您的图像文件可能会暴露 50Gb,而实际使用较少(稀疏文件,如果您的操作系统支持,可能会导致这种情况)。

如果您的映像是固定映像,您应该寻找一种转换器工具(例如 StarWind V2V Converter 或其他),以便从固定映像创建新的动态映像,而无需进行 LVM 或分区更改。

注意:这可能需要先清除 Ubuntu VM 的每个文件系统中所有未使用的空间( dd if=/dev/zero of=/zerofile ; rm -f /zerofile )。

相关内容