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:
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 |
---|---|
| Konfiguration der virtuellen CPU-Topologie. In diesem Beispiel ein CPU-Socket mit zwei Kernen und einem Thread pro Kern. |
| Der virtuellen Maschine zur Verfügung stehende Arbeitsspeicher. In diesem Beispiel 2 GB. |
| 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. |
| 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). |
| Ein emuliertes Bootrom am LPC-Bus. Als ROM wird die UEFI-Firmware in der Datei |
| Eine serielle Schnittstelle am LPC-Bus deren Ein- und Ausgaben auf die Standard Input- und Output-Streams von bhyve umgeleitet werden. |
| Legt bhyve ACPI-Tabellen für die virtuelle Maschine an. |
| Gibt den virtuellen CPU-Thread frei, wenn eine HLT-Anweisung erkannt wird. Andernfalls werden die virtuellen CPUs 100 % der Host-CPUs nutzen. |
| 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