Verschachtelte Virtualisierung für VM-Instanzen aktivieren

In diesem Dokument wird beschrieben, wie die Unterstützung für die verschachtelte Virtualisierung in Compute Engine-VM-Instanzen aktiviert wird. Außerdem werden die grundlegenden Schritte zum Starten und Konfigurieren einer verschachtelten VM behandelt.

Durch die verschachtelte Virtualisierung werden auf Compute Engine-VMs Prozessorvirtualisierungsanleitungen für Intel VT-x unterstützt. Mit der verschachtelten Virtualisierung starten Sie eine VM-Instanz wie gewohnt in Compute Engine und installieren dann einen KVM-kompatiblen Hypervisor auf der VM-Instanz, sodass Sie auf diesem Hypervisor eine weitere VM-Instanz ausführen können. Sie können die verschachtelte Virtualisierung für jede Linux-VM-Instanz verwenden, die auf einer Haswell- oder einer neueren Plattform ausgeführt wird. Weitere Einschränkungen finden Sie im Unterabschnitt mit den Einschränkungen der verschachtelte Virtualisierung.

Die verschachtelte Virtualisierung eignet sich ideal für VM-basierte Anwendungen und Arbeitslasten, bei denen die Konvertierung oder der Import Ihrer VM-Images in Compute Engine nicht möglich ist. Sie können die verschachtelte Virtualisierung z. B. verwenden, um eine Notfallwiederherstellungslösung für eine lokale Arbeitslast zu erstellen, die auf KVM-basierten virtuellen Maschinen ausgeführt wird. Dadurch wird ein nahtloses Failover auf in Compute Engine ausgeführte VMs ermöglicht, und zwar ohne den zusätzlichen Zeit- oder Orchestrierungsaufwand, den eine Konvertierung Ihrer KVM-basierten VM in ein natives Compute Engine-Image mit sich bringen würde. Eine weitere Arbeitslast, die sich gut für die verschachtelte Virtualisierung eignen könnte, ist ein Softwarevalidierungs-Framework, das neue Versionen eines Softwarepakets in zahlreichen Versionen verschiedener KVM-kompatibler Betriebssysteme testen und validieren muss. Wenn Sie verschachtelte VMs ausführen, müssen Sie keine große Bibliothek von Compute Engine-Images konvertieren und verwalten.

Hinweise

Funktionsweise der verschachtelten Virtualisierung

Compute Engine-VMs werden auf der physischen Hardware (dem Hostserver) ausgeführt, die als L0-Umgebung bezeichnet wird. Ein vorinstallierter Hypervisor auf dem Hostserver ermöglicht einem einzelnen Server, mehrere Compute Engine-VMs zu hosten, die in Compute Engine als L1- oder native VMs bezeichnet werden. Wenn Sie die verschachtelte Virtualisierung verwenden, installieren Sie einen weiteren Hypervisor auf dem L1-Gastbetriebssystem und erstellen mithilfe des L1-Hypervisors verschachtelte VMs, die als L2-VMs bezeichnet werden. L1- oder native Compute Engine-VMs, die einen Gast-Hypervisor ausführen, sowie verschachtelte VMs können auch als Host-VMs bezeichnet werden.

Schematische Darstellung einer verschachtelten Virtualisierung

Beschränkungen

  • Die verschachtelte Virtualisierung kann nur für L1-VMs aktiviert werden, die auf Haswell- oder neueren Plattformen ausgeführt werden. Wenn der Standardprozessor für eine Zone Sandy Bridge oder Ivy Bridge ist, können Sie die Mindest-CPU-Auswahl verwenden, um für eine bestimmte Instanz die Haswell- oder eine neuere Plattform auszuwählen. Auf der Seite Regionen und Zonen können Sie sich darüber informieren, welche Zonen Haswell- oder neuere Prozessoren unterstützen.
  • Die verschachtelte Virtualisierung wird nur für KVM-basierte Hypervisoren unterstützt, die auf Linux-Instanzen ausgeführt werden. Hyper-V-, ESX- und Xen-Hypervisoren werden nicht unterstützt.
  • Windows-VMs unterstützen keine verschachtelte Virtualisierung. Das heißt, auf Host-VMs muss ein Linux-Betriebssystem ausgeführt werden. Verschachtelte VMs können jedoch bestimmte Windows-Betriebssysteme ausführen (siehe unten).

