Heute wurde ich in das Büro geholt, da beim Update auf die letzten XenServer-Version (5.5.0 Update-1) wohl einiges schief gegangen ist. Nach dem Neustart des Servers konnten unser FibreChannel Storage Repository, das lokale Storage Repository und die iSCSI-Volumes nicht mehr geladen werden. Beim Re-attachen eines iSCSI-Laufwerks bekam ich den Fehler, dass der Treiber lvmoiscsi nicht geladen wurde. Weiterhin war es uns auch nicht möglich, die USB-Treiber zu nutzen, da diese offensichtlich nicht mehr vorhanden gewesen sind.

Problematischerweise konnten wir mit der Installations-Cd von 5.5.0 Update-1 unser System nicht wiederherstellen bzw. upgraden, da der Patch bereits als komplett installiert erkannt worden war.

Nach mehreren missglückten Lösungsansätzen und wenig Erfolg bei Google hatte ich dann die rettende Idee, folgende Kommandos müssen auf der CLI des XenServers abgesetzt werden.

wget http://downloadns.citrix.com.edgesuite.net/4276/XenServer-5.5.0-Update1.xsupdate /tmp
xe patch-upload file-name=XenServer-5.5.0-Update1.xsupdate

Nun kann es sein, dass der Patch bereits als installiert gekennzeichnet worden ist. Deshalb muss im Verzeichnis /var/patch bzw. /var/patch/applied das Verzeichnis mit der UUID, die xe patch-upload zurückliefert, verschoben werden.

/usr/bin/gpg --homedir /opt/xensource/gpg --no-default-keyring --keyring /opt/xensource/gpg/pubring.gpg --decrypt /tmp/XenServer-5.5.0-Update1.xsupdate > /tmp/update.sh
chmod u+x /tmp/update.sh
/tmp/update.sh unpack

Damit wird die Installationsdatei entschlüsselt und danach entpackt. Der Aufruf von /tmp/update.sh apply funktionierte bei uns nicht, da die Version trotz oben genannter Anpassungen als bereits installiert gekennzeichnet worden war.
Im Verzeichnis /tmp befindet sich nun ein neues Unterverzeichnis, in dem die Installationsdaten des Updates liegen. Das Script install.sh ist leider so geschrieben, dass es bei der ersten fehlgeschlagenen Installation eines RPM-Packages komplett abbricht. Außerdem braucht es eine kleine Anpassung im Header (vi install.sh):

#!/bin/bash
### Generic patch install.sh script
# ...

#[ -n "$UUID" ] || exit 2
UUID=$2
# ...

Die Zeile mit der Überprüfung der UUID muss auskommentiert und stattdessen UUID als zweiter Parameter des Scripts übergeben werden.
Nun folgt die Installation aller RPM-Packages. Eventuell müssen die Packages in richtiger Reihenfolge installiert werden, bei mir reichte aber

rpm -U *.rpm

aus.
Es sollten nun (hoffentlich!) alle nötigen RPM-Packages installiert worden sein. Als letzten Schritt muss die Datei CONTENTS angepasst werden. Sie enthält alle Dateien, die beim Update-Prozess geändert/installiert werden. Da die RPM-Packages bereits im vorherigen Schritt installiert worden sind, müssen sie aus der Datei entfernt werden.

cp CONTENTS CONTENTS.bak
vi CONTENTS
# alle Zeilen beginnend mit "rpm" löschen

Soweit so gut, nun folgt der Aufruf des install.sh-Scripts:

install.sh apply $UUID

$UUID muss mit der UUID aus Schritt 1 (xe patch-upload) ersetzt werden. Nach einem Neustart ist der XenServer auf dem letzten Stand.

Für die Frickler unter euch, die wissen möchten, wie der Update-Prozess abläuft:

  • Laden der Update-Datei
  • Entpacken der Daten und Aufruf des Scripts:
    • Delegation an die install.sh
    • Zeilenweise lesen der Datei CONTENTS
    • Je nach Beginn der Zeile in CONTENTS wird ein RPM-Package installiert oder eine Datei umkopiert
    • Aufruf der post_install(_update1) zum Generieren der initrds

I am asking you for a donation.

You liked the content or this article has helped and reduced the amount of time you have struggled with this issue? Please donate a few bucks so I can keep going with solving challenges.