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

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

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

可以创建(或多或少)匹配的 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使用逻辑卷lv1vg2来创建卷组,并制作inlv2的副本。lv1vg2

创建文件。

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 身份运行。#有些命令前面的 表示这是一条注释。它不代表 root 提示符。

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

  3. 合并时,逻辑卷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/sdbs0群组中删除

$ vgreduce s0 /dev/sdb

按照相同的步骤操作/dev/sdc1

相关内容