Getestete KVM-Versionen

Google führt einfache Start- und Integrationstests der verschachtelten Virtualisierung mithilfe folgender Linux-Distributionen und Kernel-/KVM-Versionen auf der Compute Engine-Instanz durch:

  • Debian 9 mit Kernel-Version 4.9, worauf die folgenden verschachtelten VMs gehostet werden:
    • CentOS 6.5 mit Kernel-Version 2.6
    • Debian 9 mit Kernel-Version 4.9
    • RHEL 5.11 mit Kernel-Version 2.6
    • SLES 12 SP3 mit Kernel-Version 4.4
    • Ubuntu 16.04 LTS mit Kernel-Version 4.15
    • Windows Server 2016 Datacenter Edition
  • SLES 12 SP3 mit Kernel Version 4.4, worauf die folgenden verschachtelten VMs gehostet werden:
    • SLES 12 SP3 mit Kernel-Version 4.4
  • Ubuntu 16.04 LTS mit Kernel-Version 4.15, worauf die folgenden verschachtelten VMs gehostet werden:
    • Ubuntu 16.04 LTS mit Kernel-Version 4.15

Wenn Sie Probleme haben, verschachtelte VMs auf Distributionen und Kernel/KVM-Versionen auszuführen, die hier nicht aufgeführt sind, reproduzieren Sie das Problem mit einer der oben genannten Umgebungen als Gastbetriebssystem in der Host-Instanz der Compute Engine, bevor Sie das Problem melden.

Leistung

Selbst bei verschachtelter Virtualisierung mit Hardwareunterstützung kommt es zu einer Leistungsminderung für die verschachtelten VMs selbst und für alle Anwendungen oder Arbeitslasten, die in ihnen ausgeführt werden. Die genaue Leistungsverschlechterung für eine bestimmte Anwendung oder Arbeitslast lässt sich zwar nicht vorhersagen, aber Sie können mit einer Minderung von 10 % für CPU-gebundene Arbeitslasten und einem vermutlich noch höheren Wert für I/O-gebundene Arbeitslasten rechnen.

Verschachtelte Virtualisierung auf einer Instanz aktivieren

Es sind zwei Schritte erforderlich, damit Sie verschachtelte Virtualisierungen verwenden können:

  1. Verschachtelte Virtualisierung ist auf Projekt-, Ordner- oder Organisationsebene möglich. Dies ist die Standardeinstellung. Solange also niemand in Ihrer Organisation die verschachtelte Virtualisierung deaktiviert hat, müssen Sie nichts unternehmen, um die verschachtelte Virtualisierung zu aktivieren.

  2. Die VM-Instanzen, für die Sie die verschachtelte Virtualisierung verwenden möchten, müssen ein benutzerdefiniertes Image mit einem speziellen Lizenzschlüssel verwenden. Dies wird in den folgenden Schritten beschrieben.

