将逻辑卷从一个卷组移动到另一个

XTL*_*XTL 22 linux lvm

是否可以将逻辑卷从一个卷组整体移动到另一个卷组?

可以创建一个(或多或少)匹配的 lv 并复制数据,但是有没有办法单独使用 LVM 工具来做到这一点?

如果没有,是否存在理论上的原因或技术限制(范围大小)?

Gil*_*il' 16

卷组由整个物理卷组成。一个物理卷由许多盘区组成(盘区通常为 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
Run Code Online (Sandbox Code Playgroud)

您可能需要首先使用pvmove将要移动的逻辑卷安排在单独的 PV 上。

如果您打算保留 VG 的物理边界并移动数据,则没有内置工具,但您可以制作镜像然后删除原始.


Fah*_*tha 11

As of the LVM in Debian stretch (9.0), namely 2.02.168-2, it's possible to do a copy of a logical volume across volume groups using a combination of vgmerge, lvconvert, and vgsplit. Since a move is a combination of a copy and a delete, this will also work for a move.

Alternatively, you can use pvmove to just move the volume.

A complete self-contained example session using loop devices and lvconvert follows.

Summary: we create volume group vg1 with logical volume lv1, and vg2 with lv2, and make a copy of lv1 in vg2.

Create files.

truncate pv1 --size 100MB
truncate pv2 --size 100MB
Run Code Online (Sandbox Code Playgroud)

Set up loop devices on files.

losetup /dev/loop1 pv1
losetup /dev/loop2 pv2
Run Code Online (Sandbox Code Playgroud)

Create physical volumes on loop devices (initialize loop devices for use by LVM).

pvcreate /dev/loop1 /dev/loop2
Run Code Online (Sandbox Code Playgroud)

Create volume groups vg1 and vg2 on /dev/loop1 and /dev/loop2 respectively.

vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2
Run Code Online (Sandbox Code Playgroud)

Create logical volumes lv1 and lv2 on vg1 and vg2 respectively.

lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2
Run Code Online (Sandbox Code Playgroud)

Create ext4 filesystems on lv1 and lv2.

mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2
Run Code Online (Sandbox Code Playgroud)

Optionally, write something on lv1 so you can later check the copy was correctly created. Make vg1 inactive.

vgchange -a n vg1
Run Code Online (Sandbox Code Playgroud)

Run merge command in test mode. This merges vg1 into vg2.

vgmerge -A y -l -t -v <<destination-vg>> <<source-vg>>
vgmerge -A y -l -t -v vg2 vg1
Run Code Online (Sandbox Code Playgroud)

And then for real.

vgmerge -A y -l -v vg2 vg1
Run Code Online (Sandbox Code Playgroud)

Then create a RAID 1 mirror pair from lv1 using lvconvert. The dest-pv argument tells lvconvert to make the mirror copy on /dev/loop2.

lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2
Run Code Online (Sandbox Code Playgroud)

Then split the mirror. The new LV is now lv1_copy.

lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1
Run Code Online (Sandbox Code Playgroud)

Make vg2/lv1 inactive.

lvchange -a n /dev/vg2/lv1
Run Code Online (Sandbox Code Playgroud)

Then (testing mode)

vgsplit -t -v <<source-vg>> <<destination-vg>> <<moved-to-pv>>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1
Run Code Online (Sandbox Code Playgroud)

For real

vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1
Run Code Online (Sandbox Code Playgroud)

Resulting output:

lvs
[...]
lv1        vg1       -wi-a-----  12.00m
lv1_copy   vg2       -wi-a-----  12.00m
lv2        vg2       -wi-a-----  12.00m
Run Code Online (Sandbox Code Playgroud)

NOTES:

1) 这些命令中的大多数都需要以 root 身份运行。

2) 如果两个卷组中的逻辑卷名称有任何重复, vgmerge将拒绝继续。

3) 在合并时,逻辑卷vg1必须处于非活动状态。并且在拆分时,vg2属于的逻辑卷vg1必须处于非活动状态。在我们的例子中,这是lv1.


小智 6

我将提供我自己的:

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/
Run Code Online (Sandbox Code Playgroud)

如果一切正常,请删除源

lvremove vgsource/lv0
Run Code Online (Sandbox Code Playgroud)

  • 我认为这实际上是一个很好的答案。在这种情况下没有“移动”。只是复制和删除。这个答案几乎准确地描述了如果你“移动”lv 会发生什么。这里的区别在于这对用户更透明,因此更安全。 (2认同)

小智 6

这个问题的准确答案是:“不,不可能(从逻辑上)将逻辑卷 (LV) 从一个卷组 (VG1)移动到另一个卷组 (VG2)。数据必须进行物理复制。”

原因:逻辑卷数据物理存储在分配给特定卷组的块设备(磁盘、分区)上。逻辑卷从 VG1 移动/dev/sda/dev/sdbVG2/dev/sdc需要将数据/dev/sda至少两个块设备(或分区)/dev/sdb之间/dev/sdc进行物理复制操作。

PS 如果所有的LV数据都存储在物理卷上,可以完全排除在VG1之外,那么这个物理卷就可以分配给VG2。但是,它将把物理卷从一个卷组移动到另一个卷组,而不是移动逻辑卷。

  • 很好的答案;如果您有曾经使用过的任何参考资料,请添加;他们会让你的答案更伟大! (2认同)