Emulation, Paravirtualisierung, Betriebssystem-Virtualisierung: Virtualisierung hat viele Facetten
Durch Serverkonsolidierung kann eine Organisation die Anzahl der
genutzten physikalischen Server senken, indem ihre Anwendungen in
virtuelle Umgebungen verschoben werden. Dabei bleibt die Anzahl der
Betriebssystem-Umgebungen gleich. Dies spart Hardwarekosten, Platz für
Server-Racks, Strom und Verwaltungsaufwand.
Die Sicherheit kann erheblich verbessert werden, wenn jeder
Netzwerkdienst (beispielsweise Webserver, Mailserver etc.) in eine separate
virtuelle Umgebung verschoben wird. Wenn eine der Applikationen eine
Sicherheitslücke aufweist, sind die anderen nicht betroffen.
Zusätzliche Vorteile bieten die Fähigkeiten der dynamischen
Ressourcenverwaltung und die Live-Migration von Applikationen.
Entwickler und Tester benötigen normalerweise Zugriff auf eine
Handvoll Linux-Distributionen und sie müssen diese oft neu
installieren. Dank Virtualisierung können Entwickler zahlreiche
Distributionen bei nativer Performanz betreiben, indem sie einen
einzelnen Server nutzen und nicht neu booten müssen. Eine neue
virtuelle Umgebung kann in nur einer Minute erstellt werden. Das Klonen
von virtuellen Umgebungen ist ebenfalls einfach.
Auch im Bereich von Lehre und Ausbildung kann Virtualisierung
hilfreich sein. So könnte jeder Student Zugriff auf eine eigene
virtuelle Umgebung erhalten, in der er mit unterschiedlichen
Linux-Distributionen experimentieren kann.
Die bekannten Größen wie VMware, Xen, Parallels oder OpenVZ bieten ihre Lösungen teilweise kostenlos an, zum Teil oder vollständig auch als Open Source, setzen aber auf unterschiedliche Technologien. Jeder Virtualisierungstyp hat dabei Vor- und Nachteile, die sich auf seine Anwendung auswirken.
Emulation
Mit Emulation kann jedes nicht modifizierte Betriebssystem, das von dem Emulator unterstützt wird, auf der emulierten Plattform laufen. Implementierungen in dieser Kategorie reichen von reinen Emulatoren wie Bochs [1] bis hin zu Lösungen, bei denen Code auf einer echten CPU nativ ausgeführt wird oder während der Laufzeit gepatcht wird, um die Performanz zu steigern. Typische Anwender sind Entwickler, die Programme für verschiedene Hardware-Plattformen schreiben und diese auf der Maschine testen wollen, an der sie gerade arbeiten – auch wenn sie mit völlig anderer Hardware ausgestattet ist. Die größten Nachteile von Emulation sind die relativ geringe Performanz und Dichte. Ein bekannter Emulator neben Bochs ist QEmu [2].
Paravirtualisierung
Paravirtualisierung ist eine Technik, bei der mehrere modifizierte Betriebssysteme auf einer dünnen Schicht betrieben werden, die Hypervisor oder Virtual Machine Monitor genannt wird. Paravirtualisierung zeigt eine bessere Performanz als Emulation, ihr Nachteil ist jedoch, dass das „Gast“-Betriebssystem modifiziert werden muss. Beispiele für Paravirtualisierung sind Xen [3] und UML [4].
Sollen verschiedene unmodifizierte x86- oder x64-Betriebssysteme gleichzeitig eingesetzt werden (z. B. Windows und Linux), beispielsweise um die Kompatibilität von Webservern und Websites zu erhöhen oder um entsprechende Plugins auf Windows-, Linux- und Mac-Browsern zu testen, muss auch dafür nicht jeweils ein eigener PC oder Mac gekauft werden: Ein Hypervisor setzt sich als zusätzliche Schicht zwischen das installierte Betriebssystem (den Host oder das Host-Betriebssystem) und die vorhandene Hardware. Die Befehle der Gast-Betriebssysteme für den jeweils exklusiven Zugriff auf die Hardware konkurrieren untereinander und mit dem Host. Für deren Koordination sorgt der Hypervisor, der die Befehle abfängt, verarbeitet und direkt an die Hardware weiterleitet oder selbst emuliert und die Ergebnisse wieder an den Gast übermittelt. Da jeweils vollständige Betriebssysteme mit all ihren Ressourcenanforderungen geladen werden, passen in der Regel zwei bis sechs Gäste auf einen Host. Anbieter, die Paravirtualisierung nutzen, sind beispielsweise VMware [5] oder Parallels [6].
Betriebssystem-Virtualisierung
Betriebssystem-Virtualisierung ermöglicht zahlreiche isolierte Ausführungsumgebungen in einem einzelnen Betriebssystem-Kernel. Sie verfügt über die bestmögliche (fast native) Performanz und Dichte und bietet eine dynamische Ressourcenverwaltung. Allerdings kann diese Technologie, anders als Paravirtualisierung, nicht unterschiedliche Kernel von unterschiedlichen Betriebssystemen gleichzeitig ausführen. Beispiele für Betriebssystem-Virtualisierung sind FreeBSD Jail [7], Solaris Zones/Containers [8], Linux-VServer [9], OpenVZ [10] und Virtuozzo [11].
Kernpunkt der Betriebssystem-Virtualisierung ist das Konzept der virtuellen Umgebung, auch „virtual environment“ (VE), VPS, Container oder Partition genannt. Eine virtuelle Umgebung ist eine isolierte Umgebung zur Programmausführung und sieht (aus der Perspektive ihres Besitzers) wie ein unabhängiger physikalischer Server aus. Eine virtuelle Umgebung verfügt über eine eigene Menge an Prozessen, ein eigenes Dateisystem, eigene Benutzer (inkl. root), Netzwerkschnittstellen mit IP-Adressen, Routing-Tabellen, Firewall-Regeln (netfilter/iptables) und vieles mehr.
Zahlreiche virtuelle Umgebungen können nebeneinander auf einem physikalischen Server existieren. Zwar können unterschiedliche virtuelle Umgebungen unterschiedliche Linux-Distributionen ausführen, alle virtuellen Umgebungen operieren dabei aber unter dem selben Kernel.
OpenVZ
OpenVZ ist eine Open-Source-Software zur Betriebssystem-Virtualisierung, die die Basis der kommerziellen Virtualisierungssoftware Virtuozzo von SWsoft bildet. OpenVZ besitzt einen modifizierten Linux-Kernel und bietet Virtualisierung und Isolierung mehrerer Subsysteme, Ressourcenverwaltung und Checkpointing (Einfrieren des Systems).
Durch Virtualisierung und Isolierung können viele virtuelle Umgebungen innerhalb eines Kernels existieren. Das Ressourcenverwaltungs-Subsystem begrenzt Ressourcen wie CPU, RAM und Festplattenplatz für jede virtuelle Umgebung und ist in der Lage, diese Ressourcen zu garantieren. Beim sogenannten Checkpointing wird eine virtuelle Umgebung „eingefroren“ – der komplette Status wird in einer Datei auf der lokalen Festplatte gespeichert und lässt sich später wiederherstellen.
Die Ressourcenverwaltung ist bei der Betriebssystem-Virtualisierung von vorrangiger Bedeutung, da es innerhalb eines Kernels eine begrenzte Menge an Ressourcen gibt, die von zahlreichen virtuellen Umgebungen gemeinsam genutzt werden. All diese Ressourcen müssen auf eine Art und Weise verwaltet werden, durch die viele virtuelle Umgebungen auf einem System nebeneinander existieren können und sich nicht beeinträchtigen.
Das Subsystem zur Ressourcenverwaltung von OpenVZ besteht aus drei Komponenten:
- Zwei-Ebenen-Festplattenquota: Der Administrator eines OpenVZ-Servers kann Festplattenquotas für den Festplattenplatz und die Anzahl an Inodes für jede virtuelle Umgebung festlegen (erste Ebene). Auf der zweiten Ebene des Festplattenquotas kann der Administrator einer virtuellen Umgebung („VE root“) Standardwerkzeuge für ein Unix-Quota nutzen und Festplattenquotas pro Benutzer und pro Gruppe festlegen.
- „Fairer“ CPU-Planer: Auch der CPU-Planer von OpenVZ besteht aus zwei Ebenen. Auf der ersten Ebene entscheidet er, welche virtuelle Umgebung den Zeittakt erhält und berücksichtigt dabei die CPU-Priorität und Limit-Einstellungen der virtuellen Umgebung. Auf der zweiten Ebene entscheidet der Standard-Linuxplaner, welcher Prozess in der virtuellen Umgebung den Zeittakt erhält und nutzt dabei Standard-Prozessprioritäten.
- User Beancounters: Dies sind eine Menge an Zählern, Begrenzungen und Garantien für jede virtuelle Umgebung. Circa 20 Parameter wurden sorgfältig ausgewählt und decken alle Aspekte des Betriebs einer virtuellen Umgebung ab, so dass eine einzelne virtuelle Umgebung keine der für den ganzen Computer begrenzten Ressourcen übermäßig beanspruchen kann. Andernfalls würde eine einzelne virtuelle Umgebung die anderen virtuellen Umgebungen beeinträchtigen. Bei den aufgezeichneten und kontrollierten Ressourcen handelt es sich hauptsächlich um Speicher und In-Kernel-Objekte wie IPC-Share-Memory-Segmente, Netzwerk-Puffer etc.
Dank Checkpointing erlaubt OpenVZ die „Live“-Migration einer virtuellen Umgebung auf einen anderen physikalischen Server. Die virtuelle Umgebung wird dazu „eingefroren“, auf eine andere Maschine transferiert und kann dort wiederhergestellt werden. Da der gesamte Prozess nur wenige Sekunden benötigt, erscheint er aus der Perspektive des Kunden wie eine Verzögerung in der Verarbeitung, nicht aber wie eine Ausfallzeit, denn die bestehenden Netzwerkverbindungen werden ebenfalls migriert.
Werkzeuge
OpenVZ liefert ein vzctl-Werkzeug mit, das eine hochwertige Kommandozeilen-Oberfläche zur Verwaltung von virtuellen Umgebungen bietet. Um eine neue virtuelle Umgebung zu erstellen oder zu starten, benötigt der Administrator beispielsweise nur zwei Befehle: „vzctl create“ und „vzctl start“.
Für die Änderung zahlreicher Parameter von virtuellen Umgebungen steht der Befehl „vzctl set“ zur Verfügung. Alle Ressourcen, beispielsweise die Größe des virtuellen Speichers einer virtuellen Umgebung, können während der Laufzeit geändert werden. Dies ist bei anderen Virtualisierungstechnologien wie Emulation oder Paravirtualisierung entweder schwierig zu implementieren oder unmöglich.
Templates
Damit Administratoren eine neue virtuelle Umgebung möglichst schnell und einfach erzeugen können, nutzt OpenVZ sogenannte Templates. Dies sind fertig erstellte Images für verschiedene Betriebssysteme, mit denen eine neue virtuelle Umgebung erzeugt wird. Es beinhaltet eine Paketzusammenstellung und einen Template-Cache (das Tarball-Archiv einer Chroot-Umgebung), in der die Pakete installiert sind. Dieses Tarball wird mit „vzctl“ entpackt. Mit der Technik des Template-Cache kann eine neue virtuelle Umgebung in wenigen Sekunden erstellt werden, was schnelle Einsatzszenarien möglich macht.
Mit den vzpkg-Tools wird zudem die Erstellung des Template-Cache vereinfacht. Zurzeit werden RPM- und yum-basierte Repositorys unterstützt. Zur Erstellung eines Templates der Fedora-Core-5-Distribution muss beispielsweise eine Menge von (yum-)Repositorys mit FC5-Paketen sowie eine Reihe der zu installierenden Pakete spezifiziert werden.
Auch pre- und post-install-Skripte können zur weiteren Optimierung und Modifizierung eines Template-Cache genutzt werden. Alle oben genannten Daten (wie Repositorys, Paketlisten, Skripte und GPG-Keys) bilden die Metadaten des Templates. Mit den Metadaten eines Templates kann das vzpkgcache-Werkzeug automatisch ein Template-Cache erstellen. Es lädt die aufgelisteten Pakete in eine temporäre virtuelle Umgebung, installiert sie dort und packt das Ergebnis in einen Template-Cache. Auch für Nicht-RPM-Distributionen können Template-Caches erstellt werden, obwohl dies mehr manuellen Aufwand erfordert.
Fazit
Virtualisierung kommt heute in unzähligen Anwendungsgebieten zum Einsatz. Den Nutzern stehen dabei die unterschiedlichsten Produkte und Virtualisierungstechnologien zur Auswahl. Die Betriebssystemvirtualisierung, beispielsweise mit OpenVZ, eignet sich besonders dann, wenn mehrere identische Linux-Distributionen parallel auf einem Rechner virtualisiert werden sollen, beispielsweise in einem Rechenzentrum.
Das OpenVZ-Projekt arbeitet derzeit aktiv daran, Betriebssystemvirtualisierung in den Mainstream-Linux-Kernel einzubringen. Einige Fortschritte wurden beispielsweise mit dem Pre-Patch für den stabilen Linux-Kernel-Baum 2.6.19-rc1 bereits erzielt, der Beiträge von OpenVZ, IBM und Eric Biederman enthält. Diese Initiative wird weiter verfolgt.