OpenBSD i386 in libvirt QEMU/KVM lauffähig installieren

I/O der i386-Architekturvariante von OpenBSD ist in QEMU/KVM derart langsam, dass es quasi unmöglich ist, das System zu benutzen.

In diesem Artikel wird das Problem durch Deaktivieren der Kernel-Funktionen mpbios sowie acpimadt umgangen.1

Die Anleitung kann auch als Referenz für Installationen der x86_64-Variante genutzt werden. In diesem Fall kann – und sollte – auf den Workaround verzichtet werden. Das System funktioniert ohne ihn einwandfrei.

Umgebung definieren

Diese Variablen müssen in jedem Schritt des folgenden Ablaufs gesetzt sein:

VERSION=7.3
#ARCH=amd64
ARCH=i386
CDROM_PATH=/var/lib/libvirt/images/pool
v=$(echo $VERSION | tr -d .)

OpenBSD herunterladen

Geladen wird das installXX.iso Image der gewünschent Architektur.2

set -u

mkdir -p $CDROM_PATH
wget -O $CDROM_PATH/openbsd-install${v}-${ARCH}.iso \
        https://cdn.openbsd.org/pub/OpenBSD/${VERSION}/${ARCH}/install${v}.iso

Virtuelle Maschine erstellen

Hier wird virt-install anstatt der grafischen Oberfläche virt-manager verwendet um die virtuelle Maschine mit nur einem Befehl zu erstellen.

set -u

virt-install --noautoconsole \
        --install no_install=yes \
        --metadata title="openbsd - Resflash-Buildumgebung [$ARCH]" \
        --name openbsd-$ARCH \
        --os-variant=openbsd7.0 \
        --ram=2048 --vcpus=4 \
        --graphics spice,listen=0.0.0.0 \
        --disk format=raw,path=/var/lib/libvirt/images/openbsd-$ARCH.raw,size=10 \
        --cdrom $CDROM_PATH/openbsd-install${v}-${ARCH}.iso \
        --network bridge=br0

OpenBSD in auf serielle Konsole umschalten

Um auf die Nutzung der grafischen libvirt-Verwaltungsoberfläche virt-manager auch für diesen Schritt zu verzichten, könnte eine eigene OpenBSD-ISO Datei mit bereits aktivierter serieller Konsole erstellt werden3.

Einfacher ist es allerdings, die Eingabe von set tty com0 direkt als Tastensequenz an die boot> Aufforderung der VM zu senden um so das System auf die serielle Konsole umzuschalten:

Maschine auf serielle Konsole umschalten

set -u

s='0x1f\n'
e='0x12\n'
t='0x14\n'
SPACE='0x39\n'
c='0x2e\n'
o='0x18\n'
m='0x32\n'
ZERO='0x0b\n'
y='0x15\n'

( virsh reset openbsd-$ARCH && sleep 3s
printf "%b" "$s$e$t${SPACE}$t$t$y${SPACE}$c$o$m$ZERO" | while read keysym ; do virsh send-key openbsd-$ARCH --codeset xt $keysym ; sleep .1 ; done
virsh send-key openbsd-$ARCH KEY_ENTER )

Verbindung zu serieller Konsole herstellen

Nun kann per Kommandozeile mittels virsh eine Verbindung hergestellt werden:

set -u
virsh console openbsd-$ARCH

In dieser Konsole erhöht man die Baudrate der Verbindung:

stty com0 115200

Verwendet man eine andere Architektur als i386 kann das Standard-System bereits mittels Befehl bsd.rd gestartet werden

[Nur i386] Problematische Kernel-Funktionen vorübergehend deaktivieren

Innerhalb der selben Konsole schaltet man nun die entsprechenden Funktionen für den aktuellen Bootvorgang ab:

boot -c
disable mpbios
disable acpimadt
quit

OpenBSD installieren

Direkt nachdem man an dieser Stelle die Installation von OpenBSD entsprechend der eigenen Anforderungen konfiguriert und installiert hat (Befehl (I)nstall), wechselt man zurück in die Kommandozeile (Befehl (S)hell) um anstelle eines direkten Neustarts mit den weiteren Schritten dieser Anleitung fortzufahren.

[Nur i386] Problematische Kernel-Funktionen dauerhaft deaktivieren

Nach wie vor innerhalb der OpenBSD Konsole schaltet man nun die entsprechenden Funktionen im Kernel dauerhaft ab:

echo 'disable mpbios\ndisable acpimadt' >> /mnt/etc/bsd.re-config
chroot /mnt sh -c 'cat /etc/bsd.re-config | config -e -o /bsd.new -c /dev/stdin /bsd'
mv /mnt/bsd /mnt/bsd.old && mv /mnt/bsd.new /mnt/bsd

Manpages: config, bsd.re-config

Virtuelle CD-ROM auswerfen und VM neu starten

Letztendlich wirft man über das Hostsystem die virtuelle CD-ROM aus und startet das neu installierte OpenBSD-System:

set -u
mediapath=$(virsh domblklist openbsd-$ARCH | grep -F "$CDROM_PATH" | awk '{ print $1 }')
virsh change-media openbsd-$ARCH $CDROM_PATH/openbsd-install${v}-${ARCH}.iso $mediapath --eject
virsh reboot openbsd-$ARCH

1 https://misc.openbsd.narkive.com/lr1CB95G/very-slow-i-o-under-openbsd-i386-on-qemu-kvm-from-rhel7rc

2 https://www.openbsd.org/faq/faq4.html#Download

3 http://www.weirdnet.nl/openbsd/serial/