byhve - Best practice?

Columbo0815

Kaffeemann
Teammitglied
Moin,

Ziel dieses Beitrags soll es sein Erfahrungen mit bhyve zusammenzutragen. Meine Idee ist, dass ich die Erkenntnisse immer in diesem ersten Beitrag sammle (evtl. kommentiere) und aktualisiere. Anlass ist, dass ich vor der Entscheidung stehe, einen Gast neu aufzusetzen. Da bestimmte Parameter im Nachhinein nur schwierig geändert werden können, möchte ich die Maschine natürlich so aufsetzen, dass sie für meine Bedürfnisse optimal konfiguriert/aufgesetzt ist. Mir geht es im konkreten im einen Windows 11 Gast, den ich produktiv einsetze. Damit möglichst viele von den Erfahrungen aller profitieren können, macht es aber Sinn auch andere Gastsysteme zu berücksichtigen.

Um möglichst flexibel zu sein würde ich es gerne auf die Mittel beschränken, die das Basissystem mitbringt. Dinge wie libvirt oder vmbhyve sollten wir also unberücksichtigt lassen. Da wir 2024 haben setze ich einfach mal den Einsatz von zfs voraus.

Um einen Anfang zu finden, hier erstmal ein Aufruf, wie ich einen Gast starte. Die einzelnen Parameter würde ich dann "auseinandernehmen":

bhyve -S -c threads=8 -m 16G -H -w -s 0,amd_hostbridge -s 3,ahci-cd,/home/foobar/bhyve/null_dvd.iso -s 4,nvme,/dev/zvol/vm0/win10disk0 -s 7,passthru,1/0/0 -s 10,virtio-net,tap0 -s11,fbuf,tcp=0.0.0.0:5900,w=1600,h=900 -s 30,xhci,tablet -s31,lpc -lbootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd -p0:1 -p1:2 -p2:3 -p3:4 -p4:5 -p5:6 -p6:7 -p7:8 win11 &
-S: diesen Parameter benötige ich, weil ich einen USB-Kartenleser an den Gast durchreichen muss.
-c threads=8: Ich habe System mit einer CPU, welche 16 Kerne bzw. 32 Threads hat. Ob es hier sinnvoller ist "numcpus", "sockets", "cores" oder "threads" zu verwenden, weiß ich nicht. "Lizenzbedingt" würde ich vermuten, dass "numcpus" ausscheidet.
-m 16G: Der Host hat 64G, dem Gast möchte ich (da weitere Gäste laufen) 16G zuweisen.
-s 4,nvme,/dev/zvol...: Meine Tests (iirc. unter FreeBSD 14.0) mit einer jungfräulichen Windows 10-Installation haben ergeben, dass -nvme schneller als "ahci-hd" und sogar als "virtio-blk" ist. Inzwischen bezweifle ich das, da ein Test der Lesegeschwindigkeit auf nur noch ca. 600MB/sec. kommt. Als Festplattendevice habe ich keine Datei verwendet sondern ein zvol. Ob das sinnvoll ist? Keine Ahnung. Schön finde ich, dass ich so einfach snapshots von dem zvol machen und "wegsichern" kann.
-s 7,passthru...: Benötige ich, da ich einen USB-Kartenleser an den Gast durchreichen muss.
-s 10,virtio-net,tap0: virtio-net habe ich gewählt, da ich vermuten würde, dass dies schneller ist als eine Netzwerkkarte zu emulieren.
-p0...: Wie oben beschrieben pinne ich die einzelnen virtuellen Threads an einen echten Thread. Ob dies auch Nachteile hat, weiß ich nicht.

Soweit für den Anfang. Offen ist für mich bislang tpm bzw. tpm-passthru. Windows 11 benötigt grundsätzlich tpm. Mein Board hat zwar tpm 2.0 aber scheinbar wird die Hardware von FreeBSD nicht unterstützt. Wenn ich "kldload tpm" ausführe kommt "kernel: driver bug: Unable to set devclass (class: ppc devname: (unknown))". Eine Alternative wäre swtpm (aus den Ports/packages), was ich jedoch bis heute nicht verstanden und ans Laufen gebracht habe.

Gerne können Anmerkungen, Verbesserungsvorschläge gemacht werden oder Fragen gestellt werden. Auch Meinungen usw. sind willkommen.

Hoffentlich gibt es eine rege Beteiligung, von der viele profitieren. :)
 
Zuletzt bearbeitet:
vmbhyve sollten wir also unberücksichtigt lassen
Ist das ein Ausschluß? Es ist winzig, hilft aber ungemein bei den bridges IMHO. :)

Nach (OS-)Möglichkeit immer alles direkt auf virtio setzen, weil schnell und geringster overhead. Im Einzelfall kann NVME besser sein, müsste man mal schauen, ob das an einem Puffer liegt oder was gebencht wurde. Theoretisch sollte virtio-blk aber nicht langsamer sein.

Als Festplattendevice habe ich keine Datei verwendet sondern ein zvol. Ob das sinnvoll ist? Keine Ahnung. Schön finde ich, dass ich so einfach snapshots von dem zvol machen und "wegsichern" kann.
Ist sinnvoll, weil du damit für den Gast mehr Kontrolle hast (z.B. keine/weniger Kompression, recordsize und die snapshots exklusiv)

Windows 11 benötigt grundsätzlich tpm.
Wenn du es nicht benötigst, kann man es mit rufus immer noch rausrupfen. ;)

Obligatorisch noch die Treiber:

Wenn man das öfter macht und eh an der iso rumfummelt, kann es auch zeitsparender sein, sich eine iso mit allen Treibern im Voraus zu backen.
 
Ist das ein Ausschluß? Es ist winzig, hilft aber ungemein bei den bridges IMHO. :)
Meinst du mit bridges "cloned_interfaces="bridge tap0 tap1 tap2 tap3" und "ifconfig_bridge0="addm igb0 addm tap0 addm tap1 addm tap2 addm tap3" in der /etc/rc.conf? Wie macht das vmbhyve und inwiefern hilft das ungemein?
 
Die Bridges vom Script verwalten zu lassen, hat doch nur dann Sinn, wenn es um mehrere Bridges geht und die keine Host-IP haben müssen. Sonst läuft man in das Problem, dass die IP auf der Bridge statt auf dem Member liegen muss. Und will man wirklich, das ein Script die Netzwerkkonfiguration ändert?
 
Zurück
Oben