Erstellen Sie zur Aktivierung der verschachtelten Virtualisierung auf einer VM-Instanz ein benutzerdefiniertes Image mit einem speziellen Lizenzschlüssel, der VMX in der L1- oder Host-VM-Instanz aktiviert. Dieses Image verwenden Sie dann mit einer Instanz, die die Einschränkungen für verschachtelte Virtualisierung erfüllt. Für den Lizenzschlüssel fallen keine zusätzlichen Kosten an.

  1. Erstellen Sie ein Laufwerk von einem öffentlichen Image oder von einem benutzerdefinierten Image mit einem Betriebssystem. Alternativ können Sie diesen Schritt überspringen und die Lizenz auf einem vorhandenen Laufwerk von einer Ihrer VM-Instanzen anwenden.

    gcloud

    Verwenden Sie das gcloud-Befehlszeilentool, um das Laufwerk vom Bootlaufwerk-Image Ihrer Wahl zu erstellen. Erstellen Sie in diesem Beispiel ein Laufwerk namens disk1 aus der Image-Familie debian-9:

    gcloud compute disks create disk1 --image-project debian-cloud --image-family debian-9 --zone us-central1-b

    API

    Erstellen Sie ein Laufwerk namens disk1 aus der Image-Familie debian-9:

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks
    
    {
     "name": "disk1",
     "sourceImage": "/projects/debian-cloud/global/images/family/debian-9"
    }

    Dabei ist [PROJECT_ID] Ihre Projekt-ID.

  2. Erstellen Sie mit dem von Ihnen erstellten Laufwerk oder mit dem einer vorhandenen Instanz ein benutzerdefiniertes Image mit dem für die Virtualisierung erforderlichen speziellen Lizenzschlüssel.

    gcloud

    Wenn Sie ein Image mit dem gcloud-Befehlszeilentool erstellen, geben Sie die folgende Lizenz-URL mit dem Flag "--licenses" an:

    https://compute.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx

    Mit dem folgenden Befehl wird zum Beispiel das Image "nested-vm-image" aus einem Beispiellaufwerk namens "disk1" erstellt:

    gcloud compute images create nested-vm-image \
      --source-disk disk1 --source-disk-zone us-central1-b \
      --licenses "https://compute.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"

    API

    In der API fügen Sie das Attribut "licenses" in die API-Anfrage ein:

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/images
    
    {
       "licenses": ["projects/vm-options/global/licenses/enable-vmx"],
       "name": "nested-vm-image",
       "sourceDisk": "zones/us-central1-b/disks/disk1"
    }

    Dabei ist [PROJECT_ID] Ihre Projekt-ID.

  3. Nach dem Erstellen eines Images mit der erforderlichen Lizenz können Sie das Quelllaufwerk löschen, wenn Sie es nicht mehr benötigen.
  4. Erstellen Sie eine VM-Instanz mit dem neuen benutzerdefinierten Image mit der Lizenz. Sie müssen die Instanz in einer Zone erstellen, die die Haswell-CPU-Plattform oder höher unterstützt. Beispiel:
    gcloud compute instances create example-nested-vm --zone us-central1-b \
                  --min-cpu-platform "Intel Haswell" \
                  --image nested-vm-image
  5. Bestätigen Sie, dass die verschachtelte Virtualisierung in der VM aktiviert ist.
    1. Stellen Sie eine Verbindung zur VM-Instanz her. Beispiel:
      gcloud compute ssh example-nested-vm
    2. Prüfen Sie, ob die verschachtelte Virtualisierung aktiviert ist, indem Sie den folgenden Befehl ausführen. Eine Antwort ungleich null bestätigt, dass die verschachtelte Virtualisierung aktiviert ist.
      grep -cw vmx /proc/cpuinfo

Verschachtelte VM starten

Sie können verschachtelte VMs auf verschiedene Arten starten. Dieser Abschnitt enthält ein Beispiel für das Starten einer verschachtelten VM mit qemu-system-x86_64 auf einer L1-VM, auf der Debian ausgeführt wird. Wenn bei der Ausführung verschachtelter VMs mit anderen Methoden als dem hier dokumentierten Prozess Probleme auftreten, reproduzieren Sie das Problem mithilfe dieses Prozesses, bevor Sie es als Fehler melden.

  1. Stellen Sie eine Verbindung zur VM-Instanz her. Beispiel:

    gcloud compute ssh example-nested-vm
    
  2. Aktualisieren Sie die VM-Instanz und installieren Sie einige erforderliche Pakete:

    sudo apt update && sudo apt install qemu-kvm -y
    
  3. Laden Sie ein Betriebssystem-Image herunter.

    wget https://people.debian.org/~aurel32/qemu/amd64/debian_squeeze_amd64_standard.qcow2
    
  4. Führen Sie screen aus.

    screen
    
  5. Wenn der Willkommensbildschirm screen angezeigt wird, drücken Sie die Eingabetaste.

  6. Starten Sie die verschachtelte VM. Melden Sie sich bei Aufforderung mit user: root, password: root an.

    sudo qemu-system-x86_64 -enable-kvm -hda debian_squeeze_amd64_standard.qcow2 -m 512 -curses
    
  7. Testen Sie, ob Ihre VM externen Zugriff hat:

    user@nested-vm:~$ wget google.com && cat index.html
  8. Wenn Sie fertig sind, beenden Sie die Bildschirmsitzung mit Ctrl+A, Ctrl+D.

