KVM nested Virtualisation

KVM ist eine Virtualisierungstechnik für Linux, die auf die von vielen modernen Prozessoren bereitgestellten Mechanismen zur Virtualisierung zurückgreifen kann. Diese Mechanismen lassen sich mit wenigen Schritten auch in einem Gastsystem nutzen.

Häufig werden virtuelle Maschinen direkt auf einem physischen Computer oder Server betrieben und können dort auf die bereits erwähnten Mechanismen zur Beschleunigung zurückgreifen. Diese Mechanismen stehen standardmäßig im Gastsystem nicht zur Verfügung. Es kommt jedoch hin und wieder vor, dass bestimmte Anwendungen oder ähnliches getestet werden müssen, die diese Mechanismen voraussetzen. Für diesen Fall haben die Entwickler des Linux-Kernels eine Möglichkeit geschaffen diese Mechanismen direkt an das Gastsystem weiterzureichen ohne, dass sie emuliert werden müssen. So bleiben die Vorteile der beschleunigten Ausführung auch im Gastsystem erhalten.

Die Mechanismen zur Virtualisierung unterschieden sich zwischen den Prozessoren der beiden großen Anbietern von x86 CPUs. Daher unterschieden sich die Schritte zur Konfiguration in einigen Punkten.

Intel CPU

Dieser Abschnitt bezieht sich auf CPUs des Herstellers Intel. Ob die verschachtelte Virtualisierung(nested Virtualisation) bereits aktiv ist, kann mit dem folgenden Befehl abgefragt werden. In diesem Beispiel bedeutet die Ausgabe des Buchstaben 'N', dass sie nicht aktiviert ist.

$ cat /sys/module/kvm_intel/parameters/nested
N

Über eine Konfigurationsdatei kann dem System mitgeteilt werden, dass es eine bestimmte Option beim Laden eines Kernel-Moduls übergeben soll. Dies kann wie in dem nachfolgenden Beispiel geschehen. Es ist auch möglich dem Kernel diese Option als Parameter beim Booten zu übergeben. Jedoch scheint die Methode mit der Konfigurationsdatei etwas leichter bei der Wartung zusein.

$ echo "options kvm_intel nested=1" | sudo tee /etc/modprobe.d/kvm-intenl-x86.conf

Anschließend muss der Computer bzw. Server neu gestartet werden. Danach sollte sich der Wert, ob die nested Virtualisation aktiv ist, verändert haben. Ist dies der Fall wird nicht 'N' sondern 'Y' zurückgegeben.

$ cat /sys/module/kvm_intel/parameters/nested
Y

Normalerweise sollten die Mechanismen für die Virtualisierung jetzt auch im Gastsystemen zur Verfügung stehen. Wer auf Nummer sicher gehen will und libvirt zur Verwaltung der virtuellen Maschinen verwendet, der kann mit dem folgenden Befehlen die Konfiguration der VM zur Bearbeitung öffnen ...

$ sudo virsh edit <name>

... und muss dort im Abschnitt mit den CPU Features folgende Zeile ergänzen.

<cpu match='exact'>
  <feature policy='require' name='vmx'/>
</cpu>

AMD CPU

Bei Prozessoren von AMD steht diese Technik auch zur Verfügung, die Konfiguration unterscheidet sich jedoch in wenigen Punkten.

Zunächst kann auch hier wie folgt der Status der verschachtelten Virtualisierung abgefragt werden. In diesem Fall steht '0' dafür, dass die Unterstützung deaktiviert ist.

$ cat /sys/module/kvm_amd/parameters/nested
0

Auch hier kann die Option über einen Kernel Parameter oder eine Konfigurationsdatei angegeben werden.

$ echo "options kvm-amd nested=1" | sudo tee /etc/modprobe.d/kvm-amd.conf

Nach dem Neustart sollte sich der Wert für die Unterstützung geändert haben. Im folgenden Beispiel steht die Ausgabe des Wertes '1' dafür, dass die nested Virtualisation jetzt aktiviert ist.

$ cat /sys/module/kvm_amd/parameters/nested
1

Zum Abschluss kann noch die Konfiguration der gewünschten VM angepasst werden.

$ sudo virsh edit <name>

Bei Prozessoren von AMD ist der Name des Features jedoch ein anderer.

<cpu match='exact'>

  <feature policy='require' name='svm'/>
</cpu>

Abschluss

Ob die Mechanismen zur Virtualisierung in dem Gastsystem zur Verfügung stehen kann mit folgendem Befehl getestet werden.

$ grep --color=auto -E '(vmx|svm)' /proc/cpuinfo
flags               : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush
mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq vmx ssse3
cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm xsaveopt
vnmi ept

Verwandte Artikel