Maneira correta de mover kvm vm


34

Gostaria de saber qual é a maneira correta de mover uma VM entre dois hosts KVM sem usar nenhum tipo de armazenamento compartilhado

Copiar os arquivos de disco e o XML dump da máquina KVM de origem para a de destino é suficiente? Em caso afirmativo, quais comandos precisam ser executados para importar o vm no destino?

OS é Ubuntu no Dom0 e DomU.

desde já, obrigado

Respostas:


41
  1. copie os discos da VM do /var/lib/libvirt/imageshost src para o mesmo diretório do host de destino
  2. no host de origem, execute virsh dumpxml VMNAME > domxml.xmle copie esse xml para o host de destino
  3. no host de destino executado virsh define domxml.xml

inicie a VM.

  • Se a localização do disco for diferente, você precisará editar o dispositivo / nó do disco do xml para apontar para a imagem no host de destino
  • Se a VM estiver conectada a redes definidas personalizadas, você precisará editá-las a partir do xml no host de destino ou redefini-las também ( virsh net-dumpxml > netxml.xmle o virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME)

eo que se volume lógico uso em vez de arquivo como armazenamento ... eu acho que eu vou ter problema com dispositivo uuid
inemanja

2
Você pode remover os UUIDs dispositivo do xml, basta deixar o caminho /dev/mapper/vgname-lvname
dyasny

10

Como ainda não posso comentar, tenho que postar este adendo à resposta de dyasny dessa maneira.

Se a VM tiver capturas instantâneas que você deseja preservar, você deve despejar os arquivos xml da captura instantânea na origem virsh snapshot-dumpxml $dom $name > file.xmlpara cada captura instantânea na lista de capturas instantâneas da VM virsh snapshot-list --name $dom.

Em seguida, no destino, use virsh snapshot-create --redefine $dom file.xmlpara concluir a migração dos instantâneos.

Se você também se preocupa com qual instantâneo é o atual, faça adicionalmente na origem:
virsh snapshot-current --name $dom
e no destino:
virsh snapshot-current $dom $name

Em seguida, você pode usar virsh snapshot-delete --metadata $dom $namepara cada instantâneo para excluir os arquivos xml na fonte ou simplesmente excluí-los de/var/lib/libvirt/qemu/snapshots/$guestname


Fontes:

  1. lista de discussão libvirt-users

  2. http://kashyapc.com/2012/09/14/externaland-live-snapshots-with-libvirt/


É muito longo para um comentário de qualquer maneira, não se preocupe. Obrigado pela sua contribuição
HBruijn

Promovido porque você merece o direito de comentar :-)
Onnonymous

3

Sim, apenas copiar o arquivo XML e as imagens de disco virtual é suficiente, mas isso obviamente impede uma migração "ativa". A VM deve ser desligada durante este procedimento.

Uma vez copiado para o destino, libvirtddeve ser recarregado ou reiniciado para reconhecer o novo arquivo XML.


De acordo com help.ubuntu.com/community/KVM/Virsh e para concluir uma resposta, acredito que a sequência de comandos seria: Na fonte Dom0: - virsh shutdown foo - virsh dumpxml foo> /tmp/foo.xml Em seguida, no destino Dom0: - Copie os arquivos do disco e colocá-los no mesmo diretório como a fonte Dom0 - Copiar sobre o despejo XML - virsh criar /tmp/foo.xml - virsh início foo
Onitlikesonic

Razoável o suficiente se você usar virsh. Eu apenas copio os arquivos diretamente e recarrego libvirtd.
Michael Hampton

2

Instruções detalhadas sobre como copiar VMs usando blocksync.py

Essas instruções se aplicam a uma VM usando um disco fornecido pelo LVM e pressupõe que o Python esteja em cada um dos hosts

Faça o download do script blocksync.py em https://gist.github.com/rcoup/1338263 e coloque o host de origem e de destino na pasta / home / user.

Precursor

  • Você precisará ter acesso 'ssh' às duas máquinas (origem e destino) para seu usuário.
  • Você também precisará ter acesso 'sudo' ao 'root' nas duas máquinas.

  • Como alternativa, você pode fazer tudo como root, mas apenas se sua chave ssh fornecer acesso root a pelo menos a máquina de destino. ** Nesse caso, remova o nome do usuário das linhas de comando.

Configurações de exemplo

  • A máquina virtual está no host dom0 conhecido como chewie
  • O destino desejado no host dom0 conhecido como darth e tinha um IP interno aqui 10.10.10.38 (por exemplo)
  • No nosso caso atual, usamos o centos 7 como o sistema operacional dom0 nas duas máquinas
  • A máquina virtual neste caso que estamos movendo é chamada LARRY
  • O usuário que está executando a ação é USER (que será seu nome)
  • DOM0 significa o servidor físico real

