Debian Linux als Gastbetriebssystem installieren

Im folgenden Beispiel soll Debian in einer virtuellen Maschine unter TwinCAT/BSD installiert werden. Als Vorlage können die Shell-Skripte aus dem GitHub-Repository https://github.com/Beckhoff/TCBSD_Hypervisor_Samples/tree/main/vm_autostart verwendet werden.

TCBSD_Hypervisor_Sampesl/vm_autostart
├── Makefile
├── rc.d
│   └── samplevm
└── samplevm

Anforderungen an das VM-Setup:

Für die Ausführung von Debian als Gastbetriebssystem ohne grafischen Desktop soll die VM zwei virtuelle Kerne und 2GB RAM zur Verfügung stellen. Die VM soll UEFI basiert sein, um Gastbetriebssysteme zu booten. Die Debian Installation soll über ein „net installer“ ISO-CDROM Image erfolgen. Für den Internetzugriff wird die VM über ein Bridge-Netzwerk mit den Netzwerk des Hosts verbunden.
Um mit dem Debian-Installer zu interagieren, soll eine VNC-Verbindung zur VM ermöglicht werden. Die benötigten Skripte, die Dateien für das UEFI und virtuellen Datenträger (CDROM-ISO und Festplatte) sollen zudem auf einem ZFS-Dataset gespeichert werden, damit nach der Installation des Betriebssystems der Stand über ein ZFS-Snapshot gesichert und zu einem späteren Zeitpunkt wiederhergestellt werden kann.

Einen Überblick über die Konfiguration ist folgender Abbildung dargestellt:

Debian Linux als Gastbetriebssystem installieren 1:
Debian Linux sample VM

Voraussetzungen:

Gehen Sie für die Einrichtung der Konfiguration wie folgt vor:

1. Erstellen Sie ein ZFS-Datasets als Speicherort für virtuelle Maschinen Konfiguration:
zfs create -p -o mountpoint=/vms/samplevm zroot/samplevm
2. Laden und entpacken Sie die GitHub-Beispielskripte nach /vms/samplevm/scripts:
fetch -o /home/Administrator/main.zip \
https://github.com/Beckhoff/TCBSD_Hypervisor_Samples/archive/refs/heads/main.zip
unzip -d /vms/samplevm /home/Administrator/main.zip
mv /vms/samplevm/TCBSD_Hypervisor_Samples-main/vm_autostart /vms/samplevm/scripts
rm -rf /vms/samplevm/TCBSD_Hypervisor_Samples-main /home/Administrator/main.zip
3. Im nächsten Schritt soll der bhyve Aufruf innerhalb des /vms/sampelvm/vm_autostart/sample angepasst werden. Die Datei kann mit ee geöffnet und bearbeitet werden:
ee /vms/samplevm/scripts/samplevm
4. Suchen Sie den bhyve Aufruf und passen Sie die Parameter wie folgt an:
bhyve \
-c sockets=1,cores=2,threads=1 \
-m 2G \
-l bootrom,/vms/samplevm/UEFI.fd,/vms/samplevm/EFI_VARS.fd,fwcfg=qemu \
-s 0,hostbridge \
-s 2,fbuf,rfb=0.0.0.0:5900,w=1280,h=1024 \
-s 3,xhci,tablet \
-s 10,nvme,/vms/samplevm/disk0.img \
-s 15,ahci-cd,/vms/samplevm/debian-installer.iso,ro \
-s 20,virtio-net,tap0 \
-s 31,lpc \
-A -H -P -w \
"${vm_name}"
5. Schließen sie den Editor mit ESC und speichern Sie die Änderungen an der Datei.
6. Der angepasste bhyve Aufruf referenziert in den Programm-Parametern Dateien, die noch nicht auf dem TwinCAT/BSD Host vorhanden sind. In den nächsten Schritten werden daher die nötigen Dateien angelegt.
7. Für die Installation des Betriebssystems soll die Debian “network install” CD-ISO verwendet werden. Die ISO Datei kann mit fetch(8), wie im Kapitel Verwendung von Installationsmedien (ISO-Images) beschrieben, heruntergeladen und später als Datenträger eines ahci-hd Geräts dem bhyve Aufruf übergeben werden:
fetch -o /vms/samplevm/debian-installer.iso https://cdimage.debian.org/mirror/cdimage/archive/12.0.0/amd64/iso-cd/debian-12.0.0-amd64-netinst.iso
8. Um Debian auf einer virtuellen Festplatte installieren zu können, wird mit folgendem Kommando ein leeres Disk-Image angelegt, welches als Backend für das emulierte nvme Gerät im oberen bhyve Aufruf verwendet wird:
truncate -s 20G /vms/samplevm/disk0.img
9. Debian nutzt EFI-Variablen, um Informationen über bootfähige Datenträger abzuspeichern. Daher sollte für die virtuelle Maschine eine Kopie der Datei /usr/local/share/uefi-firmware/BHYVE_BHF_UEFI_VARS.fd als auch die UEFI-Firmware selbst in dem Verzeichnis des ZFS-Dataset abgelegt werden:
cp /usr/local/share/uefi-firmware/BHYVE_BHF_UEFI.fd /vms/samplevm/UEFI.fd
cp /usr/local/share/uefi-firmware/BHYVE_BHF_UEFI_VARS.fd /vms/samplevm/EFI_VARS.fd
10. Für die Debian-Installation benötigt die virtuelle Maschine eine Internetverbindung. Hierfür wird auf dem TwinCAT/BSD-Host entsprechend der Abbildung oben ein Bridged-Netzwerk angelegt:
ifconfig bridge create name bridge0
ifconfig tap create name tap0
ifconfig bridge0 addm tap0 addm igb0 up

