Existe uma maneira simples de mover / copiar um volume lógico de um grupo de volumes para outro? (LVM2)

15

Estou reorganizando um monte de discos no meu servidor em casa e me encontro na posição de querer mover um monte de volumes lógicos do LVM para outro grupo de volumes. Existe uma maneira simples de fazer isso? Eu vi menção de um cplvcomando, mas isso parece ser antigo ou não algo que já estava disponível para Linux.

jkp
fonte

Respostas:

20

Se você pode organizar para que o volume lógico esteja em um subconjunto separado de volumes físicos do restante do grupo de volumes de origem ( lvconvert sourcevg/sourcelv /dev/pv1 ...pode ajudar), você pode usar vgsplitpara dividir o lv em uma nova vg e vgmergemesclar a nova vg no alvo vg.

Embora o LVM tenha um recurso de espelhamento, você não pode usá-lo (com segurança) para fazer uma cópia entre grupos de volumes, porque as duas pernas do espelho devem viver na mesma vg e a associação não pode ser quebrada .

Você pode copiar um volume LVM para outro da mesma forma como copia qualquer volume para outro: crie um lv de destino do tamanho apropriado e copie o conteúdo com dd if=/dev/sourcevg/sourcelv of=/dev/targetvg/targetlv bs=4M. Se o volume de origem estiver ativo, você poderá alavancar o LVM para fazer uma cópia consistente: primeiro tire um instantâneo do lv de origem lvcreate -se copie o instantâneo.

Gilles
fonte
1
Gilles brilhante ... O vgsplit / vgmerge provavelmente ficará bem: depois disso, posso usar o pvmove para mover as extensões físicas para o novo disco e remover o volume antigo do VG.
Jkp
Pena, isso não funcionou para mim no final devido a diferentes tamanhos de extensão. Se isso não for um problema para você, sugiro que esse método seja mais fácil.
Jkp
Depois dd(se você não se apressar para jogar fora volumes antigos), não se esqueça de mudar a UUID de novos sistemas de arquivos: tune2fs -U aleatória / dev / targetvg / targetlv
midenok
2
pvmove -n lvol1 /dev/sdb1 /dev/sdc1

O pvmove pode mover dados entre volumes físicos: Guia do administrador do LVM

milão
fonte
10
Mas não entre grupos de volumes.
Matt Bianco
Repito: isso não funciona para dois grupos de volume separados
kissgyorgy
Primeiro vgextendvg1 com um novo pv, depois pvmoveseu lv para o novo pv, vgsplitum vg temporário que você vgmergevg2. Então, pvmovenovamente, lv para vg2 pv original, vgreducevg2 , para ler o pv intermediário. Ou, para evitar a cópia intermediária, você pode simplesmente mesclar vg1 em vg2, pvmovelv1 e vgsplitnovamente vg1 a partir de vg2. Isso deve responder às objeções de @ MattBianco e @kissgyorgy e é equivalente à solução do @Gilles, mas substitui o instantâneo e o nível inferior ddpor umpvmove
marcz
1

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 lvconvertsegue.

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 grupos de volumes vg1e vg2em /dev/loop1e /dev/loop2 respectivamente.

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

Crie volumes lógicos lv1e lv2em vg1e vg2respectivamente.

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

Crie sistemas de arquivos ext4 em lv1e lv2.

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

Opcionalmente, escreva algo lv1para que você possa verificar posteriormente se a cópia foi criada corretamente. Tornar vg1inativo.

vgchange -a n vg1

Execute o comando mesclar no modo de teste. Isso se funde lv1em lv2.

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. A <> argumento diz lvconvertpara fazer a cópia do espelho lv1_copyno /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 vg2inativo.

vgchange -a n vg2

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:

Logical volumes in `vg1` must be inactive

E na divisão:

Logical volume `vg2/lv1` must be inactive.
Faheem Mitha
fonte