Linux

將邏輯卷從一個卷組移動到另一個卷組

  • November 4, 2021

是否可以將邏輯卷從一個卷組整體移動到另一個卷組?

可以創建(或多或少)匹配的 lv 並複制數據,但是有沒有辦法單獨使用 LVM 工具來做到這一點?

如果沒有,是否有理論上的原因或技術限制(範圍大小)?

從 Debian stretch (9.0) 中的 LVM 開始,即 2.02.168-2,可以使用vgmergelvconvertvgsplit. 由於移動是複制和刪除的組合,因此這也適用於移動。

或者,您可以使用pvmove來移動物理範圍。引用U&L:物理範圍的目的

單個物理範圍是可以由 LVM 單獨管理的最小磁碟空間單位。

一個完整的使用循環設備的獨立範例會話, lvconvert如下所示。

摘要:我們vg1使用邏輯卷創建卷組lv1,並vg2使用,並製作inlv2的副本。lv1``vg2

創建文件。

truncate pv1 --size 100MB
truncate pv2 --size 100MB

在文件上設置循環設備。

losetup /dev/loop1 pv1
losetup /dev/loop2 pv2

在循環設備上創建物理卷(初始化循環設備以供 LVM 使用)。

pvcreate /dev/loop1 /dev/loop2

分別在 /dev/loop1 和 /dev/loop2 上創建卷組 vg1 和 vg2。

vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2

分別在 vg1 和 vg2 上創建邏輯卷 lv1 和 lv2。

lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2

在 lv1 和 lv2 上創建 ext4 文件系統。

mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2

或者,在 lv1 上寫一些東西,以便以後檢查副本是否正確創建。使 vg1 處於非活動狀態。

vgchange -a n vg1

在測試模式下執行合併命令。這會將 vg1 合併到 vg2 中。

vgmerge -A y -l -t -v <<destination-vg>> <<source-vg>>
vgmerge -A y -l -t -v vg2 vg1

然後是真的。

vgmerge -A y -l -v vg2 vg1

lv1然後使用創建 RAID 1 鏡像對lvconvert。該 dest-pv參數告訴lvconvert在 上製作鏡像副本/dev/loop2

lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2

然後拆分鏡像。新的LV現在lv1_copy

lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1

使vg2/lv1不活動。

lvchange -a n /dev/vg2/lv1

然後(測試模式)

vgsplit -t -v <<source-vg>> <<destination-vg>> <<moved-to-pv>>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1

真的

vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1

結果輸出:

lvs
[...]
lv1        vg1       -wi-a-----  12.00m
lv1_copy   vg2       -wi-a-----  12.00m
lv2        vg2       -wi-a-----  12.00m

筆記:

  1. 這些命令中的大多數都需要以 root 身份執行。
  2. 如果兩個卷組中的邏輯卷的名稱有任何重複,vgmerge將拒絕繼續。
  3. 在合併時,邏輯卷vg1必須處於非活動狀態。vg2並且在拆分時,屬於的邏輯卷vg1必須處於非活動狀態。在我們的例子中,這是lv1.

卷組由整個物理卷組成。一個物理卷由許多extent組成(一個extent通常為4MB);每個區段可能屬於不同的邏輯卷。要將邏輯卷傳輸到不同的組,不能簡單地傳輸擴展區,因為這可能會在源 VG 和目標 VG 之間拆分物理卷。

您可以做的是使用vgsplit命令將一個或多個 PV 從源 VG 傳輸到目標 VG。您可以指定要傳輸的 PV 或 LV(但一次只能傳輸一個)。如果指定 LV,則它和源 VG 中的其他 LV 必須位於不同的 PV 上。如果不存在具有指定名稱的 VG,則將創建目標 VG。

vgsplit -n source_group/volume_to_copy source_group target_group
vgsplit source_group target_group /dev/sdy99 /dev/sdz99

您可能需要先使用pvmove將要移動的邏輯卷安排在單獨的 PV 上。

如果你打算保留 VG 的物理邊界並移動數據,沒有內置工具,但你可以製作一個鏡像,然後刪除原來的.

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