我正在运行 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.) 使用pvs
或pvdisplay 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 OldDrive2
和pvchange --uuid NewDrive2
在 PV 级别执行相同操作。导入并重命名后,请记住,您需要先激活 VG,然后才能安装它或对其执行任何其他操作:vgchange -ay VG2
。
5.) 激活 VG 后,使用cryptsetup luksUUID --uuid=$(uuid) /dev/mapper/VG2-LVx
do 为 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 指出了这一点!