sysrc cloned_interfaces+="bridge0 tap0"
sysrc ifconfig_bridge0="addm tap0 addm igb0 up"

echo "net.link.bridge.pfil_bridge=0" >> /etc/sysctl.conf
echo "net.link.bridge.pfil_member=0" >> /etc/sysctl.conf
sysctl -f /etc/sysctl.conf
11. Jetzt liegen alle Dateien auf dem TwinCAT/BSD Host bereit, die in den Programm-Parametern des oben angepassten bhyve aufrufs referenziert sind. Dementsprechend kann das samplevm Skript im Verzeichnis /vms/samplevm/scripts gestartet werden:
cd /vms/samplevm/scripts
sh -x samplevm start
12. Durch das -x Flag werden die ausgeführten Kommandos in dem Skript auf der Kommanodzeile ausgegeben. Sobald der bhyve(8) Prozess ausgeführt wird, sollte folgende Ausgabe auf der Kommandozeile erscheinen:
+ _bhyve_rc=0
+ bhyve -c 'sockets=1,cores=2,threads=1' -m 2G -l 'bootrom,/vms/samplevm/UEFI.fd,/vms/samplevm/EFI_VARS.fd,fwcfg=qemu' -s 0,hostbridge -s '2,fbuf,rfb=0.0.0.0:5900,w=1280,h=1024' -s 3,xhci,tablet -s 10,nvme,/vms/samplevm/disk0.img -s 15,ahci-cd,/vms/samplevm/debian-installer.iso,ro -s 20,virtio-net,tap0 -s 31,lpc -A -H -P -w samplevm

fbuf frame buffer base: 0x12ec16e00000 [sz 16777216]
13. Nun kann ein VNC-Client, wie beispielsweise Ultra-VNC verwendet werden, um sich mit der virtuellen Maschine zu verbinden:
Debian Linux als Gastbetriebssystem installieren 2:
14. Nach erfolgreicher Verbindung über einen VNC-Client wird das Installationsmenü angezeigt. Starten Sie die Installation von Debian:
Debian Linux als Gastbetriebssystem installieren 3:
15. Da Debian ohne Grafischen Desktop installiert werden soll, können die Optionen „Debian Dektop Environment“ und „… Gnome“ abgewählt werden. Die Option „SSH-Server“ muss angewählt werden, damit später über einen SSH-Client auf die Debian Kommandozeile zugegriffen werden kann.
Debian Linux als Gastbetriebssystem installieren 4:
16. Sobald die Installation von Debian abgeschlossen ist, wird die virtuelle Maschine neu gestartet. Dadurch bricht die VNC-Verbindung ab. Nach einem erneuten Verbindungsaufbau kann das Betriebssystem Debian in der virtuellen Maschine über VNC bedient werden.
17. Mit dem Kommando ip –-brief address kann die Netzwerkaddresse der virtuellen Maschine im Netzwerk ausgegeben werden. Über die Netzwerkaddresse kann so z.B. eine SSH Verbindung mit einem SSH-Client für den Fernzugriff auf das Debian Betriebssystem hergestellt werden.
18. Für die abschließenden Schritte sollte die VM heruntergefahren werden.
Debian Linux als Gastbetriebssystem installieren 5:
19. Wenn per SSH eine Verbindung zu der VM aufgebaut werden kann und das Betriebssystem installiert ist, kann der bhyve Aufruf angepasst werden, weil weder die VNC-Verbindung noch der Debian-Installer für die nächsten Bootvorgänge benötigt werden:
bhyve \
-c sockets=1,cores=2,threads=1 \
-m 2G \
-l bootrom,/vms/samplevm/UEFI.fd,/vms/samplevm/EFI_VARS.fd,fwcfg=qemu \
-s 0,hostbridge \
-s 10,nvme,/vms/samplevm/disk0.img \
-s 20,virtio-net,tap0 \
-s 31,lpc \
-A -H -P -w \
"${vm_name}"
20. Um den aktuellen Stand der Konfiguration zu sichern, kann mit folgendem Kommando ein ZFS Snapshot des Datasets erstellt werden. So werden die aktuellen Stände der Autostart-Skripte, als auch die Dateien für die virtuelle Festplatten und das UEFI der virtuellen Maschine gesichert und können so wieder auf den aktuellen Stand des wiederhergestellt werden:
zfs snapshot zroot/samplevm@os-installed

Über das Makefile lässt sich die VM-Konfiguration als Service registrieren. Dadurch kann das Skript im Autostart hinterlegt werden und über service(8) verwalten werden:

cd /vms/samplevm/scripts
make install
service samplevm enable
service samplevm status
service samplevm start
service samplevm status
service samplevm stop