LVM:如何克隆多盘加密逻辑卷?

LVM:如何克隆多盘加密逻辑卷?

我正在运行 Arch Linux。我想在单个卷组中克隆 2 磁盘加密逻辑卷(LVM 上的 LUKS)。有一个小问题。我想更换一些驱动器。

我有:

  • VG1:LV:PV(旧驱动器1)+ PV(旧驱动器2)
sda (OldDrive1)
    -vg1-luks_encrypted_lv
sdb (OldDrive2)
    -vg1-luks_encrypted_lv

我还有另外两个驱动器(NewDrive1 和 NewDrive2)。我想创建一个 VG2,它是 VG1 的克隆。但是,我想交换一些驱动器。所以我想要:

  • VG1:LV:PV(旧驱动器1)+ PV(新驱动器1)
  • VG2:LV:PV(旧驱动器2)+ PV(新驱动器2)
sda (OldDrive1)
    -vg1-luks_encrypted_lv
sdb (OldDrive2)
    -vg2-cloned_luks_encrypted_lv
sdc (NewDrive1)
    -vg1-luks_encrypted_lv
sdd (NewDrive2)
    -vg2-cloned_luks_encrypted_lv

我当前的计划是克隆每个驱动器。我之前考虑过使用 dd,但经过一些阅读后,也许我需要使用 pvmove?:

  • 旧驱动器1 -> 新驱动器1
  • 旧驱动器2 -> 新驱动器2

那么我是否可以只交换 LVM 中的物理驱动器,因为驱动器是逐位克隆的?我担心我错过了什么。如何将新闻驱动器合并到 LV 中?我希望得到一些建议,因为我不想丢失任何数据。谢谢。


编辑:

@telcoM 的回答非常有效。非常感谢。我用的是网上的方法。如果有人想做类似的事情,那么有几件事值得注意。

在第 7 步:

现在默认lvconvert -m是raid1,不是lvm自己的镜像系统。阅读man lvconvert更多详情。由于我想立即分割镜像,因此使用lvm的遗留镜像并将镜像日志存储在内存中要容易得多:

lvconvert --type mirror -m +1 --mirrorlog core vg1/luks_encrypted_lv OldDrive2 NewDrive2

请记住,这--mirrorlog core会将镜像日志放入内存中。因此,在运行之前不要关闭计算机lvconvert --splitmirrors,否则您将丢失镜像日志文件。

在第 9 步:

在你这样做之前vgsplit你需要卸载文件系统并停用逻辑卷

在第 11 步:

大多数人可能意识到这一点,但您需要$uuid在运行之前为其分配一个 UUID cryptsetup luksUUID --uuid $(uuid) /dev/mapper/VG2-LVx。首先运行类似的东西uuid=$(uuidgen)

答案1

“需要”是一个很强烈的词——实现你想要的东西的方法不止一种。

使用pvmove,您可以在使用加密 LV 的同时在线进行操作。

1.)pvcreate新驱动1

2.)vgextend VG1 NewDrive1

3.) pvmove OldDrive2(实际上意味着:“如果可能的话,将任何 LVM 分配的盘区从 OldDrive2 移动到 VG1 中的任何其他驱动器,以便 OldDrive2 完全未分配。”这将需要一些时间:您可能希望在screen/tmux带有 erbose 选项的会话-v。)

4.) 使用pvspvdisplay OldDrive2确保 OldDrive2 现在完全未分配。

5.)pvcreate NewDrive2

6.)vgextend VG1 NewDrive2

7.) 对于 VG1 中的每个 LV:(lvconvert -m +1 VG1/LVx OldDrive2 NewDrive2“从 VG1/LVx 创建镜像,为 OldDrive2 和 NewDrive2 中的镜像分配空间”)。如果磁盘上镜像日志没有空间,您可能需要使用--mirrorlog core此处的选项。

8.) 一旦镜像同步,对于 VG1 中的每个 LV:(lvconvert --splitmirrors 1 --name LVcopyx VG1/LVx OldDrive2 NewDrive2“拆分位于 OldDrive2 和/或 NewDrive2 上的 LVx 的一个镜像,并将其命名为“LVcopyx”以避免名称冲突。)

9.) vgsplit VG1 VG2 OldDrive2 NewDrive2(“将 OldDrive2 和 NewDrive2 从 VG1 中分离出来,带走它们的 LV,并将生成的新 VG 命名为 VG2。”)

10.) 对于 VG2 中的每个 LV:lvrename VG2 LVcopyx LVx恢复原始 LV 名称,现在副本已分离到自己的 VG 中并且不再有冲突。您现在拥有一个新的 VG2,其中包含 VG1 的 LV 的副本,因为它们在步骤 8 中分割 LV 镜像时就已存在。)。

11.) 在实际使用 VG2 之前,您需要vgchange -ay VG2, 然后cryptsetup luksUUID --uuid $(uuid) /dev/mapper/VG2-LVx为其指定一个不同于 VG1 对应项的唯一 UUID,一旦您解锁了加密,您还应该为其中的文件系统指定一个新的 UUID。对于 BtrFS 来说,这一点至关重要 ( btrfstune -u /dev/mapper/VG2-LVx-crypt);对于其他文件系统,这本质上只是一种方便,以便基于 UUID 的安装能够工作。


如果您可以使 VG 离线并且可以拔出/重新插入磁盘,您还可以:

1.) 卸载cryptsetup luksClose并停用 VG ( vgchange -an VG1)。为了避免在启动或热插拔时出现不必要的自动激活,请将其标记为导出 ( vgexport VG1)。

2.) 按照您的计划克隆驱动器。

3.) 拔下驱动器,以便系统只能看到 OldDrive2 和 NewDrive2。如果您的硬件允许热拔插,请使用echo 1 > /sys/block/<device name>/device/delete优雅的热拔插。

4.) 引导系统或vgscan在正常热拔出后运行。然后导入并重命名 VG: vgimport VG1,然后vgrename VG1 VG2.使用vgchange --uuid VG2为新 VG2 赋予与旧 VG1 不同的新标识,并使用pvchange --uuid OldDrive2pvchange --uuid NewDrive2在 PV 级别执行相同操作。导入并重命名后,请记住,您需要先激活 VG,然后才能安装它或对其执行任何其他操作:vgchange -ay VG2

5.) 激活 VG 后,使用cryptsetup luksUUID --uuid=$(uuid) /dev/mapper/VG2-LVxdo 为 LUKS 容器提供一个独特的新身份,并在解锁加密后,使用文件系统特定的工具在文件系统级别执行相同的操作。 (这对于 BtrFS 尤其重要: btrfstune -u /dev/mapper/VG2-LVx-crypt

6.) 现在您可以重新插入 OldDrive1 和 NewDrive1(vgscan如果热插拔则使用),然后vgimport VG1“再次”,然后使用 激活它vgchange -ay VG1。您现在拥有两个完全独立的 VG,您可以根据需要使用。

答案2

如果您能够在 dd 克隆过程中关闭 LUKS 容器,步骤可能如下:

  • 将 NewDrive1 添加到 VG1
  • 使用“pvmove OldDrive2 NewDrive1”
  • 从 VG1 中删除 OldDrive2
  • 使用 OldDrive2 + NewDrive2 创建 VG2
  • 在 VG2 上创建您想要的 LV
  • 使用 dd VG1/LV -> VG2/LV

如果您计划在同一台计算机上使用两个副本,您还必须更改 LUKS 容器和包含文件系统的 UUID!感谢@telcoM 指出了这一点!

相关内容