Seit Sun Mitte letzten Jahres ihr Solaris-Betriebssystem unter eine freie Lizenz gestellt hat, tut sich was. Endlich erhält man Einblick in das Sun-Betriebssystemlabor und kann den Entwicklern bei der Arbeit zusehen - und sogar selbst mitmachen. Zum Ausprobieren gibt es mittlerweile neben Suns eigener Open-Solaris-Distribution Solaris Express noch die freien Schillix und Nexenta.
Für Furore sorgte das freie Sun-OS vor kurzem auf Weblogs und Mailinglisten, als der Solaris-Entwickler Adam Leventhal mit dem Solaris-Tool Dtrace die Performance des Linux-Binary »top« untersuchte. Dazu ließ er das Programm in einer unter Open Solaris emulierten Linux-Umgebung laufen, einer so genannten Branded Zone. Sun entwickelt auch diese Technologie im Rahmen der Open-Source-Initiative.
Wie bei den Solaris-Zones (siehe Artikel "Server in Potenz" in diesem Schwerpunkt) laufen emulierte Systeme unabhängig voneinander auf dem Gastsystem. Neu sind nun die Brands (englisch für Marken), die für eine Nicht-Solaris-Personality des emulierten Systems stehen. Zurzeit gibt es zwar nur eine solche Brand, doch die ist für Linux-Benutzer besonders interessant: Die LX-Brand bildet ein Linux-System mit Kernel 2.4 und der Glibc 2.3.2 nach.
Weil Linux, den Plänen von Linus Torvalds folgend, bis heute auf stabile Kernel-ABI und -API verzichtet, ist jede Linux-Emulation immer an eine bestimmte Kernelversion gebunden. Deshalb erfordert die Unterstützung des Kernels 2.6, aber auch aktueller Glibc-Versionen eine andere Brand.
Solaris, Marke Linux
Um mit dem emulierten Linux-System arbeiten zu können, muss in einer Branded Zone noch eine Distribution installiert werden. Das wirft eine Schwierigkeit auf, denn der Installer einer Linux-Distribution erwartet ja einen PC (ob emuliert oder echt) vorzufinden. Deshalb gilt es, andere Wege zur Installation zu finden, zum Beispiel spezielle Skripte.
Die bestehende Linux-Brand unterstützt zurzeit nur Red Hat Enterprise Linux 3 oder das aus freien Quellen kompilierte Gegenstück Centos. Im Brandz-Forum stehen aber Berichte über erfolgreiche Installationen anderer Distributionen. Eine Anpassung des Install-Skripts ist dabei stets erforderlich, auch die Kernel- und Glibc-Versionen müssen passen.
In den Branded Zones steckt viel Arbeit, schließlich sollen sie das komplette Zusammenspiel zwischen Glibc und Linux-Kernel emulieren. Das übernehmen im Wesentlichen ein Solaris-Kernelmodul und eine Userspace-Bibliothek. Der Open-Solaris-Kernel überprüft jeden Systemaufruf (Syscall), ob er zu einer Branded Zone gehört. Dann leitet er den Aufruf an das Brandz-Kernelmodul weiter, das wiederum den Syscall zurück an die Userspace-Emulationsbibliothek gibt (Abbildung 1).
Abbildung 1: Die Funktionsweise der Branded Zones im Überblick: Ein Kernelmodul und eine Bibliothek übernehmen die Emulation.
Übersetzungskunst
Die LX-Emulations-Library übersetzt jeden Linux-Syscall in sein Solaris-Pendant - so gut es geht. Die Entwickler unterscheiden drei Grade der Emulation: Pass-through (Durchreichen), Simple (Einfach) und Complex. Im Pass-through-Fall, etwa »close()«, existiert ein passender Solaris-Systemaufruf, bei dem eventuell noch die Umordnung von Parametern oder Fehlerwerten nötig ist.
Die Simple Emulation erfordert schon etwas aufwändigere Datenverarbeitung, etwa Typumwandlungen, das Füllen von Datenstrukturen oder Ähnliches. Der Rest bleibt beim komplexen Fall hängen, bei dem praktisch alles möglich ist. Um grobe Inkompatibilitäten zwischen Solaris und Linux auszubügeln, haben die Brandz-Entwickler sogar neue Solaris-Syscalls implementiert.
Auch beim Thread- und Prozesskonzept weichen Solaris und Linux stark voneinander ab. Während Solaris ein NxN-Modell von User- und Kernel-Threads verfolgt, ähneln Linux-Threads stark den gewohnten Prozessen, besitzen beispielsweise eigene Prozess-IDs. Die Brandz-Entwickler bilden Linux- auf Solaris-Threads ab und führen über die Thread-PIDs separat Buch, damit die Linux-Syscalls »getpid()« und »gettid()« die richtigen Ergebnisse liefern.
Schwierigkeiten bereitet außerdem das Device-Handling - oder Nicht-Handling, so beim Linux-Zugriff auf Netzwerkgeräte, der nicht über Gerätedateien läuft, sondern vor allem über Ioctls und das Proc-FS. Auch diese Funktionalität haben die Entwickler nachgebildet, sodass Netzwerk-Programme normalerweise ohne Probleme funktionieren. Eine Ausnahme ist Ping, das nach einem verschickten und empfangenen Paket hängen bleibt.