Virtuelle Maschinen starten und verwalten

Virtuelle Maschinen werden mit den Programmen bhyve und bhyvectl gestartet und verwaltet. Bevor eine virtuelle Maschine mit bhyve gestartet werden kann, muss das Kernelmodul vmm.ko geladen werden:

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"

Wenn das Kernelmodul geladen ist, 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 von lokalen Dateien festgelegt werden kann. Der letzte Parameter <vm_instance> des Aufrufs legt den Instanznamen der virtuellen Maschine fest.

VM-Instanz mit einfacher Basiskonfiguration starten

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

Vereinfacht dargestellt sieht die Basiskonfiguration der VM-Instanz wie folgt aus:

Virtuelle Maschinen starten und verwalten 1:
Basiskonfiguration einer VM-Instanz.

Sobald der Bhyve-Prozess mit den Parametern gestartet wird, steht die virtuelle Maschine mit dem Instanznamen samplevm zur Verfügung. Bhyve startet die als bootrom hinterlegte UEFI-Firmware. Anschließend wird die UEFI-Shell über die virtuelle Schnittstelle com1 ausgegeben und durch den Parameter stdio an die Standard-Streams des TwinCAT/BSD-Hosts umgeleitet, sodass die UEFI-Shell auf der Kommandozeile angezeigt wird:

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 wird dann mit dem Rückgabewert 1 beendet. 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 kann mit bhyve -h abgerufen werden. Detaillierte Beschreibungen der Parameter finden sich im Handbuch zu bhyve. Alternativ kann das Handbuch über die Kommandozeile mit dem Befehl man bhyve aufgerufen werden.

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

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 aufgelistet. Entsprechend können laufende virtuelle Maschinen mit ps(1) aufgelistet werden:

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 jeweiligen 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 wurde, kann dessen Rückgabewert (Exit-Code) durch die Shell-Variable $? abgefragt werden:

echo $?

Rückgabewerte größer 1 zeigen an, dass die virtuelle Maschine nicht ordnungsgemäß heruntergefahren werden konnte. Wenn die virtuelle Maschine neu gestartet werden soll oder die Konfiguration einer VM-Instanz zwischen den Aufrufen von bhyve geändert wurde, muss die VM-Instanz zunächst mit bhyvectl entfernt werden:

doas bhyvectl --vm=samplevm --destroy

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

ls /dev/vmm
samplevm