Migratie tussen KVM hosts

Ik heb onlangs een nieuwe fysieke server gehuurd, want op de oude begon ik tegen de maximale hoeveelheid RAM-geheugen te botsen. Nu is dat op zich niet zo spectaculair, alleen gebruik ik dat systeem als KVM host; en is het niet de bedoeling om voor twee servers te blijven betalen. Een migratie van de ene naar de andere drong zich dus op.

Het is gelukkig niet zo moeilijk, alleen moet je wel met een paar uitdagingen rekening houden om alles goed te laten verlopen.

  1. De virtuale machine moet uitgeschakeld zijn tijdens de transfer (anders heb je een inconsistent state).
  2. De transfer van de schijven tussen de twee hosts kan lang duren.
  3. Het netwerk moet op beide hosts hetzelfde zijn, wat in mijn setup voor een aantal bijkomende gevolgen gezorgd heeft.
  4. Je moet van de oude naar de nieuwe machine een SSH-connectie kunnen maken. Gebruik hiervoor eventueel een specifieke gebruiker, maar nooit root (verder $user).

How-to

Het proces zelf telt maar een aantal stappen. $machine verwijst naar de VM, $host naar de nieuwe server. Ik raad ook aan om alles in een screen-sessie (meer info) uit te voeren zodat je niet alle voortgang kwijt bent wanneer de connectie zou verloren gaan. Om dit te doen werken, voer ctrl + a in en dan d. Om dan terug in je screen te werken, gebruik je screen -r. Doe dit voor je begint, want anders ben je alsnog al je voortgang kwijt.

Ah en even vermelden dat dit vooral mijn casus is, en dat in jouw geval sommige commando’s anders moeten. Caveat emptor.

  1. Stop de VM (kan via het OS of door het uitvoeren van virsh shutdown $machine).
  2. Open een SFTP-connectie naar de nieuwe server: sftp $user@$host. Navigeer naar de doelmap (zorg dat die groot genoeg is en dat je gebruiker schrijfrechten heeft) en begin de upload (put /var/lib/libvirt/images/$naam_van_de_image.qcow2). Deze stap duurt een tijdje, dus open een ander window in je screensessie voor de volgende stappen.
  3. Maak een dump van de XML-configuratie met virsh dumpxml $machine > $machine.xml. Ik heb ervoor gekozen om zo weinig mogelijk veranderingen door te voeren tussen de oude en de nieuwe server (zelfde netwerk, zelfde architectuur, …); heb je dit niet gedaan dan zal je aanpassingen in de XML moeten doen. Ik kon mij beperken tot:
    1. Aanpassen van de machine-architectuur van pc-i440fx-rhel7.0.0 naar pc (de nieuwe host is Rocky Linux 9, de oude CentOS 7) in <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>.
    2. Aanpassen van de naam van de netwerkbridge van virbr10 naar virbr0 in <source bridge='virbr10' />. Geen idee waarom dit virbr10 is, want de standaard is virbr0.
  4. Ook de XML moet op het nieuwe systeem staan; dat kan op dezelfde manier als de disk images.
  5. Hopelijk staat nu alles al op het nieuwe systeem (anders is het nog wachten). Plaats de disk images onder /var/lib/libvirt/images, of op een andere plaats waar je ze kan terugvinden. Zorg dat qemu de owner is en dat ze op modus 0600 staan (anders kan jan en alleman ze lezen; dat is niet de bedoeling natuurlijk). Als ze op het nieuwe systeem elders staan dan op het oude, dan moet je ook in de XML de locatie aanpassen.
  6. Maak de machine aan op basis van de XML met virsh define $machine.xml.
  7. Start de machine op met virsh start $machine (en zet meteen autostart ook aan met virsh autostart $machine). Brand een kaarsje en hoop dat alles werkt (dit zou moeten).

Als jouw setup niet zo ingewikkeld is als die van mij (i.e. geen afzonderlijke DNS-server of VPN-truukjes), dan zal alles nu in principe werken en kan je de machine op de nieuwe host online brengen en de DNS-entries aanpassen. Als je daarentegen de dingen graag ingewikkeld maakt moet je wachten tot alles is overgezet en moet je de routes van de VPN-server bijwerken. Maar ik zou zo’n complex geheel afraden …

Je kan deze post trouwens maar lezen wanneer alles gelukt is …