Manera correcta de mover kvm vm


34

Me pregunto cuál es la forma correcta de mover una VM entre dos hosts KVM sin usar ningún tipo de almacenamiento compartido

¿Sería suficiente copiar los archivos de disco y el volcado XML de la máquina KVM de origen al destino? Si es así, ¿qué comandos deben ejecutarse para importar el vm en el destino?

El sistema operativo es Ubuntu tanto en Dom0 como en DomU.

Gracias por adelantado

Respuestas:


41
  1. copie los discos de la VM desde /var/lib/libvirt/imagesel host src al mismo directorio en el host de destino
  2. en el host de origen, ejecute virsh dumpxml VMNAME > domxml.xmly copie este xml en el host de destino
  3. en el host de destino ejecutado virsh define domxml.xml

iniciar la VM.

  • Si la ubicación del disco difiere, debe editar los dispositivos / nodo del disco xml para que apunten a la imagen en el host de destino
  • Si la VM está conectada a redes definidas personalizadas, deberá editarlas fuera del xml en el host de destino o redefinirlas también ( virsh net-dumpxml > netxml.xmly la virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME)

y qué
pasa

2
Puede eliminar los UUID del dispositivo desde el xml, solo deje el camino /dev/mapper/vgname-lvnameallí
dyasny

10

Como todavía no puedo comentar, tengo que publicar este apéndice a la respuesta de dyasny de esta manera.

Si la VM tiene instantáneas que desea conservar, debe volcar los archivos xml de instantánea en el origen con virsh snapshot-dumpxml $dom $name > file.xmlcada instantánea en la lista de instantáneas de la VM virsh snapshot-list --name $dom.

Luego, en el destino, use virsh snapshot-create --redefine $dom file.xmlpara finalizar la migración de las instantáneas.

Si también te importa qué instantánea es la actual, hazlo también en el origen
virsh snapshot-current --name $dom
y en el destino:
virsh snapshot-current $dom $name

Luego, puede usar virsh snapshot-delete --metadata $dom $namepara cada instantánea para eliminar los archivos xml en la fuente, o simplemente puede eliminarlos de/var/lib/libvirt/qemu/snapshots/$guestname


Fuentes:

  1. lista de correo libvirt-users

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


Es demasiado largo para un comentario de todos modos, no se preocupe. Gracias por su contribución
HBruijn

Votado porque te mereces el derecho a comentar :-)
Onnónimo

3

Sí, simplemente copiar el archivo XML y las imágenes del disco virtual es suficiente, pero esto obviamente impide una migración "en vivo". La VM debe apagarse durante este procedimiento.

Una vez copiado en el destino, libvirtddebe volver a cargarse o reiniciarse para reconocer el nuevo archivo XML.


De acuerdo con help.ubuntu.com/community/KVM/Virsh y para completar una respuesta, creo que la secuencia de comandos sería: En la fuente Dom0: - virsh shutdown foo - virsh dumpxml foo> /tmp/foo.xml Luego en el Dom0 de destino: - Copie sobre los archivos de disco y colóquelos en el mismo directorio que el Dom0 de origen - Copie sobre el volcado XML - virsh create /tmp/foo.xml - virsh start foo
Onitlikesonic

Suficientemente razonable si lo usa virsh. Simplemente copiaría los archivos directamente y volvería a cargar libvirtd.
Michael Hampton

2

Instrucciones detalladas sobre cómo copiar máquinas virtuales con blocksync.py

Estas instrucciones se aplican a una VM que utiliza un disco proporcionado por LVM y asume que Python está en cada uno de los hosts

Descargue el script blocksync.py de https://gist.github.com/rcoup/1338263 y coloque el host de origen y de destino en su carpeta / home / user.

Precursor

  • Deberá tener acceso 'ssh' a ambas máquinas (fuente y destino) para su usuario.
  • También necesitará tener acceso 'sudo' a 'root' en ambas máquinas.

  • Alternativamente, puede hacer todo como root, pero solo si su clave ssh le da acceso root al menos a la máquina de destino. ** En este caso, elimine el nombre de usuario de las líneas de comando.