Private Brücke zwischen Host und verschachtelten VMs starten

Wenn Sie Verbindungen zwischen Host und verschachtelten VMs ermöglichen möchten, können Sie eine private Brücke erstellen. Dieses Beispielverfahren ist für eine L1-VM unter Debian vorgesehen.

  1. Stellen Sie eine Verbindung zur VM-Instanz her. Beispiel:

    gcloud compute ssh example-nested-vm
    
  2. Aktualisieren Sie die VM-Instanz und installieren Sie einige erforderliche Pakete:

    sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
    
  3. Starten Sie das Standardnetzwerk, das im Paket libvirt enthalten ist:

    sudo virsh net-start default
    
  4. Prüfen Sie, ob Sie jetzt über die virbr0-Brücke verfügen:

    sudo ifconfig -a
    
     eth0      Link encap:Ethernet  HWaddr 42:01:0a:80:00:02
               inet addr:10.128.0.2  Bcast:10.128.0.2  Mask:255.255.255.255
               UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
               RX packets:14799 errors:0 dropped:0 overruns:0 frame:0
               TX packets:9294 errors:0 dropped:0 overruns:0 carrier:0
               collisions:0 txqueuelen:1000
               RX bytes:97352041 (92.8 MiB)  TX bytes:1483175 (1.4 MiB)
    
     lo        Link encap:Local Loopback
               inet addr:127.0.0.1  Mask:255.0.0.0
               inet6 addr: ::1/128 Scope:Host
               UP LOOPBACK RUNNING  MTU:65536  Metric:1
               RX packets:0 errors:0 dropped:0 overruns:0 frame:0
               TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
               collisions:0 txqueuelen:0
               RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
     virbr0    Link encap:Ethernet  HWaddr 5a:fa:7e:d2:8b:0d
               inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
               UP BROADCAST MULTICAST  MTU:1500  Metric:1
               RX packets:0 errors:0 dropped:0 overruns:0 frame:0
               TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
               collisions:0 txqueuelen:0
               RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
  5. Erstellen Sie eine tap-Schnittstelle, um von der Host-VM in die verschachtelte VM zu wechseln:

    sudo tunctl -t tap0
    sudo ifconfig tap0 up
    
  6. Verbinden Sie die Tap-Schnittstelle mit der Brücken-VM:

    sudo brctl addif virbr0 tap0
    
  7. Überprüfen Sie, ob das Brückennetzwerk richtig eingerichtet ist:

    sudo brctl show
    
    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254005085fe       yes              tap0
  8. Laden Sie ein Betriebssystem-Image herunter.

    wget https://people.debian.org/~aurel32/qemu/amd64/debian_squeeze_amd64_standard.qcow2
    
  9. Führen Sie screen aus.

    screen
    
  10. Wenn der Willkommensbildschirm screen angezeigt wird, drücken Sie die Eingabetaste.

  11. Starten Sie die verschachtelte VM:

    sudo qemu-system-x86_64 -enable-kvm -hda debian_squeeze_amd64_standard.qcow2 -m 512 -net nic -net tap,ifname=tap0,script=no -curses
    
  12. Melden Sie sich bei Aufforderung mit user: root, password: root an.

  13. Führen Sie auf der verschachtelten VM den Befehl ifconfig aus, um zu bestätigen, dass die VM im virbr0-Bereich eine Adresse aufweist, z. B. 192.168.122.89:

    user@nested-vm:~$ ifconfig
  14. Starten Sie einen Dummy-Webserver auf Port 8000:

    user@nested-vm:~$ python -m SimpleHTTPServer
  15. Beenden Sie die Bildschirmsitzung mit Ctrl+A, Ctrl+D.

  16. Testen Sie, ob Ihre Host-VM die verschachtelte VM anpingen kann:

    curl 192.168.122.89:8000
    

    Die verschachtelte VM sollte in etwa Folgendes zurückgeben:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    <title>Directory listing for /</title>
    <body>
    <h2>Directory listing for /</h2>
    <hr>
    <ol>
    <li><a href=".aptitude/">.aptitude/</a>
    <li><a href=".bashrc">.bashrc</a>
    <li><a href=".profile">.profile</a>
    </ol>
    <hr>
    </body>
    </html>
    

