Como mover / copiar volume lógico (lv) para outro grupo de volumes (vg)?

17

Basicamente, quero mover / copiar vários volumes lógicos (lv) para um novo grupo de volumes (vg). O novo grupo de volumes reside em um novo conjunto de volumes físicos. Alguém sabe como fazer isso com segurança sem danificar os dados dentro desses volumes lógicos?

ninguém
fonte
Você pode fornecer mais detalhes? Você sabe como criar novos VG e LV? Você está movendo uma partição de dados ou sua partição raiz?
Pantera
@ bodhi.zazen: Na verdade, eu estava tentando mover um tipo de partição de dados. O que eu quis dizer com "tipo de" foi: esses volumes lógicos são máquinas virtuais. (ou seja, esses volumes lógicos são exibidos nas máquinas virtuais como dispositivos de bloco). Enfim, eu era capaz de lidar com a situação do meu jeito. Os passos são dados na minha resposta. No entanto, você e todos vocês são convidados a comentar sobre o meu método. Se há / há uma maneira melhor de fazer esse tipo de coisa, por favor, seja gentil o suficiente para compartilhá-lo. :)
ninguém
Primeiro eu teria criado o novo PV / LV, desligado a VM e copiado os dados com o dd, inicializado a nova VM e confirmado que funcionava.
Pantera

Respostas:

11

O vgmerge permite mesclar dois VGs. Você também pode usar o pvmove para mover dados dentro de um VG e o vgsplit se desejar voltar para vários VGs.

Gabriel
fonte
9

Não há razão para copiá-lo para um arquivo .img primeiro, basta fazer o lvcreate primeiro e depois copiá-lo diretamente:

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
anon
fonte
2
Isso é breve demais. Ele não diz quais são exatamente os tamanhos mencionados - por exemplo, <o tamanho> pode ser muito pequeno, pois é apenas para diferenças de instantâneo.
Gorn
@ornorn um ponto válido, mas ele estava respondendo à resposta de ninguém abaixo, que era a primeira da época. Leia isso para um contexto adicional.
Tobias J
7

Ok, eu era capaz de lidar com a situação do meu jeito. Aqui estão os passos que eu tomei:

1) Tire uma captura instantânea do volume lógico de destino.

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

Nota: O tamanho da captura instantânea pode ser tão grande quanto ou tão pequeno quanto você desejar. O que importa é ter espaço suficiente para capturar alterações durante o período da captura instantânea.

2) Crie uma cópia da imagem do conteúdo da captura instantânea usando dd

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

3) Crie um novo volume lógico de tamanho suficiente no grupo de volumes de destino (novo).

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

4) Grave dados no novo volume lógico do backup da imagem usando dd

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

5) exclua o instantâneo e o backup de imagem usando lvremovee rmrespectivamente.

Isso é tudo pessoal ... Espero que isso ajude alguém :)

ninguém
fonte
Se alguém tiver uma opção / método melhor, informe-me também :-)
ninguém
2

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 o grupo de volumes vg1 com o volume lógico lv1 e vg2 com o lv2 e fazemos uma cópia do lv1 no 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 lv1 em 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 vg2 inativo.

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
é apenas inútil. Você precisa desmontar sistemas de arquivos, desativar volumes, etc. Você também pode desmontar o diretório e copiar dados também.
user189142
2

Até agora, as quatro respostas perdem que o tamanho exato do volume geralmente não é conhecido. lvdisplaymostra apenas valores arredondados para 2 casas decimais e man lvdisplayapenas aponta para outros comandos para as opções disponíveis. A seguir, selecione MiB, que é suficientemente preciso com o tamanho de bloco LVM padrão de 4 MiB:

lvdisplay --units m

MiB também é a unidade padrão para --sizede lvcreate. Em caso de dúvida, verifique novamente o tamanho correto lvdisplaydepois de criar o volume de destino. Em seguida, vá em frente, como nas outras respostas, para fazer uma cópia. Além disso, eu recomendaria verificar a cópia , por exemplo, com cmp.

Aqui, por que um instantâneo é usado e o que ele protege e não protege:

  • A captura instantânea é feita para que todos os dados sejam copiados como no momento em que a captura instantânea foi criada. As atividades no volume de origem durante o processo de cópia não serão refletidas na cópia.

  • A captura instantânea também protege o volume de origem de erros humanos na ddlinha de comando. Se você gravar acidentalmente no instantâneo, apenas os dados do instantâneo serão danificados e você poderá simplesmente remover o instantâneo e começar de novo.

  • O volume de destino não é protegido durante os processos de cópia. Se outro administrador (ou um processo automático como o os-prober de dracut) monta o volume incompleto, a montagem pode estragar tudo. (Mesmo uma montagem somente leitura ainda pode gravar entradas de diário no volume.)

Joachim Wagner
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
0

Se você precisar copiar um volume lógico do VG A para outro VG B, encontrei uma variante interessante usando partclone. O instantâneo copiado com dd é um bom método, mas pode ser lento se o sistema de arquivos não estiver cheio. Esta solução é muito rápida porque copia apenas os blocos usados.

  1. Primeiro, crie um instantâneo do LV de origem
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

o --sizeaqui é o quanto a escrita, pode ocorrer antes do snapshot será desativado

  1. Crie o LV de destino no VG de destino
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size deve ter pelo menos o tamanho da fonte LV

  1. Copie o sistema de arquivos do backup lv de origem para o LV de destino
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_typepode ser ext4, fat32, btrfs, xfs, ... nenhum FS apoiado por partclone

  1. Excluir o instantâneo
lvremove /dev/sourcevg/lv-backup
HugoPoi
fonte