SLES 10 mit fremdem virt-manager

Wenn man einen SuSE Linux Enterprise Server 10 mit Service Pack 2 oder neuer einsetzt, möchte man sicherlich auch den von Red Hats Arbeitsgruppe "Emerging Technologies" entwickelten Virtual Machine Manager (die Anwendung ist besser als "virt-manager" bekannt) einsetzen. Doch das geht leider nicht ohne weiteres, läuft der virt-manager unter Red Hat Enterprise Linux, CentOS oder unter Fedora.

Beim libvirtd handelt es sich um einen Daemon, der eine Abstraktionsoberfläche für Xen und KVM darstellt. Auf diese Abstraktion setzt der von Red Hat entwickelte Virtual Machine Manager mit Anwendungen wie "virt-manager", "virt-install" und "virsh" auf. Da die Arbeitsgruppe "Emerging Technologies" von Red Hat die Entwicklung des Virtual Machine Managers vorantreibt, ist recht einleuchtend, dass Fedora und Red Hat Enterprise Linux bzw. CentOS zügig recht neue Versionen einsetzen.

Das Problem ist, dass der SuSE Linux Enterprise Server 10 von Novell dem ganzen etwas hinterherhinkt. Selbstverständlich liefert auch Novell mit SLES 10 einen funktionierenden virt-manager aus, jedoch nicht mit dem gleichen Funktionsumfang. So konnte ich dort keine Möglichkeit für eine Remote-Verbindung über SSH entdecken. Und befindet man sich, so wie es bei mir der Fall ist, sowieso in einer Fedora-Umgebung, muss sich der SuSE Linux Enterprise Server mit libvirtd in den virt-manager von Fedora integrieren lassen, was bei mir leider nicht problemlos auf Anhieb funktioniert hat. Das Problem ist bei Novell bekannt und wird im Bugreport #397633 ("virt-manager remote connections do not work in SLES 10 SP2") im nicht direkt öffentlich zugänglichen Bugzilla bei Novell geführt.

Das Hauptproblem ist, dass der SuSE Linux Enterprise Server 10 das Werkzeug "nc" (auch als "netcat" bekannt) lediglich in Version 1.10 ausliefert; bei Red Hat bzw. Fedora war dies zuletzt im Jahr 2005 der Fall. Red Hat Enterprise Linux bzw. CentOS und Fedora liefern mindestens die Version 1.84 aus, welche eine Unterstützung zur Verbindung auf Unix-Sockets unterstützt - und genau diese Funktionalität wird vom virt-manager benötigt. Desweiteren lautet der Pfad zum Werkzeug unter dem SuSE Linux Enterprise Server 10 "/usr/bin/netcat" während er unter Red Hat Enterprise Linux bzw. CentOS und Fedora "/usr/bin/nc" lautet und vom Virtual Machine Manager auch so erwartet wird.

Der Trick ist nun, nc z.B. aus CentOS auf dem SuSE Linux Enterprise Server 10 neu zu kompilieren und zu installieren. Dank der unterschiedlichen Benamung können beide RPM-Pakete anschließend parallel installiert sein, da es auch bei allen mitgelieferten Dateien keine Überschneidungen gibt. Die Herausforderung jedoch ist, dass "nc" z.B. aus CentOS nicht auf Anhieb auf einem SuSE Linux Enterprise Server 10 durchkompiliert sondern mit einem Symbolfehler für "g_strlcpy" abbricht. Der einfachste Weg für mich war es daher, die benötigte Funktion aus dem Sourcecode von glib2 in den Code von "nc" mittels eines Patches hinzuzufügen. Dies ist sicherlich nicht elegant, jedoch löst es das Problem:

--- nc/netcat.c                 2008-12-12 12:30:07.000000000 +0100
+++ nc/netcat.c.g_strlcpy       2008-12-12 12:30:36.000000000 +0100
@@ -113,6 +113,39 @@
 static int connect_with_timeout(int fd, const struct sockaddr *sa,
                                socklen_t salen, int ctimeout);

+gsize
+g_strlcpy (gchar       *dest,
+           const gchar *src,
+           gsize        dest_size)
+{
+  register gchar *d = dest;
+  register const gchar *s = src;
+  register gsize n = dest_size;
+
+  /* Copy as many bytes as will fit */
+  if (n != 0 && --n != 0)
+    do
+      {
+        register gchar c = *s++;
+
+        *d++ = c;
+        if (c == 0)
+          break;
+      }
+    while (--n != 0);
+
+  /* If not enough room in dest, add NUL and traverse rest of src */
+  if (n == 0)
+    {
+      if (dest_size != 0)
+        *d = 0;
+      while (*s++)
+        ;
+    }
+
+  return s - src - 1;  /* count does not include NUL */
+}
+
 int
 main(int argc, char *argv[])
 {

Zur Erleichterung habe ich das nc-Paket als Source RPM von CentOS 5.2 heruntergeladen, mit dem Patch versehen und stelle es Ihnen ebenfalls wieder als Source RPM auf meinem FTP-Server zur Verfügung. Als Benutzer eines SuSE Linux Enterprise Server müssen Sie lediglich die Pakete gcc, pkgconfig und glib2-devel inklusive der benötigten Abhängigkeiten installiert und das mit dem von mir mit einem Patch versehene nc-Paket als Source RPM heruntergeladen haben. Das Kompilieren ist denkbar einfach:

tux:~ # rpmbuild --rebuild nc-1.84-10.src.rpm
[...]
tux:~ # 

Danach wird das beim Kompilieren entstandene binäre RPM-Paket lediglich noch installiert.

tux:~ # rpm -Uvh /usr/src/packages/RPMS/x86_64/nc-1.84-10.x86_64.rpm
Vorbereiten...              ########################################### [100%]
   1:nc                     ########################################### [100%]
tux:~ # 

Absofort kann mit den Werkzeugen des Virtual Machine Manager unter Red Hat Enterprise Linux, CentOS und Fedora problemlos auf einen libvirtd unter dem SuSE Linux Enterprise Server 10 mit Service Pack 2 oder neuer zugegriffen werden, ohne dass es Probleme oder Fehlermeldungen geben sollte. Service Pack 2 oder neuer ist beim SuSE Linux Enterprise Server 10 jedoch unumgänglich, da Service Pack 1 zwar ein libvirt-Paket mitliefert, jedoch handelt es sich hierbei um eine ältere Version ohne den libvirtd, also ohne den Daemon.