Verschachtelte VM für den Zugriff von außerhalb der Host-VM konfigurieren

Sie können eine Instanz mit mehreren Netzwerkschnittstellen einrichten oder eine Instanz mithilfe einer Alias-IP einrichten, sodass VMs außerhalb der Host-VM die verschachtelte VM anpingen können.

Mit dem folgenden Beispielverfahren werden die Host-VM und die verschachtelte VM so eingerichtet, dass von anderen VMs im selben Netzwerk über Alias-IPs auf die verschachtelte VM zugegriffen werden kann. Bei diesem Vorgang wird ein imaginäres Subnetz namens subnet1 verwendet, das zuvor erstellt wurde. Sie können subnet1 durch den Namen Ihres eigenen Subnetzes ersetzen oder ein neues Subnetz namens subnet1 erstellen.

Beachten Sie, dass dieses Verfahren für eine L1-VM unter Debian vorgesehen ist.

  1. Erstellen Sie eine VM mit aktivierter verschachtelter Virtualisierung. Achten Sie dabei darauf, einen Alias-IP-Bereich und Unterstützung für HTTP-/HTTPS-Traffic einzurichten. Beispiel:

    gcloud compute instances create example-nested-vm --image nested-vm-image \
        --tags http-server,https-server --can-ip-forward \
        --min-cpu-platform "Intel Haswell" \
        --network-interface subnet=subnet1,aliases=/30
    
  2. Stellen Sie eine Verbindung zur VM-Instanz her. Beispiel:

    gcloud compute ssh example-nested-vm
    
  3. Aktualisieren Sie die VM-Instanz und installieren Sie einige erforderliche Pakete:

    sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
    
  4. Starten Sie das Standardnetzwerk, das im Paket libvirt enthalten ist:

    sudo virsh net-start default
    
  5. Prüfen Sie, ob Sie jetzt über die virbr0-Brücke verfügen:

    sudo ifconfig -a
     
     eth0      Link encap:Ethernet  HWaddr 42:01:0a:80:00:02
               inet addr:10.128.0.2  Bcast:10.128.0.2  Mask:255.255.255.255
               UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
               RX packets:14799 errors:0 dropped:0 overruns:0 frame:0
               TX packets:9294 errors:0 dropped:0 overruns:0 carrier:0
               collisions:0 txqueuelen:1000
               RX bytes:97352041 (92.8 MiB)  TX bytes:1483175 (1.4 MiB)

    lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

    virbr0 Link encap:Ethernet HWaddr 5a:fa:7e:d2:8b:0d inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

  6. Erstellen Sie eine tun-Schnittstelle, um von der Host-VM in die verschachtelte VM zu wechseln:

    sudo tunctl -t tap0
    sudo ifconfig tap0 up
    
  7. Verbinden Sie die tun-Schnittstelle mit der Brücken-VM:

    sudo brctl addif virbr0 tap0
    
  8. Überprüfen Sie, ob das Brückennetzwerk richtig eingerichtet ist:

    sudo brctl show
    
    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254005085fe       yes              tap0
  9. Laden Sie ein Betriebssystem-Image herunter.

    wget https://people.debian.org/~aurel32/qemu/amd64/debian_squeeze_amd64_standard.qcow2
    
  10. Führen Sie screen aus.

    screen
    
  11. Wenn der Willkommensbildschirm screen angezeigt wird, drücken Sie die Eingabetaste.

  12. Starten Sie die verschachtelte VM:

    sudo qemu-system-x86_64 -enable-kvm -hda debian_squeeze_amd64_standard.qcow2 -m 512 -net nic -net tap,ifname=tap0,script=no -curses
    
  13. Melden Sie sich bei Aufforderung mit user: root, password: root an.

  14. Führen Sie auf der verschachtelten VM den Befehl ifconfig aus, um zu bestätigen, dass die VM im virbr0-Bereich eine Adresse aufweist, z. B. 192.168.122.89:

    user@nested-vm:~$ ifconfig
  15. Starten Sie einen Dummy-Webserver auf Port 8000:

    user@nested-vm:~$ python -m SimpleHTTPServer
  16. Beenden Sie die Bildschirmsitzung mit Ctrl+A, Ctrl+D.

  17. Testen Sie, ob Ihre Host-VM die verschachtelte VM anpingen kann:

    curl 192.168.122.89:8000
    

    Die verschachtelte VM sollte in etwa Folgendes zurückgeben:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    <title>Directory listing for /</title>
    <body>
    <h2>Directory listing for /</h2>
    <hr>
    <ol>
    <li><a href=".aptitude/">.aptitude/</a>
    <li><a href=".bashrc">.bashrc</a>
    <li><a href=".profile">.profile</a>
    </ol>
    <hr>
    </body>
    </html>
    
  18. Richten Sie auf Ihrer Host-VM iptables ein, um das Weiterleiten von Ihrer Host-VM an Ihre verschachtelte VM zu ermöglichen. Für das in dieser Anleitung verwendete L2-Gast-Image debian_squeeze_amd64_standard.qcow2 müssen zuerst die IP-Tabellen geleert werden:

    sudo iptables -F
    

    Bestimmen Sie als Nächstes die Alias-IP der VM:

    ip route show table local
    

    Die VM sollte etwas Ähnliches wie die unten angegebene Ausgabe zurückgeben. In diesem Beispiel sind dem Ethernet-Gerät eth0 der VM zwei IP-Adressen zugeordnet. Die erste, 10.128.0.2, ist die primäre IP-Adresse der VM, die von sudo ifconfig -a zurückgegeben wird. Die zweite, 10.128.0.13, ist die Alias-IP-Adresse der VM.

    local 10.128.0.2 dev eth0 proto kernel scope host src 10.128.0.2
    broadcast 10.128.0.2 dev eth0 proto kernel scope link src 10.128.0.2
    local 10.128.0.13/30 dev eth0 proto 66 scope host
    broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
    local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
    local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
    broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
    broadcast 192.168.122.0 dev virbr0 proto kernel scope link src
    192.168.122.1 linkdown
    local 192.168.122.1 dev virbr0 proto kernel scope host src 192.168.122.1
    broadcast 192.168.122.255 dev virbr0 proto kernel scope link src
    192.168.122.1 linkdown
    

    So leiten Sie Traffic von der Alias-IP-Adresse 10.128.0.13 an die verschachtelte VM unter 192.168.122.89 weiter:

    echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
    sudo iptables -t nat -A PREROUTING -d 10.128.0.13 -j DNAT --to-destination 192.168.122.89
    sudo iptables -t nat -A POSTROUTING -s 192.168.122.89 -j MASQUERADE
    sudo iptables -A INPUT -p udp -j ACCEPT
    sudo iptables -A FORWARD -p tcp -j ACCEPT
    sudo iptables -A OUTPUT -p tcp -j ACCEPT
    sudo iptables -A OUTPUT -p udp -j ACCEPT
    
  19. Als Nächstes melden Sie sich bei einer anderen VM an, die sich im selben Netzwerk wie die gehostete VM befindet, und stellen eine curl-Anfrage an die Alias-IP. Beispiel:

    user@another-vm:~$ curl 10.128.0.13:8000

    Die verschachtelte VM sollte in etwa Folgendes zurückgeben:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    <title>Directory listing for /</title>
    <body>
    <h2>Directory listing for /</h2>
    <hr>
    <ol>
    <li><a href=".aptitude/">.aptitude/</a>
    <li><a href=".bashrc">.bashrc</a>
    <li><a href=".profile">.profile</a>
    </ol>
    <hr>
    </body>
    </html>
    