Procedimento

Etapas iniciais no host de origem

  • Efetue login no host dom0 que atualmente possui a máquina (o host "de origem"), por exemplo:
    ssh user@chewie.domainname.com.au
  • Permaneça como seu usuário, para não se tornar usuário sudo * Liste máquinas com
    sudo virsh --all
  • Despejar a definição da máquina usando, por exemplo:
    sudo virsh dumpxml larry> larry.xml
  • Copie a definição despejada para a nova máquina (o host "destino"), por exemplo:

    scp -p larry.xml 10.10.10.38:larry.xml
    você pode alterar o IP interno para o nome do servidor dom0 de destino ** Nota: é melhor usar o endereço IP para o destino, por exemplo:
    scp -p larry.xml user@10.10.10.38: larry.xml

    Se você não pode copiar devido a chaves o gato larry.xml e copiá-lo, então você pode ssh em outra máquina e criar um arquivo e colá-lo.

  • Encontre o tamanho e o nome do disco da VM usando

    sudo lvs --unidades B
    .
    ** O comando acima deve mostrar o tamanho exatamente em bytes. ** O nome do disco da máquina está na primeira coluna da lista, seu grupo de volumes na segunda e tamanho na última. ** Determine o nome do dispositivo como / dev // ** Verifique-o com um comando 'll' Por exemplo, nesta saída: vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy% Sync Convert
  lv_root vg1 -wi-ao ---- 53687091200B
  lv_swap vg1 -wi-ao ---- 17179869184B
  vm_vsrv1 vg1 -wi-ao ---- 193273528320B
  vm_vsrv10 vg1 -wi-ao ---- 64424509440B
  vm_vsrv11 vg1 -wi-ao ---- 161061273600B
  vm_vsrv12 vg1 -wi-ao ---- 204010946560B
  vm_vsrv2 vg1 -wi-ao ---- 140110725120B
  vm_vsrv3 vg1 -wi-ao ---- 128849018880B
  vm_larry vg1 -wi-ao ---- 69793218560B
  vm_vsrv5 vg1 -wi-ao ---- 257698037760B
  vm_vsrv6 vg1 -wi-ao ---- 64424509440B
  vm_vsrv7 vg1 -wi-ao ---- 161061273600B
  vm_vsrv8 vg1 -wi-ao ---- 64424509440B
  vm_vsrv9 vg1 -wi-ao ---- 214748364800B

  • O nome do disco é 'vm_larry', o grupo de volumes é 'vg1'.
  • O nome do dispositivo é / dev / vg1 / vm_larry
  • Saída para, por exemplo:
    ls -l / dev / vg1 / vm_larry
    é: lrwxrwxrwx. 1 raiz 8 de 31 de janeiro 13:57 / dev / vg1 / vm_larry -> ../dm-11

Etapas iniciais no host de destino

  • Faça login no host de destino, por exemplo
    ssh user@darth.domainname.com.au
  • Permaneça como seu próprio usuário. ou seja, não se torne raiz.
  • Crie um arquivo de definição de volume, por exemplo:

    vi larry.domainname.com.au-vol.xml
    ou
    nano larry.domainname.com.au-vol.xml
    com as seguintes linhas: NOTA - Você precisará pegar o tamanho em bytes da VM original e inseri-lo no script abaixo. O comando na máquina de origem para tamanho era sudo lvs --units B

    <volume type='block'>
       <name>larry.domainname.com.au</name>
       <capacity unit='bytes'>69793218560</capacity>
       <allocation unit='bytes'>69793218560</allocation>
      <target>
       <path>/dev/centos/larry.domainname.com.au</path>
       <permissions>
         <mode>0600</mode>
         <owner>0</owner>
         <group>6</group>
       <label>system_u:object_r:fixed_disk_device_t:s0</label>
      </permissions>
     </target>
    </volume>
    

Nota: esta definição é para um disco de 69793218560 bytes para larry da VM, altere conforme necessário para a VM real.

Nota: o nome e a última parte do caminho devem corresponder e serão usados ​​como o novo nome do disco.

Crie o novo disco a partir da definição, usando

   sudo virsh vol-create --pool centos larry.domainname.com.au-vol.xml

dirá Vol larry.domainname.com.au criado a partir de larry.domainname.com.au-vol.xml

Torne o arquivo do dispositivo de disco acessível:

sudo chgrp wheel /dev/mapper/centos-larry.domainname.com.au
sudo chmod g + rw /dev/mapper/centos-larry.domainname.com.au

