Virtuelle Maschinen starten und verwalten

Virtuelle Maschinen werden durch die Programme bhyve und bhyvectl gestartet und verwaltet. Bevor eine virtuelle Maschine mit bhyve gestartet werden kann, muss das Kernelmodul vmm.ko geladen sein:

doas kldload -n vmm.ko

Damit dieser Schritt nicht nach jedem Neustart wiederholt werden muss, kann das Kernelmodul bereits beim Systemstart von TwinCAT/BSD geladen werden, indem vmm_load="YES" in der /boot/loader.conf gesetzt wird:

doas sysrc -f /boot/loader.conf vmm_load="YES"

Ist das Kernelmodul geladen, kann eine virtuelle Maschine durch den Aufruf von bhyve gestartet werden:

bhyve [OPTIONS] <vm_instance>

Die Parameter [OPTIONS] bestimmen dabei die Konfiguration der virtuellen Maschine, über die beispielsweise die Anzahl der verwendeten virtuellen CPUs, die Größe des Arbeitsspeichers oder der Speicherort festgelegt werden kann. Der letzte Parameter <vm_instance> des Aufrufs legt den Instanz-Namen der virtuellen Maschine fest.

Starten einer VM-Instanz mit einfacher Basiskonfiguration

Eine UEFI-basierte virtuelle Maschine mit zwei virtuellen CPUs und 2 GB Arbeitsspeicher kann mit folgendem Befehl gestartet werden:

doas bhyve \
-c sockets=1,cores=2,threads=1 \
-m 2G \
-s 0,hostbridge \
-s 31,lpc \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_BHF_UEFI.fd \
-l com1,stdio \
-A -H -P \
samplevm

In diesem Beispiel wird die virtuelle Maschine mit dem Instanz-Namen samplevm gestartet. Die UEFI-Ausgabe wird in dieser Konfiguration über die Standard-Streams auf der Kommandozeile wie folgt ausgegeben:

UEFI Interactive Shell v2.2
EDK II
UEFI v2.70 (BHYVE, 0x00010000)
map: No mapping found.
Press ESC in 1 seconds to skip startup.nsh or any other key to continue.
Shell>

Durch die Eingabe von reset -s in der UEFI-Shell kann die virtuelle Maschine wieder heruntergefahren werden. Der bhyve-Prozess beendet sich dadurch mit dem Rückgabewert 1.

Um die virtuelle Maschine erneut zu starten, muss das komplette bhyve-Kommando mit den gleichen Parametern aufgerufen werden.

Erläuterung der Parameter

Die Bedeutung der einzelnen Parameter können über bhyve -h abgerufen werden. Detaillierte Beschreibungen zu den Parametern finden sich im Handbuch zu bhyve. Alternativ kann das Handbuch mit dem Befehl man bhyve über die Kommandozeile aufgerufen werden.

Im Folgenden sollen die im oberen Beispiel verwendeten Parameter kurz erläutert werden.

Parameter

Beschreibung

-c sockets=1,cores=2,
threads=1

Konfiguration der virtuellen CPU-Topologie. In diesem Beispiel ein CPU-Socket mit zwei Kernen und einem Thread pro Kern.

-m 2G

Der virtuellen Maschine zur Verfügung stehende Arbeitsspeicher. In diesem Beispiel 2 GB.

-s 0,hostbridge

Eine virtuelle Hostbridge, um die virtuelle CPU mit dem virtuellen PCI-Bus zu verbinden. Die Hostbridge sollte per Konvention stets an der PCI-Adresse -s 0:0:0 (kurz -s 0) konfiguriert werden.

-s 31,lcp

LPC/PCI-ISA-Bridge zur Anbindung von emulierten LPC-Geräten. Die LPC/PCI-ISA-Bridge sollte per Konvention stets an der PCI-Adresse -s 0:31:0 konfiguriert werden (kurz -s 31).

-l bootrom,/usr/local/share/uefi-firmware/BHYVE_BHF_UEFI.fd

Ein emuliertes Bootrom am LPC-Bus. Als ROM wird die UEFI-Firmware in der Datei /usr/local/share/uefi-firmware/BHYVE_BHF_UEFI.fd übergeben.

-l com1,stdio

Eine serielle Schnittstelle am LPC-Bus deren Ein- und Ausgaben auf die Standard Input- und Output-Streams von bhyve umgeleitet werden.

-A

Legt bhyve ACPI-Tabellen für die virtuelle Maschine an.

-H

Gibt den virtuellen CPU-Thread frei, wenn eine HLT-Anweisung erkannt wird. Andernfalls werden die virtuellen CPUs 100 % der Host-CPUs nutzen.

-P

Erzwingt die Beendigung der virtuellen Gast-CPU, wenn eine PAUSE-Anweisung erkannt wird.

Parameter beginnend mit -s dienen der Konfiguration von virtuellen PCI-Slots denen wiederum emulierte PCI-Geräte zugewiesen werden können (Beispiele siehe: Erweiterte VM-Konfiguration)

Parameter beginnend mit -l dienen der Konfiguration von emulierten LPC-Geräten hinter der LPC/PCI-ISA-Bridge.

Virtuelle Maschinen verwalten

Gestartete virtuelle Maschinen werden als bhyve-Prozesse auf dem TwinCAT/BSD-Host gelistet. Entsprechend kann ps(1) verwendet werden, um laufende virtuelle Maschinen zu listen:

ps -a | grep bhyve
7048 0 SC 0:31.06 bhyve: samplevm (bhyve)
7642 0 SC 0:01.83 bhyve: debian11 (bhyve)

Laufende virtuelle Maschinen können über den TwinCAT/BSD-Host heruntergefahren oder beendet werden, indem Signale via kill(1) an den jeweilige bhyve-Prozess gesendet werden. Über das TERM-Signal kann eine ACPI-Shutdown-Anfrage an die virtuelle Maschine gesendet werden, um das Herunterfahren der virtuellen Maschine anzustoßen:

doas kill -s TERM $(pgrep -f "bhyve: samplevm")

Reagiert die virtuelle Maschine nicht auf ACPI-Shutdown-Anfragen kann mit dem KILL-Signal der bhyve Prozess direkt beendet werden:

doas kill -s KILL $(pgrep -f "bhyve: samplevm")

Nachdem ein bhyve Prozess beendet worden ist, kann dessen Rückgabewert (Exit-Code) durch die Shell-Variable $? abgefragt werden:

echo $?

Rückgabewerte größer 1 deuten an, dass die virtuelle Maschine nicht ordentlich heruntergefahren werden konnte. Soll die virtuelle Maschine neu gestartet werden oder wird die Konfiguration einer VM-Instanz zwischen den bhyve Aufrufen geändert, muss die VM-Instanz zunächst über bhyvectl entfernt werden:

doas bhyvectl --vm=samplevm --destroy

Instanzen virtueller Maschinen werden als Gerätedateien unter /dev/vmm gelistet und können mit bhyvectl weiter verwaltet werden. Via ls -al /dev/vmm kann zudem festgestellt werden, welche virtuellen Maschinen aktuell auf dem TwinCAT/BSD-Host angelegt sind:

ls /dev/vmm
debian11 samplevm