是否可以将逻辑卷从一个卷组整体移动到另一个卷组?
可以创建(或多或少)匹配的 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