如何在较小的磁盘上恢复较大卷的 LVM 快照?

如何在较小的磁盘上恢复较大卷的 LVM 快照?

我正在尝试备份/恢复本地 Ubuntu 20.04(Focal Fossa)服务器上的 LVM 卷。生产服务器的 LV 为 500 GB,但到目前为止只使用了 19 GB。

本地开发服务器有 24 GB 的可用空间,我打算从生产中恢复 19 GB。我-L 24G在执行 LVM 快照时确实将其用作参数。该过程无法恢复,并显示消息:“设备上没有剩余空间”:

生产服务器:

sudo lvcreate -s /dev/vg0/test -n backup_test -L 24G
sudo dd if=/dev/vg0/backup_test  | lz4 > test_lvm.ddimg.lz4

1048576000+0 records in
1048576000+0 records out
536870912000 bytes (537 GB, 500 GiB) copied, 967.79 s, 555 MB/s

sudo lvdisplay /dev/vg0/backup_test
  --- Logical volume ---
  LV Path                /dev/vg0/backup_test
  LV Name                backup_test
  VG Name                vg0
  LV UUID                IsGBmM-VM7C-2sO4-VrC1-kHKg-EzcR-4Hej44
  LV Write Access        read/write
  LV Creation host, time leo, 2021-07-04 12:45:45 +0200
  LV snapshot status     active destination for m360
  LV Status              available
  # open                 0
  LV Size                500.00 GiB
  Current LE             128000
  COW-table size         24.00 GiB
  COW-table LE           6144
  Allocated to snapshot  0.01%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:10

本地测试服务器:

sudo lvcreate -n restore -L 24.5G data
sudo mkfs.ext4 /dev/data/restore
sudo lz4 -d test_lvm.ddimg.lz4 | sudo dd of=/dev/data/restore

Warning : using stdout as default output. Do not rely on this behavior: use explicit `-c` instead !
dd: writing to '/dev/data/restore': No space left on device
51380225+0 records in
51380224+0 records out
26306674688 bytes (26 GB, 24 GiB) copied, 1181.48 s, 22.3 MB/s

有没有办法在小于 500 GB 的磁盘上恢复仅包含 19 GB 的 500 GB 卷?

答案1

您尝试恢复的数据大小为 500 GB,无法存放在大小为 24 GB 的逻辑卷中。您可以更有选择性地传输数据,也可以为目标卷组分配更多空间。

听起来您正在备份的逻辑卷上的数据只有 19 GB。有几种方法可以传输该数据。

如果您只关心数据而不关心文件系统,您可以mkfs.ext4在目标上创建一个新的文件系统(通过或类似方式),并使用操作文件而不是块设备的工具,如 rsync(1) 或 tar(1)。

或者,你可以使用fsarchiver(8),它可以备份文件系统,然后将其恢复到较小的设备。

最后,您可以使用 resize2fs(8) 和 lvreduce(8) 缩小要备份的块设备的大小。然后,您可以备份较小的卷,并在新服务器上还原到类似大小的卷。

答案2

恢复数据的唯一方法是使用压缩的块设备(例如 VDO、通过压缩文件系统(如 btrfs 和 ZFS)的循环设备)。

然而,即使您的数据只有 17GB,可用空间也可能包含以前写入的数据,并且整个 LV 可能无法压缩。

作为压缩文件系统,您可以使用 btrfs 或 ZFS,并创建一个 500G 的归零文件,将其映射到循环设备(使用losetup),或者在 ZFS 上,您可以直接创建一个压缩的块设备。然后将您的 LV 还原到您在上一步中创建的块设备。压缩应该可以让您有机会恢复所有数据。

答案3

在 LVM 层面上,不存在(未)使用字节的概念。一个字节(或实际上是一个扇区)是包含有意义的数据还是未使用的垃圾,由 LV 内部的文件系统决定。LVM 不知道文件系统是什么。它所做的就是获取一堆磁盘并根据您的指示将它们逻辑地组合起来。它不关心您将如何处理该组合卷。

这意味着您正在拍摄 500 GB 数据的快照。LVM 无法理解此快照的哪些部分有意义且值得保留,哪些部分没有意义。

您想要实现的目标可以通过文件系统级别的映像来实现。某些软件(如免费的 partclone)可以理解文件系统的结构,并可以创建图像- 本质上是一个稀疏文件,仅包含正在使用的文件系统部分。这里的问题是目标设备必须至少与源设备大小相同,因为 partclone 不会调整文件系统的几何形状:在恢复映像时,所有存储的部分都必须进入其原始位置。

因此计划如下:

  • 将源文件系统大小调整为 25 GB(这不需要调整 LV 大小!)
  • 使用 partclone 或者类似工具对其进行映像处理
  • 手动在目标上重新创建 LV
  • 从映像恢复文件系统

这种方法的一个变种是将文件系统的大小调整为 25 GB,然后发送 LVM 快照。由于您仍在发送整个 500 GB,因此它会出错,提示“设备上没有剩余空间”,但没关系,因为只有卷的前 25 GB 将包含文件系统。

无论如何,如果这些是可启动卷,您可能必须调整 fstab,所以请做好准备。

答案4

您必须使用lvconvert带有--mergesnapshot选项和逻辑卷快照名称的命令来恢复 LVM 逻辑卷。--mergesnapshot使用此选项时,快照将合并到原始逻辑卷中,然后被擦除。

相关内容