Mover um volume lógico de um grupo de volumes para outro

18

É possível mover um volume lógico de um grupo de volumes para outro no todo?

É possível criar um lv (mais ou menos) correspondente e copiar os dados, mas existe alguma maneira de fazer isso apenas com as ferramentas LVM?

Caso contrário, existe uma razão teórica ou uma limitação técnica (tamanhos de extensão)?

XTL
fonte

Respostas:

13

Um grupo de volumes consiste em volumes físicos inteiros. Um volume físico consiste em várias extensões (uma extensão é geralmente de 4 MB); cada extensão pode pertencer a um volume lógico diferente. Para transferir um volume lógico para um grupo diferente, você não pode simplesmente transferir extensões, pois isso pode dividir o volume físico entre o VG de origem e o VG de destino.

O que você pode fazer é transferir um ou mais PVs do VG de origem para o VG de destino, com o vgsplitcomando Você pode especificar quais PVs deseja transferir ou qual LV (mas apenas um de cada vez). Se você especificar um LV, ele e os outros LVs no VG de origem deverão estar em PVs separados. O VG de destino será criado se não existir nenhum VG com o nome especificado.

vgsplit -n source_group/volume_to_copy source_group target_group
vgsplit source_group target_group /dev/sdy99 /dev/sdz99

Pode ser necessário usar pvmoveprimeiro para organizar os volumes lógicos que você deseja mover para estar em PVs separados.

Se você pretendia manter os limites físicos do VG e mover os dados, não há ferramenta integrada, mas você poderia fazer um espelho e remover o original .

Gilles 'SO- parar de ser mau'
fonte
Parece que o target_group pode ser um já existente?
XTL 25/03
8

A partir do LVM em estiramento Debian (9.0), ou seja 2.02.168-2, é possível fazer uma cópia de um volume lógico entre os grupos de volume utilizando uma combinação de vgmerge, lvconverte vgsplit. Como uma movimentação é uma combinação de uma cópia e uma exclusão, isso também funcionará para uma movimentação.

Como alternativa, você pode usar pvmoveapenas para mover o volume.

Uma sessão de exemplo independente e completa usando dispositivos de loop e a lvconvertseguir.

Resumo: criamos um grupo de volumes vg1com volume lógico lv1, e vg2com lv2, e fazemos uma cópia de lv1in vg2.

Crie arquivos.

truncate pv1 --size 100MB
truncate pv2 --size 100MB

Configure dispositivos de loop em arquivos.

losetup /dev/loop1 pv1
losetup /dev/loop2 pv2

Crie volumes físicos em dispositivos de loop (inicialize dispositivos de loop para uso pelo LVM).

pvcreate /dev/loop1 /dev/loop2

Crie os grupos de volumes vg1 e vg2 em / dev / loop1 e / dev / loop2, respectivamente.

vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2

Crie os volumes lógicos lv1 e lv2 nas vg1 e vg2, respectivamente.

lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2

Crie sistemas de arquivos ext4 em lv1 e lv2.

mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2

Opcionalmente, escreva algo no lv1 para verificar posteriormente se a cópia foi criada corretamente. Torne a vg1 inativa.

vgchange -a n vg1

Execute o comando mesclar no modo de teste. Isso mescla vg1 em vg2.

vgmerge -A y -l -t -v <<destination-vg>> <<source-vg>>
vgmerge -A y -l -t -v vg2 vg1

E então de verdade.

vgmerge -A y -l -v vg2 vg1

Em seguida, crie um par de espelhos RAID 1 lv1usando lvconvert. O dest-pvargumento diz lvconvertpara fazer a cópia espelhada /dev/loop2.

lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2

Depois divida o espelho. O novo LV é agora lv1_copy.

lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1

Tornar vg2/lv1inativo.

lvchange -a n /dev/vg2/lv1

Então (modo de teste)

vgsplit -t -v <<source-vg>> <<destination-vg>> <<moved-to-pv>>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1

Sério

vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1

Resultado resultante:

lvs
[...]
lv1        vg1       -wi-a-----  12.00m
lv1_copy   vg2       -wi-a-----  12.00m
lv2        vg2       -wi-a-----  12.00m

NOTAS:

1) A maioria desses comandos precisará ser executada como root.

2) Se houver alguma duplicação dos nomes dos volumes lógicos nos dois grupos de volumes, vgmergeele se recusará a continuar.

3) Na mesclagem, os volumes lógicos em vg1devem estar inativos. E, na divisão, os volumes lógicos vg2pertencentes a vg1devem estar inativos. No nosso caso, é isso lv1.

Faheem Mitha
fonte
2

Vou oferecer o meu:

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/

se tudo estiver bom, remova a fonte

lvremove vgsource/lv0
Conan
fonte
Este é praticamente o oposto da questão. O objetivo é mover o volume em vez de copiar os dados para um novo.
XTL