KVM Migrate Skript

4 Dez 2015 - Lesezeit: 4 Minuten

Es wäre gelogen wenn ich sagen würde, das ich "immer wieder" in die Situation gelange KVM Hosts zu bearbeiten oder zu migrieren. Dennoch ist KVM ein toller Hypervisor der sowohl Spaß macht, als auch interessante Features mit sich bringt und gleichzeitig vom Handling her den Eindruck vermittelt vieles noch handhaben zu können, auch wenn es mal zu dicken Schwierigkeiten kommt.

Daher habe ich für mein Setup ein Skript gebastelt, welches mir die Konfigurationen (XML - Daten) der eingerichteten virtuellen Maschinen mittels virsh exportiert um im falle eines Ausfalls die Maschinen wieder rekonstruieren zu können (mit wirsch define oder wirsch create).

Wichtig dafür ist natürlich das es ein externes Medium gibt auf dem die Daten gespeichert werden können. In meinem Fall ist es ein zentrales FreeNAS Storage.

Wenn man noch zwischen unterschiedlichen Linux Distributionen hin- und her switched hat man unter umständen das Problem, dass bestimmte Maschine types nicht vorhanden sind oder andere Werte angepasst werden müssen. Dazu nutze ich einfach "sed" das mir unter die Arme greift.

Als Ergebnis habe ich mittels Cron alle voll Stunde frische Konfigurationsdateien die ich einfach auf einem anderen KVM Host importieren kann.

Mit Hilfe meines Skript kann ich nun mit Hilfe von Parametern sowohl alle virtuellen Maschinen an ohne Angabe eines Parameters an einen in "CONFIGDESTDIR" definiertenOrt speichern, oder diesen angeben.

  • Alle Konfigurationen im Pfad speichern der im Skript angegeben ist
    • kvm-export.sh
  • Alle Konfigurationen im Pfad speichern der als Parameter angegeben wird
    • kvm-export.sh export /PATH/TO/NEW/STORAGE

Beim Import verhält es sich ein wenig anders. Hier kann ich zusätzlich noch eine bestimmte Maschine angeben

  • Alle Konfigurationen im Pfad speichern der im Skript angegeben ist
    • kvm-export.sh
  • Alle Konfigurationen im Pfad speichern der als Parameter angegeben wird
    • kvm-export.sh import /PATH/TO/NEW/STORAGE
  • Eine bestimmte Maschine importieren
    • kvm-export.sh import /PATH/TO/NEW/STORAGE
#!/bin/bash
CONFIGDESTDIR=/PATH/TO/STORAGE/

if [ "$1" == "export" ]; then
 if [ -z "$2" ]; then
    echo "Konfigurationen werden nach $CONFIGDESTDIR exportiert!";
   else 
    CONFIGDESTDIR=$2
    echo "Konfigurationen werden nach $CONFIGDESTDIR exportiert!";
 fi

 if [ -d $CONFIGDESTDIR ]; then
  echo "Exportverzeichnis ist vorhanden.";
  else
  echo "Exportverzeichnis ist nicht vorhanden und wird angelegt!";
  mkdir $CONFIGDESTDIR;
 fi

for i in $(virsh list --all | sed '1,2d' | awk '{print $2}')
 do
  VMNAME=$(basename $i .xml)
  virsh dumpxml --migratable $VMNAME > $CONFIGDESTDIR/$VMNAME.xml;
  sed -i "s/\/usr\/bin\/kvm/\/usr\/libexec\/qemu-kvm/" $CONFIGDESTDIR/$VMNAME.xml;
  sed -i "s/machine='pc-1.1'/machine='pc-i440fx-rhel7.0.0'/" $CONFIGDESTDIR/$VMNAME.xml;
  sed -i "s/machine='pc-0.12'/machine='pc-i440fx-rhel7.0.0'/" $CONFIGDESTDIR/$VMNAME.xml;
  sed -i "s/type='vmvga'/type='vga'/" $CONFIGDESTDIR/$VMNAME.xml;
 done
fi
if [ "$1" == "import" ]; then
 if [ -z "$2" ]; then
   echo "Konfigurationen werden aus $CONFIGDESTDIR importert!";
  else
   CONFIGDESTDIR=$2
   echo "Konfigurationen werden aus $CONFIGDESTDIR importert!";
  fi
 if [ -d $CONFIGDESTDIR ]; then
   echo "Importverzeichnis ist vorhanden.";
  else
   echo "Importverzeichnis ist nicht vorhanden!";
  exit;
 fi
 if [ -z "$3" ]; then
   echo "Es werden alle Maschinen importiert!";
  for i in $(ls $CONFIGDESTDIR/*.xml)
   do
    echo "Definiere Maschine $i";
    virsh define $i;
    echo "Richte Autostart ein fuer: $i";
    virsh autostart $i;
   done
 else
   echo "Definiere Maschine $3";
   virsh define $CONFIGDESTDIR/$3;
   echo "Richte Autostart ein fuer: $3";
   virsh autostart $CONFIGDESTDIR/$3;
 fi
fi