
是否可以將邏輯磁碟區從一個磁碟區組整體移動到另一個磁碟區組?
可以建立(或多或少)匹配的 lv 並將資料複製過來,但是有沒有辦法單獨使用 LVM 工具來完成此操作?
如果不是,是否存在理論原因或技術限制(範圍大小)?
答案1
卷組由整個實體卷組成。一個實體磁碟區由許多盤區組成(一個盤區通常為 4MB);每個盤區可能屬於不同的邏輯磁碟區。要將邏輯磁碟區傳輸到不同的群組,不能簡單地傳輸磁碟區,因為這可能會在來源 VG 和目標 VG 之間分割實體磁碟區。
您可以做的是將一個或多個 PV 從來源 VG 傳輸到目標 VG,其中vgsplit
命令。您可以指定要傳輸哪些 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 的物理邊界並移動數據,則沒有內建工具,但您可以製作一面鏡子,然後移除原來的鏡子。
答案2
vgmerge
從 Debian Stretch (9.0) 中的 LVM(即 2.02.168-2)開始,可以使用、lvconvert
和的組合跨卷組複製邏輯磁碟區vgsplit
。由於移動是複製和刪除的組合,因此這也適用於移動。
或者,您可以使用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
筆記:
大多數這些命令需要以 root 身分運行。
#
有些指令前面的 表示這是一條註解。它不代表 root 提示符號。如果兩個磁碟區組中的邏輯磁碟區名稱有任何重複,
vgmerge
將拒絕繼續。合併時,邏輯磁碟區
vg1
必須處於非活動狀態。且在分割時,vg2
所屬的邏輯磁碟區vg1
必須處於非活動狀態。在我們的例子中,這是lv1
.
答案3
我將提供我自己的:
umount /somedir/
lvdisplay /dev/vgsource/lv0 --units b
lvcreate -L 12345b -n lv0 vgtarget
dd if=/dev/vgsource/lv0 of=/dev/vgtarget/lv0 bs=1024K conv=noerror,sync status=progress
mount /dev/vgtarget/lv0 /somedir/
如果一切正常,請刪除來源
lvremove vgsource/lv0
答案4
假設您有一個名為s0
$ pvs -o+pv_used
PV VG Fmt Attr PSize PFree Used
/dev/sda2 cl lvm2 a-- <118.24g 0 <118.24g
/dev/sdb s0 lvm2 a-- <223.57g 0 <223.57g
/dev/sdc1 s0 lvm2 a-- <465.76g 0 <465.76g
/dev/sdd1 lvm2 --- 931.51g 931.51g 0
我想移動/dev/sdb
到/dev/sdc1
新的硬碟/dev/sdd1
在sdd1上建立物理卷
$ pvcreate /dev/sdd1
現在您可以s0
使用新磁碟擴充卷組
$ vgextend s0 /dev/sdd1
現在您可以開始行動數據
$ pvmove /dev/sdb /dev/sdd1
等待完成
/dev/sdb: Moved: 10.0%
...
/dev/sdb: Moved: 50.0%
...
/dev/sdb: Moved: 100.0%
查看
$ pvs -o+pv_used
PV VG Fmt Attr PSize PFree Used
/dev/sda2 cl lvm2 a-- <118.24g 0 <118.24g
/dev/sdb lvm2 --- 223.57g 223.57g 0
/dev/sdc1 s0 lvm2 a-- <465.76g 0 <465.76g
/dev/sdd1 s0 lvm2 a-- <931.51g 707.94g <223.57g
現在您可以/dev/sdb
從s0
群組中刪除
$ vgreduce s0 /dev/sdb
按照相同的步驟操作/dev/sdc1