如何将逻辑卷(lv)移动/复制到另一个卷组(vg)?


17

基本上,我想几个逻辑卷(lv)移动/复制到新的卷组(vg)中。新的卷组驻留在一组新的物理卷上。有谁知道如何安全地执行此操作而不损坏那些逻辑卷中的数据?


您能否提供更多详细信息?您知道如何制作新的VG和LV吗?您要移动数据分区还是根分区?
Panther

@ bodhi.zazen:实际上我正在尝试移动一种数据分区。我所说的“种类”是,这些逻辑卷是虚拟机。(即那些逻辑卷作为块设备出现在虚拟机中)。无论如何,我能够以自己的方式处理这种情况。这些步骤在我的答案中给出。但是,欢迎您和大家对我的方法发表评论。如果有更好的方法可以做这种事情,请足够好分享。:)
没人

我将首先创建新的PV / LV,然后关闭VM,然后使用dd复制数据,启动新VM并确认其正常工作。

Answers:


12

vgmerge使您可以合并两个VG。您还可以使用pvmove在一个VG中移动数据,如果要返回到多个VG,可以使用vgsplit


一注。为此,您必须具有用于将在线LV传输到另一个VG的临时设备。当然,传输后,您应该更新/ etc / fstab和其他受影响的配置,并计划一些脱机时间以重新启动,并最终进行一些配置更新。如果您对rootfs或bootfs做一些操作,则应该有一些用于恢复主系统的linux live发行版。
Znik

10

没有理由先将其复制到.img文件,只需先执行lvcreate,然后直接将其复制到:

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume
lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name
dd if=/dev/volume-group/snapshot-name of=/dev/new-volume-group/new-logical-volume

2
这太简短了。它没有说确切提到的大小是多少-例如<size>可能很小,因为它仅用于快照差异。
gorn 2016年

1
@gorn是有效的观点,但他在下面是当时第一人的答复,没人回答。阅读该文章以获得更多背景信息。
Tobias J

7

好的,我能够以自己的方式处理这种情况。这是我采取的步骤:

1)拍摄目标逻辑卷的快照。

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume

注意:快照的大小可以根据需要选择大或小。重要的是要有足够的空间来捕获快照期间的更改。

2)使用创建快照内容的图像副本 dd

dd if=/dev/volume-group/snapshot-name of=/tmp/backup.img

3)在目标(新)卷组中创建一个足够大的新逻辑卷。

lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name

4)使用以下命令从映像备份将数据写入新的逻辑卷 dd

dd if=/tmp/backup.img of=/dev/new-volume-group/new-logical-volume

5)分别使用lvremove和删除快照和图像备份rm

所有人都...希望这对某人有帮助:)


如果有人有更好的选择/方法,请让我知道:-)
没人

无需为临时存储备份创建ising backup.img。您可以从源快照直接dd到未安装状态的目标LV。
Znik

3

如在Debian的拉伸(9.0),即2.02.168-2的LVM的,有可能使用的组合,以做跨卷组的逻辑卷的副本vgmergelvconvertvgsplit。由于移动是复制和删除的组合,因此这也适用于移动。

或者,您可以使用pvmove来移动音量。

使用循环设备的完整自包含示例会话及其后 lvconvert

简介:我们创建具有逻辑卷lv1的卷组vg1,以及具有lv2的vg2,并在vg2中创建lv1的副本。

创建文件。

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

在测试模式下运行merge命令。这会将lv1合并为lv2。

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

然后从创建RAID 1反射镜对lv1使用lvconvert。在<>参数告诉lvconvert使镜像副本 lv1_copy/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不活动。

vgchange -a n vg2

然后(测试模式)

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)合并时:

Logical volumes in `vg1` must be inactive

然后拆分:

Logical volume `vg2/lv1` must be inactive.

1
这是没有意义的。您必须卸载文件系统,停用卷等。您也可以卸载dir并复制数据。
user189142

首先,正如user189142所说,这毫无意义。其次,它仅适用于我们可以使用移动量停止服务的情况。这是24/7全天候运行的服务的问题,而以TB计的数据量非常大。因此,该程序需要很长的服务时间。原因很简单,就是简单地在线创建新卷,rsync,然后在短时间内使rsync脱机,以进行更新,重新安装并将系统恢复到联机状态。当然,非常好的主意是从源卷中清除不需要的数据。也许暂时将其移至某个临时位置。
Znik

3

到目前为止,这4个答案都错过了,因此通常不知道该卷的确切大小。lvdisplay仅显示四舍五入到小数点后两位的值,并且man lvdisplay仅指向其他命令提供可用选项。以下选择MiB,它的默认LVM块大小为4 MiB足够准确:

lvdisplay --units m

MIB也是默认的单位--sizelvcreate。如有疑问,请lvdisplay在创建目标体积后再次检查尺寸是否正确。然后像其他答案一样继续进行复印。此外,我建议以验证复制,例如使用cmp

以下是使用快照的原因及其保护和不保护的内容:

  • 创建快照后,将复制所有数据,就像创建快照时一样。复制过程中源卷上的活动将不会反映在副本中。

  • 快照还可以保护源卷免受dd命令行中的人为错误。如果您不小心写入快照,则只会损坏快照的数据,您只需删除快照并重新开始。

  • 在复制过程中,目标卷不受保护。如果另一个管理员(或诸如os-prober之类的自动进程dracut)安装了不完整的卷,则该安装可能会使事情搞砸。(即使只读安装仍可能会将日志条目写入该卷。)


2

我将提供自己的:

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

如果源数量很大并且不应停止服务或系统怎么办?
Znik

0

如果您需要将逻辑卷从VG A复制到另一个VG B,我发现使用了一个有趣的变体partclone。然后使用dd复制快照是一个好方法,但是如果文件系统未满,则可能会很慢。该解决方案非常快,因为它仅复制使用的块。

  1. 首先创建源LV的快照
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

--size这里是之前的快照将被禁用怎么能发生多少写

  1. 在目标VG中创建目标LV
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size 必须至少等于源LV的大小

  1. 将文件系统从源lv备份复制到目标LV
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_type可以ext4fat32btrfsxfs,...任何FS支持partclone

  1. 删除快照
lvremove /dev/sourcevg/lv-backup
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.