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

Onitlikesonic
fonte

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)
dyasny
fonte
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/

LN2
fonte
É 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.

Michael Hampton
fonte
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 [email protected]
  • 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 [email protected]: 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 [email protected]
  • 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 [email protected]

  • 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 [email protected]: 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 [email protected] /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 [email protected]
  • 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.

Dale Carter
fonte
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
gerryamurphy
fonte