Verschachtelte Virtualisierung in einer Organisation verwalten

Wenn Sie die Rolle orgPolicy.policyAdmin haben, können Sie steuern, ob Projekte und Ordner innerhalb der Organisation verschachtelte Virtualisierung verwenden können. Aktualisieren Sie dazu die Organisationsrichtlinie. Um die verschachtelte Virtualisierung zuzulassen oder zu verhindern, aktualisieren Sie die Einschränkung Verschachtelte Virtualisierung für VM deaktivieren.

Als allgemeine Best Practice sollten Sie den Wert der booleschen Einschränkung der Organisationsrichtlinie "Verschachtelte Virtualisierung für VM deaktivieren" so festlegen, dass Ihre Projekte, Ordner oder die gesamte Organisation nicht auf der Standardeinstellung basieren.

Console

  1. Rufen Sie in der Google Cloud Console die Seite "Organisationsrichtlinien" auf.
    Weiter zur Seite "Organisationsrichtlinien"

  2. Wählen Sie im Drop-down-Menü oben auf der Seite das Projekt, den Ordner oder die Organisation aus, für das bzw. die Sie die Organisationsrichtlinien bearbeiten möchten. Auf der Seite Organisationsrichtlinien wird eine Liste der verfügbaren Einschränkungen für Organisationsrichtlinien angezeigt.

  3. Wählen Sie in der Liste auf der Seite Organisationsrichtlinien die Einschränkung Verschachtelte Virtualisierung für VM deaktivieren aus. Auf der daraufhin eingeblendeten Seite Richtliniendetails werden eine Beschreibung der Einschränkung und Informationen dazu angezeigt, wie die Einschränkung derzeit angewendet wird.

  4. Klicken Sie auf Bearbeiten, um die Einschränkung anzupassen.

  5. Wählen Sie auf der Seite Bearbeiten die Option Anpassen aus.

  6. Wählen Sie unter Erzwingung eine Erzwingungsoption aus:

    • Wählen Sie An, um die Erzwingung dieser Einschränkung zu aktivieren.

    • Wählen Sie Aus, um die Erzwingung dieser Einschränkung zu deaktivieren.

  7. Klicken Sie auf Speichern.

