LVM:如何複製多磁碟加密邏輯卷?
我正在執行 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
在執行之前分配一個 UUIDcryptsetup 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,您可以根據需要使用它們。