Edite a definição xml copiada, por exemplo:

vi larry.xml

Encontre a definição de disco no arquivo (procure por "source dev =") e substitua o dispositivo pelo recém-criado (você pode ls / dev / centos / para ver a vm), por exemplo: / dev / drbd4 -> / dev / centos / larry.domainname.com.au

Essa mudança de ponte foi exclusiva da nossa situação.

** Encontre qualquer referência a "br1" nas sub-rotinas da interface e altere-a para "br0", por exemplo, você está alterando a ponte de origem para que a linha fique assim

Etapas finais no host de origem

  • Faça logon no host de origem, por exemplo

    ssh user@chewie.domainname.com.au

  • A melhor prática seria desligar a VM no host de origem antes de fazer a sincronização final, mas não precisa ser feita. (desligamento virsh NameOfMachine)

  • Se ainda não estiver no host de origem, faça o download do script blocksync.py em https://gist.github.com/rcoup/1338263

  • Se seu nome de usuário for usuário (por exemplo), copie o script blocksync.py em ambas as máquinas para / home / user e chown user: user e chmod 755 o script.

  • Se ainda não estiver no host de destino, copie-o para lá, por exemplo:
scp -p blocksync.py user@10.10.10.38: blocksync.py
  • Use-o para copiar o disco de origem no disco de destino, por exemplo

Comando que faz a cópia

sudo -E python blocksync.py / dev / vg1 / vm_larry user@10.10.10.38 /dev/mapper/centos-larry.domainname.com.au -b 4194304

Nota: o primeiro nome do dispositivo é para o host de origem, conforme determinado no comando 'lvs'; este é de um host de origem [[chewie]].

Nota: isso destruirá o conteúdo do disco de destino, verifique se /dev/mapper/centos-larry.domainname.com.au está correto!

Nota: a sincronização levará muito tempo - cerca de 100 segundos por gigabyte, ou seja: 90 minutos para um disco de 60 gigabytes.

No entanto, você pode fazer uma sincronização enquanto a VM estiver em uso; sincronizações subsequentes podem ser até 25% mais rápidas

O script imprimirá os parâmetros que está usando (pode haver uma mensagem sobre um módulo obsoleto, tudo bem). Em seguida, ele exibe o comando ssh que está usando e o executa (você verá a mensagem somente da equipe autorizada quando fizer isso). Durante sua sincronização, ele exibirá um total de blocos copiados e sua velocidade média. Por fim, imprime uma mensagem de conclusão com o número de segundos que levou.

Coisas a Saber

Você pode cancelar a sincronização com CTRL C e reiniciá-lo mais tarde executando o comando novamente

Etapas finais no host de destino

  • Faça login no host de destino, por exemplo
     ssh user@darth.domainname.com.au
  • Crie a máquina virtual, por exemplo:
    virsh define larry.xml
  • Inicie a máquina recém-definida, por exemplo:
    sudo virsh start larry
  • Marque para iniciar na inicialização do host, por exemplo:
    sudo virsh autostart larry

Nota: pode ser necessário alterar os detalhes da VM para se adequar ao novo ambiente.


Eu não tentei isso, mas você recebeu meu voto positivo pelas instruções detalhadas fornecidas. Quando chegar a hora de fazer isso, provavelmente tentarei isso.
G Trawo 10/01

1

Eu encontrei esse problema com alguns dos meus servidores KVM mais antigos, mas é realmente irritante quando isso acontece e pode causar problemas em qualquer uma das VMs instaladas. No meu caso, ele regularmente colocava uma das minhas VMs no estado de redefinição, pois o espaço em disco era lento. As instruções abaixo são um pouco sensíveis à versão KVM / Distro. No meu caso, eu tenho o CentOS 7.5

CentOS Linux release 7.5.1804 (Core) and Qemu-KVM version 1.5.3

Por padrão, as imagens KVM estão localizadas no local / var / lib / libvirt / images /

Você precisa encontrar o nome da VM, para esta lista de uso virsh

virsh list
 Id    Name                           State
----------------------------------------------------
 12    VM-Name                        paused

Pare o virsh da VM, pare o VM-Name

Para mim, copio o arquivo primeiro, em vez de me mover. Copie o arquivo qcow para o novo local

cp /var/lib/libvirt/images/VM-Name.qcow2 /home/VMImages/

Edite o arquivo xml da VM, para referenciar o novo local "arquivo de origem" virsh edit VM-Name

Você deseja alterar o "arquivo de origem" deste arquivo

Reinicie o serviço libvirtd

service libvirtd restart

Em seguida, reinicie a VM e você deve estar pronto.

virsh start VM-Name
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.