gcloud

Verwenden Sie das gcloud-Befehlszeilentool, um den Befehl enable-enforce oder disable-enforce auszuführen. Damit verhindern Sie die verschachtelte Virtualisierung bzw. lassen sie zu.

Verschachtelte Virtualisierung zulassen

gcloud beta resource-manager org-policies disable-enforce \
    compute.disableNestedVirtualization \
    [--project=[PROJECT_ID] | --folder=[FOLDER_ID] | --organization=[ORGANIZATION_ID]]

Verschachtelte Virtualisierung verhindern

gcloud beta resource-manager org-policies enable-enforce \
    compute.disableNestedVirtualization \
    [--project=[PROJECT_ID] | --folder=[FOLDER_ID] | --organization=[ORGANIZATION_ID]]

Geben Sie wahlweise --project, --folder oder --organization an. Dabei gilt:

  • [PROJECT_ID] ist die Projekt-ID zur Aktivierung der verschachtelten Virtualisierung.
  • [FOLDER_ID] ist die Ordner-ID zur Aktivierung der verschachtelte Virtualisierung.
  • [ORGANIZATION_ID] ist die Organisations-ID zur Aktivierung der verschachtelten Virtualisierung.

API

Um die verschachtelte Virtualisierung für ein Projekt, einen Ordner oder eine Organisation zu aktivieren oder zu deaktivieren, senden Sie eine POST-Anfrage an die folgende URL:

https://cloudresourcemanager.googleapis.com/v1/[RESOURCE]/[RESOURCE_ID]:setOrgPolicy

Dabei gilt:

  • [RESOURCE] ist wahlweise projects, folders oder organizations.
  • [RESOURCE_ID] ist je nach Ressource die Projekt-ID, die Ordner-ID oder die Organisations-ID.

