Einleitung

Also zuerst werden hier aber erst mal Grundlagen geschaffen. Eine saubere und nachvollziehbare Grundlage in der Netzwerkkonfiguration hilft enorm. Auch eine wirklich sehr praktische Neuerung ist VirtIO-9p. Damit lassen sich lokale Verzeichnisse des Host Systems, ähnlich mit NullFS bei den Jails, an eine VM weiterreichen, sogar unter Windows. Damit fallen unnötig komplizierte NFS Konfigurationen und Einschränkungen weg und der Bedarf an virtuellen Festplatten sinkt auf das absolute Minimum. Der Platzbedarf (z.B. einer Fotoverwaltung) kann dann dynamisch mitwachsen, ohne dass vorher eine starre Festplattengröße festgelegt werden muss. Trotzdem bleibt die Möglichkeit, z.B. für Backups, das auf die Inhalte dieser VirtIO-9p Freigaben direkt vom Host aus zugegriffen werden kann. Sehr praktisch!

Ziele

Die Vorbereitung von FreeBSD zum Betrieb von BHYVE VMs ist ein wenigen Schritten erledigt, da nur wenige Pakete benötigt werden. Wichtig: Diese Anleitung ist explizit darauf ausgelegt worden in Koexistenz mit BastilleBSD betrieben zu werden. Das bedeutet, das die Ablage der Daten und auch die Netzwerkschnittstellen so konfiguriert sind, das beide auf die gleichen Schnittstellen und Logik aufbauen.

NEU: Für ganz ungeduldige habe ich einen "Konsole only" Abschnitt. Da gibt es nur Befehle, keine Erklärungen.

Letzte Aktualisierung:

Grundbedingungen

FreeBSD

Kernel Module

Der "bhyve virtual machine monitor" wird bereits beim booten benötigt.

echo 'vmm_load="YES"' >> /boot/loader.conf
kldload vmm

ZFS

Als Basis für BHYVE wird mit zfs create work/bhyve das gewünschte Stammverzeichnis erstellt, in dem wir uns dann in weiteren Artikeln ausbreiten.

BHYVE

Installieren

BHYVE ist nach der Anpassung der Paketquelle mit pkg install -y tmux vm-bhyve bhyve-firmware grub2-bhyve qemu-tools schnell installiert.

Anpassen

Mit service vm enable startet BHYVE zwar automatisch beim booten, mit diesen Einträgen in der /etc/rc.conf wird es aber erst komplett:

sysrc vm_dir="zfs:work/bhyve" # Legt das Stammverzeichnis fest
sysrc vm_list=""               # Eine Liste der VMs, die beim booten automatisch gestartet werden sollen
sysrc vm_delay="3"             # Eine kurze Pause in Sekunden dazwischen

Damit wird dann beim ersten mal mit vm init das work/bhyve Verzeichnis vorbereitet und die benötigte Verzeichnisstruktur angelegt. Mit vm set console=tmux wird TMUX als eine etwas benutzerfreundlichere Konsolen anstelle der etwas sperrigen Vorgabe gesetzt. Ein paar Beispiel Templates für später können hiermit kopiert werden cp /usr/local/share/examples/vm-bhyve/* /work/bhyve/.templates/. Hier ist die /work/bhyve/.templates/config.sample als Dokumentation besonders interessant.

Die Verzeichnisstruktur per ls -l /work/bhyve sieht dann so aus:

drwxr-xr-x  2 root wheel 4 Oct 27 22:36 .config
drwxr-xr-x  2 root wheel 2 Oct 27 22:36 .img
drwxr-xr-x  2 root wheel 2 Oct 27 22:36 .iso
drwxr-xr-x  2 root wheel 3 Oct 27 22:36 .templates

Netzwerk

Die BHYVE Gäste und der Host, bzw. das Netzwerk wollen ja miteinander verbunden werden, sonst wird des sehr einsam. Das wird mittels einer Bridge ermöglich, die der Befehl vm als Switch bezeichnet. Anstelle mit der integrierten Funktion einen Switch zu erstellen, nutzen wir hier die bereits existierende Netzwerkkonfiguration, damit BHYVE und Bastille sich nicht stören und nicht alles unnötig kompliziert wird.

Die vorhandene Bridge publicnet0 wird also als "neuer" Switch mit vm switch create -t manual -b publicnet0 public der vm Konfiguration bekannt gegeben. Die VMs, die wir erstellen, erhalten automatisch neue Netzwerk (Tap) Schnittstellen, die an diesen publicnet0 Switch angeschlossen werden. public ist nur ein interner Name, ein Alias.

Bevor es weitergeht, ist jetzt ein guter Zeitpunkt das System mit reboot neu zu starten um zu schauen ob noch alles klappt. Damit sind die Vorbereitungen abgeschlossen und das System vorbereitet.

Konsole

sysrc cloned_interfaces="bridge0"
sysrc ifconfig_bridge0_name="publicnet0"
sysrc ifconfig_publicnet0="addm igb0 up"
service netif restart
echo 'vmm_load="YES"' >> /boot/loader.conf
kldload vmm
zfs create work/bhyve
pkg install -y tmux vm-bhyve bhyve-firmware grub2-bhyve qemu-tools
service vm enable
sysrc vm_dir="zfs:work/bhyve"
sysrc vm_list=""
sysrc vm_delay="3"
vm init
vm set console=tmux
cp /usr/local/share/examples/vm-bhyve/* /work/bhyve/.templates/
vm switch create -t manual -b publicnet0 public
reboot

Voilá