Vorlesung
Inhalt der Vorlesung
Es gibt virtuelle Maschinen schon seit Jahrzehnten. Doch jetzt kommen sie mehr und mehr in Mode. Alles wird „virtuell“. Doch wer weiß, wie sie funktionieren? Wie schafft man es, auf einem Rechner einen anderen so schnell zu simulieren, dass man mit der virtuellen Maschine sinnvoll etwas arbeiten kann? Die Vorlesung wird einen Einblick in die wichtigsten Virtualisierungstechniken geben. Am Beispiel vieler neuer Open-Source-Projekte werden die Techniken erläutert und in den Übungen ausprobiert.Das Bochs-Projekt emuliert einen kompletten PC, auf dem sich heutige Standard-Betriebssysteme installieren lassen. Zwar ist die Emulation relativ langsam, läuft aber stabil und der virtuelle PC ist vom Verhalten her sehr ähnlich zu echter Hardware. In der Vorlesung wird gezeigt, wie eine derartige Emulation durchgeführt werden kann.
Um die Emulation zu beschleunigen, kann man versuchen, häufig auszuführende Instruktion einmal zu dekodieren und sie zu compilieren. Beim Compilieren sind Optimierungen möglich. QEMU und FAUmachine (Projekt des Lehrstuhl 4) nutzen diese Just-In-Time-Compilierung und erziehlen damit eine gute Performance. Welche Möglichkeiten derartige Just-In-Time-Compiler bieten, wie man sie im Bereich der virtuellen Maschinen einsetzt und wo die Probleme liegen, wird in der Vorlesung erklärt. Moderne Prozessoren von Intel und AMD bieten die Möglichkeit, sich selbst „nachzumachen“. Die Virtualisierungserweiterungen erlauben es, virtuelle Maschinen mit sehr hoher Performance zu entwickeln. Das Projekt KVM nutzt die Erweiterungen und bietet damit einen PC, mit dem man sehr gut z.B. Windows unter Linux laufen lassen kann. Die Prozessor-Erweiterungen und die Möglichkeiten, die sich daraus für virtuelle Maschinen ergeben, werden in der Vorlesung vorgestellt.
Mit Java und der dazugehörigen Java-Virtual-Machine ist man einen anderen Weg gegangen. Hier wurde nicht versucht, eine bestehende Hardware-Architektur mit ihrer Instruktionssatzarchitektur nachzuahmen. Statt dessen wurde eine „Hardware“ definiert, die sich besser emulieren lässt. Herausgekommen ist eine Instruktionssatzarchitektur, die sehr einfach aufgebaut ist, sich leicht Just-In-Time compilieren und sehr schnell ausführen lässt. Die Vorlesung zeichnet die Überlegungen nach, die zur speziellen Java-Virtual-Machine-Instruktionssatzarchitektur geführt haben.
Ein völlig anderer Ansatz zu einer virtuellen Maschine zu kommen wurde mit dem UMLinux-Projekt begangen. Statt auf einer nachgeahmten echten Hardware Linux laufen zulassen, hat man statt dessen Linux auf eine neue „Hardware“ portiert. Als „Hardware“ wurde wiederum Linux gewählt. Da hier die im Allgemeinen aufwändige Emulation fehlt, ist die Performance dieses Ansatzes sehr hoch. Welche Möglichkeiten Linux bietet, Hardware nachzuahmen, wird in der Vorlesung erklärt. Dieses Wissen lässt sich auch in eigenen Projekten häufig gut einsetzen. Portiert man z.B. Linux nach dem UMLinux-Verfahren auf eine neue „Hardware“, merkt man recht schnell, dass man vom genutzten Gastgeber-Betriebssystem nur sehr wenige System-Calls braucht. Auf der anderen Seite könnte man andere, spezialisierte System-Calls brauchen, um noch mehr Performance zu erreichen. Dieser Weg wurde von dem Xen-Projekt beschritten. Das Gastgeber-Betriebssystem wurde von überflüssigen System-Calls befreit und mit für Simulationszwecke sinnvollen System-Calls ergänzt. In der Vorlesung werden die notwendigen System-Calls herausgearbeitet. Damit wird gleichzeitig klar, wie schnell eine Emulation nach der Xen-Methode in etwa sein wird, wo ihre Stärken und Schwächen liegen.
Schaut man sich die Rechner von Web-Hostern an, stellt man fest, dass die überwiegende Mehrzahl der zur Verfügung gestellten Rechner sehr ähnlich sind. Auf den meisten läuft ein Linux-Betriebssystem mit den entsprechenden Utilities sowie ein Apache-Webserver. Hat der Web-Hoster 1000 Kunden, so hat er auf seinen Servern 1000-mal die (fast) gleiche Installation. Das VServer-Projekt versucht, all dieses Server auf virtuelle Maschinen zu legen. Um unnötige Mehrfach-Kopien zu vermeiden, läuft auf allen virtuellen Maschinen der gleiche Linux-Kern, die gleichen Utilities und das gleiche Binary für den Webserver. Dieses Verfahren hat große Vorteile aber auch gravierende Nachteile, die ein Web-Hoster und seine Kunden wissen sollten. Nach dem Besuch der Vorlesung sollten alle Studenten diese kennen.
Eine der häufigsten Anwendungen für virtuelle Maschinen ist das Laufenlassen von Windows-Applikationen auf einem Linux-Rechner. Dazu ist es jedoch u.U. nicht notwendig eine komplette virtuelle Maschinen mit Windows-Betriebssystem aufzusetzen. Z.B. das Wine-Projekt bietet hier eine andere Lösung. Statt eines gesamten Rechners wird hier „nur“ die Laufzeitumgebung einer Applikation nachgemacht. Auch dieses Verfahren wird in der Vorlesung eingehend untersucht.