Lvm

LVM:如何複製多磁碟加密邏輯卷?

  • November 7, 2021

我正在執行 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新驅動器1

2.)vgextend VG1 NewDrive1

3.) pvmove OldDrive2(有效的意思是:“將任何 LVM 分配的範圍從 OldDrive2 移動到 VG1 中的任何其他驅動器,以便 OldDrive2 變得完全未分配,如果可能的話。”這將需要一些時間:您可能希望在一個screen/tmux帶有-verbose 選項的會話。)

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 不同的新身份,並在 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,您可以根據需要使用它們。

引用自:https://unix.stackexchange.com/questions/669642