Configuraciones de ejemplo

  • La máquina virtual está en el host dom0 conocido como chewie
  • El destino deseado en el host dom0 conocido como darth y tenía una IP interna aquí 10.10.10.38 (para nuestro ejemplo)
  • En nuestro caso real, usamos centos 7 como sistema operativo dom0 en ambas máquinas
  • La máquina VIRTUAL en este caso que estamos moviendo se llama LARRY
  • El usuario que realiza la acción es USUARIO (que será su nombre)
  • DOM0 significa el servidor físico real

Procedimiento

Pasos iniciales en el host de origen

  • Inicie sesión en el host dom0 que actualmente tiene la máquina (el host "fuente"), por ejemplo:
    ssh user@chewie.domainname.com.au
  • Permanezca como su usuario, así que no se convierta en usuario de sudo * Enumere máquinas con
    sudo virsh --todos
  • Volcar la definición de máquina usando, por ejemplo:
    sudo virsh dumpxml larry> larry.xml
  • Copie la definición volcada en la nueva máquina (el host "objetivo"), por ejemplo:

    scp -p larry.xml 10.10.10.38:larry.xml
    puede cambiar la dirección IP interna a su nombre de servidor dom0 de destino ** Nota: es mejor usar la dirección IP para el destino, por ejemplo:
    scp -p larry.xml user@10.10.10.38: larry.xml

    Si no puede copiar debido a las claves, el gato larry.xml y cópielo. Luego, puede enviar ssh a otra máquina y crear un archivo y pegarlo.

  • Encuentre el tamaño y el nombre del disco de la VM usando

    sudo lvs --unidades B
    .
    ** El comando anterior debe mostrar el tamaño exactamente en bytes. ** El nombre del disco de la máquina está en la primera columna de la lista, su grupo de volúmenes en la segunda y el tamaño en la última. ** Determine el nombre del dispositivo como / dev // ** Verifíquelo con un comando 'll' Por ejemplo, en esta salida: vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr LSize Pool Origen Datos% Meta% Move Log Cpy% Sync Convert
  raíz_vv 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

  • El nombre del disco es 'vm_larry', el grupo de volúmenes es 'vg1'.
  • El nombre del dispositivo es / dev / vg1 / vm_larry
  • Salida para, por ejemplo:
    ls -l / dev / vg1 / vm_larry
    es: lrwxrwxrwx. 1 raíz raíz 8 31 de enero 13:57 / dev / vg1 / vm_larry -> ../dm-11

Pasos iniciales en el host de destino

  • Inicie sesión en el host de destino, p. Ej.
    ssh user@darth.domainname.com.au
  • Mantente como tu propio usuario. es decir, no se convierta en root.
  • Cree un archivo de definición de volumen, por ejemplo:

    vi larry.domainname.com.au-vol.xml
    o
    nano larry.domainname.com.au-vol.xml
    con las siguientes líneas: NOTA: deberá tomar el tamaño en bytes de la máquina virtual original y colocarlo en el siguiente script. El comando en la máquina fuente para el tamaño 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 definición es para un disco de 69793218560 bytes para VM larry, cambie según sea necesario para la VM real.

Nota: el nombre y la última parte de la ruta deben coincidir y se utilizarán como el nuevo nombre del disco.

Cree el nuevo disco a partir de la definición, utilizando

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

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

Haga que el archivo del dispositivo de disco sea accesible:

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

Edite la definición xml copiada, por ejemplo:

vi larry.xml

Busque la definición del disco en el archivo (busque "source dev =") y reemplace el dispositivo con el que acaba de crear (puede ls / dev / centos / para ver vm), por ejemplo: / dev / drbd4 -> / dev / centos / larry.domainname.com.au

Este cambio de puente fue exclusivo de nuestra situación.

