我正在运行 Arch Linux。我想在单个卷组(LVM 上的 LUKS)中克隆 2 个磁盘加密的逻辑卷。有一个小问题。我想交换一些驱动器。
我有:
- VG1: LV: PV(OldDrive1) + PV(OldDrive2)
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(OldDrive2) + PV(NewDrive2)
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
否则你会丢失你的mirrorlog文件。
在第 9 步:
在您这样做之前,vgsplit
您需要卸载文件系统并停用逻辑卷。
在第 11 步:
大多数人可能都意识到了这一点,但是您需要$uuid
在运行之前分配一个 UUID cryptsetup luksUUID --uuid $(uuid) /dev/mapper/VG2-LVx
。先运行类似的东西uuid=$(uuidgen)
。
“需要”是一个强有力的词——实现你想要的东西的方法不止一种。
使用
pvmove
,您可以在使用加密的 LV 时在线进行。1.)
pvcreate
新驱动器12.)
vgextend VG1 NewDrive1
3.)
pvmove OldDrive2
(有效的意思是:“将任何 LVM 分配的范围从 OldDrive2 移动到 VG1 中的任何其他驱动器,以便 OldDrive2 变得完全未分配,如果可能的话。”这将需要一些时间:您可能希望在一个screen
/tmux
带有-v
erbose 选项的会话。)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 不同的新身份,并在 PV 级别使用pvchange --uuid OldDrive2
和执行相同操作。pvchange --uuid NewDrive2
导入和重命名后,请记住,您需要先激活 VG,然后才能对其进行挂载或对其执行任何其他操作:vgchange -ay VG2
.5.) 激活 VG 后,使用
cryptsetup luksUUID --uuid=$(uuid) /dev/mapper/VG2-LVx
给 LUKS 容器一个独特的新身份,并在解锁加密后,使用文件系统特定工具在文件系统级别执行相同操作。(这对 BtrFS 尤其重要btrfstune -u /dev/mapper/VG2-LVx-crypt
:)6.) 现在您可以重新插入 OldDrive1 和 NewDrive1(
vgscan
如果您是热插拔则使用),然后vgimport VG1
“再次”,并使用 .激活它vgchange -ay VG1
。您现在有两个完全独立的 VG,您可以根据需要使用它们。如果您能够在 dd clonig 期间关闭 LUKS 容器,则步骤如下:
如果您打算在同一台机器上使用两个副本,您还必须更改 LUKS 容器和包含文件系统的 UUID!感谢@telcoM 指出这一点!