Geben Sie im Anfragetext Folgendes an und setzen Sie enforced auf true (verhindert die verschachtelte Virtualisierung) oder false (erlaubt die verschachtelte Virtualisierung):

{"policy":
    {"booleanPolicy":
        {
            "enforced": false
        },
        "constraint": "constraints/compute.disableNestedVirtualization"
    }
  }

Sie können festlegen, ob die verschachtelte Virtualisierung für Ihr Projekt, Ihren Ordner oder Ihre Organisation blockiert wird, wenn die Organisationsrichtlinie auf enforced eingestellt ist. Verwenden Sie beispielsweise das gcloud-Tool:

gcloud beta resource-manager org-policies describe \
    constraints/compute.disableNestedVirtualization --project=[PROJECT_ID] --effective

Dabei ist [PROJECT_ID] Ihre Projekt-ID. Wenn booleanPolicy: {} in der Antwort leer ist , ist die verschachtelte Virtualisierung zulässig. Andernfalls enthält die Antwort enforced: true. Weitere Informationen finden Sie in der Dokumentation über boolesche Bedingungen.

Fehlerbehebung

Google führt einfache Start- und Integrationstests der verschachtelten Virtualisierung mithilfe bestimmter Linux-Distributionen und Kernel-/KVM-Versionen auf der Compute Engine-Instanz durch. Bei diesen Tests wird zusätzlich ein bestimmter Prozess genutzt. Bevor Sie die Probleme als Fehler melden, reproduzieren Sie sie unter Verwendung der folgenden Elemente:

Ich kann keine neuen VMs mit verschachtelter Virtualisierung starten.

Wenn Ihr Projekt Teil einer Organisation ist, hat Ihre Organisation unter Umständen die Möglichkeit zum Erstellen von VMs mit verschachtelter Virtualisierung deaktiviert. Achten Sie darauf, dass die verschachtelte Virtualisierung zugelassen ist, bevor Sie versuchen, eine verschachtelte Virtualisierungs-VM zu starten.

Wenn ich grep -c vmx /proc/cpuinfo ausführe, wird 0 zurückgegeben und ich erhalte die Meldung, dass meine VM nicht für die Verschachtelung aktiviert ist.

  1. Prüfen Sie, ob Sie Ihre VM mit einer Haswell-Plattform oder einer neueren CPU-Plattform gestartet haben.
  2. Prüfen Sie, ob Sie die richtige Lizenz für Ihr VM-Image verwenden.

Ich kann meine verschachtelte VM nicht beenden.

Wenn Sie screen nicht vor jeder verschachtelten VM-Sitzung ausgeführt haben, können Sie die verschachtelte VM entweder herunterfahren oder den Prozess von einem anderen Terminal aus beenden. Führen Sie den Befehl poweroff in Ihrer verschachtelten VM aus, um die verschachtelte VM herunterzufahren. Sie können sich auch in einem anderen Terminal bei der Host-VM anmelden und den Prozess beenden. Führen Sie dann screen auf der Host-VM aus, bevor Sie eine neue verschachtelte VM starten.

Meine iptables-Regeln leiten den Traffic nicht an meine verschachtelte VM weiter.

  • iptables-Regeln werden von oben nach unten abgearbeitet. Achten Sie darauf, dass Ihre Regeln eine höhere Priorität als andere Regeln haben.
  • Prüfen Sie, dass Ihre Pakete nicht von Regeln abgefangen werden, die miteinander in Konflikt stehen.
  • Möglicherweise müssen Sie Ihre iptables leeren:

    1. Legen Sie als Erstes die Standardrichtlinien fest:

      sudo iptables -P INPUT ACCEPT
      sudo iptables -P FORWARD ACCEPT
      sudo iptables -P OUTPUT ACCEPT
      
    2. Leeren Sie nun alle Tabellen und Ketten und löschen Sie nicht standardmäßige Ketten:

      sudo iptables -t nat -F
      sudo iptables -t mangle -F
      sudo iptables -F
      sudo iptables -X