** Encuentre referencias a "br1" en las estrofas de la interfaz y cámbielo a "br0", por ejemplo, está cambiando el puente de origen para que la línea sea así

Pasos finales en el host de origen

  • Inicie sesión en el host de origen, p. Ej.

    ssh user@chewie.domainname.com.au

  • La mejor práctica sería apagar la máquina virtual en el host de origen antes de realizar la sincronización final, pero no es necesario hacerlo. (cierre de virsh NameOfMachine)

  • Si aún no está en el host de origen, descargue el script blocksync.py de https://gist.github.com/rcoup/1338263

  • Si su nombre de usuario es user (por ejemplo), copie el script blocksync.py en ambas máquinas en / home / user y chown user: user y chmod 755 el script.

  • Si aún no está en el host de destino, cópielo allí, por ejemplo:
scp -p blocksync.py usuario@10.10.10.38: blocksync.py
  • Úselo para copiar el disco de origen en el disco de destino, p. Ej.

Comando que hace la copia

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

Nota: el primer nombre del dispositivo es para el host de origen, según lo determinado por el comando 'lvs'; este es de un host fuente [[chewie]].

Nota: esto destruirá el contenido del disco de destino, asegúrese de que /dev/mapper/centos-larry.domainname.com.au sea correcto.

Nota: la sincronización llevará mucho tiempo, aproximadamente 100 segundos por gigabyte, es decir, 90 minutos para un disco de 60 gigabytes.

Sin embargo, puede hacer una sincronización mientras la VM está en uso; las sincronizaciones posteriores pueden ser hasta un 25 por ciento más rápidas

El script imprimirá los parámetros que está utilizando (puede haber un mensaje sobre un módulo en desuso, esto está bien). A continuación, muestra el comando ssh que está utilizando y lo ejecuta (verá el mensaje de personal autorizado solo cuando lo haga). Durante su sincronización, mostrará un total acumulado de bloques copiados y su velocidad promedio. Finalmente, imprime un mensaje de finalización con la cantidad de segundos que tardó.

Cosas que saber

Puede cancelar la sincronización con CTRL C y reiniciarla más tarde ejecutando el comando nuevamente

Pasos finales en el host de destino

  • Inicie sesión en el host de destino, p. Ej.
     ssh user@darth.domainname.com.au
  • Cree la máquina virtual, por ejemplo:
    virsh define larry.xml
  • Inicie la máquina recién definida, por ejemplo:
    sudo virsh empezar larry
  • Márcalo para comenzar en el arranque del host, por ejemplo:
    sudo virsh autostart larry

Nota: puede ser necesario modificar los detalles de la VM para adaptarlos al nuevo entorno.


No he intentado esto, pero recibió mi voto positivo por las instrucciones detalladas proporcionadas. Cuando llegue el momento de hacer esto, lo más probable es que lo intente.
G Trawo

1

Me he encontrado con este problema con algunos de mis servidores KVM más antiguos, pero es realmente molesto cuando ocurre y puede causar problemas con cualquiera de las máquinas virtuales instaladas. En mi caso, regularmente empujaba una de mis máquinas virtuales al estado de reinicio, ya que el espacio en disco se agotaba lentamente. Las instrucciones a continuación son algo sensibles a la versión KVM / Distro. En mi caso, tengo CentOS 7.5

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

Por defecto, las imágenes KVM se ubican en la ubicación / var / lib / libvirt / images /

Necesita encontrar el nombre de la máquina virtual, para esto use virsh list

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

Detenga el VM virsh stop VM-Name

Para mí copio el archivo primero, en lugar de moverlo. Copie el archivo qcow a la nueva ubicación

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

Edite el archivo VM xml, para hacer referencia a la nueva ubicación del "archivo fuente" virsh edit VM-Name

Querrá cambiar el "archivo fuente" de este archivo

Reinicie el servicio libvirtd.

service libvirtd restart

Luego reinicie la VM y debería estar listo para comenzar.

virsh start VM-Name
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.