Tutorial: Nested Virtualization mit VMware ESXi ohne vCenter

Vorwort
Willkommen zurück auf Katas Techblog, dieses Mal geht es um ein Thema das nicht an die User da draußen gerichtet ist, sondern an all jene die sich eine virtualisierte Serverlandschaft zulegen wollen oder zugelegt haben.
Das Thema "Nested Virtualization" kam bei mir im Zuge einer Entwicklungstätigkeit zum Tragen, bei der ein Android Emulator x86 Architektur in einer virtuellen Maschine emulieren soll.
Dieser Artikel kann aber auch helfen wenn Sie beispielsweise Hyper-V in einem virtuellen Windows Server nutzen wollen. Verzeiht sie mir bitte an der Stelle wenn ich die Menü-Einträge übersetzt habe.

Wozu Nested Virtualization?
Zur Veranschaulichung des Problems anbei noch eine Grafik.
Dieses Setup ist übrigends nicht völlig aus der Luft gegriffen, für meine Entwicklungsumgebung benötigte ich 2 Installationen mit Debian 8.3 und einer Android-Analyseumgebung wobei eine der Installationen meine Änderungen beinhaltet, und die zweite Installation den Ur-Zustand beinhaltet. Somit ist ein direkter Performancevergleich möglich. Man könnte Debian natürlich auf zwei physischen Rechnern installieren, in meinem Fall hab ich allerdings einen Server mit Intel Xeon Prozessor und 16GB RAM zur Verfügung, es wäre Verschwendung von Resourcen Debian direkt zu installieren. Zusätzlich müsste ich für den Vergleich entweder zwei baugleiche Server zur Verfügung haben oder die Performance-Tests nacheinander ausführen. Deshalb das nachfolgend schematische dargestellte Setup.

 
Abb. 1: Schematische Darstellung ESXi
Wie aus der Grafik ersichtlich wird ist der VMware ESXi die oberste Schicht dieser virtualisierten Landschaft. In diesem Fall muss der ESXi direkt auf dem jeweiligen Server laufen. Der ESXi setzt direkt auf der Hardware auf und ist demnach ein Typ 1 Hypervisor. Der Hypervisor bildet eine Abstraktionsschicht zwischen der tatsächlichen Hardware und den virtuellen Maschinen (Guests) und verwaltet die Resourcen auch entsprechend.

So weit so gut, aber KVM ist auch ein Hypervisor in diesem Fall Typ 2, da er auf die Treiberschicht des Betriebssystems aufbaut. Das Problem ist KVM erwartet, dass das Betriebssystem auf physischer Hardware läuft und erkennt wenn es nicht so ist. Für die arm-Architektur ist das nicht weiter schlimm, für die x86-Architektur wird vom Google-Emulator die Hardware-Beschleunigung der CPU benötigt und die ist virtualisiert nicht verfügbar.

Voraussetzung für Nested Virtualization
CPU die Intel VT-x und Intel EPT fähig ist
oder
bei AMD Prozessoren, AMD-V and AMD RVI, fähig ist.
VMware ESXi Server 6.0
VMware vSphere Client


Schritte für Nested Virtualization mit Debian
  1. Installation VMware ESXi
  2. Post-Installation
    1. Starten vSphere Client
    2. VMware ESXi Host -> Konfiguration
    3. Security Profil -> Eigenschaften
    4. Auswählen SSH Service -> Start Service
    5. Verbindung mit SSH Client zum ESXi Host
    6. echo 'vhv.allow = "TRUE"' >> /etc/vmware/config
      Dadurch wird der Parameter vhv.allow = "TRUE" am Ende der vmware-config angehängt.
      Dieser Befehl entspricht dem Setzen des Hakens "Hardware Virtualization" im vCenter.
    7. Der ESXi Host sollte nun neu gestartet werden, vielleicht reicht auch ein reload der Config
  3. Erstellung virtueller HostACHTUNG Host noch nicht starten
  4. Post-Erstellung virtueller Host
    1. Rechtsklick auf die VM -> Aus dem Inventar entfernen
    2. VMware ESXi -> Konfiguration
    3. Storage -> Rechtsklick -> Durchsuchen
    4. Ordner der VM öffnen und vmx-Datei runterladen
    5. Im Editor nachfolgende Zeilen an das Ende der vmx-Datei stellen
      vhv.enable = "TRUE"
      hypervisor.cpuid.v0 = "FALSE"
    6. Änderungen Speichern und vmx-Datei wieder in den Storage laden
      Gleichnamige Dateien werden automatisch überschrieben im ESXi
    7. Rechtsklick auf die vmx-Datei -> Zu Inventar hinzufügen
  5. Installation Debian 8.3
  6. Post-Installation Debian 8.3
    1. sudo cat /sys/module/kvm_intel/parameters/nested (Für Intel)
      sudo cat /sys/module/kvm_amd/parameters/nested (Für AMD)
      Wenn der Output Y oder yes ist, ist die Installation geglückt.
      Wenn nicht weiter mit Schritt 2.
    2. sudo vi /etc/default/grub
      Hinzufügen des folgenden Parameters zu GRUB_CMDLINE_LINUX
      "kvm-intel.nested=1" (Für Intel)
      "kvm-amd.nested=1" (Für AMD)
      Änderungen speichern
    3. sudo grub-mkconfig -o /boot/grub/grub.cfg
      Erstellt die Grub-Config neu.
    4. sudo update-grub
      Lädt die neue Grub-Config
    5. Neustart der Gast-VM
    6. Wiederholen von Schritt 1
      Wenn Y, Installation ist geglückt.
      Wenn N, ist die CPU wahrscheinlich zu alt oder unterstützt Virtualisierung nicht.
Ich hoffe die Schritt für Schritt Anleitung war hilfreich, in diesem Sinne wünsch ich noch fröhliches konfigurieren.

An dieser Stelle möchte ich mich noch bei William Lam von virtuallyGhetto für seine Beschreibung von Nested Virtualization mit vCenter und den Vorraussetzungen bedanken. Mein Dank gilt aber auch den Autoren des Fedora-Wikis die den verwendeten Boot-Parameter beschrieben haben.

Kommentare

Beliebte Posts aus diesem Blog

Vergleich: Logitech G910 Orion Spectrum vs. Logitech G910 Orion Spark

Phishing - Wie erkenne ich es?

Review: Steam Link - Die Streaming Box für Gamer?