PCI/GPU Passthrough sur Proxmox VE : OpenBSD 7.3

Page content

Cet article est le quatrième d’une série de cinq articles traitant de l’installation et de la configuration de VMs (Linux, Windows, macOS et BSD) en PCI Passthrough sur Proxmox VE 8. Je vous recommande la lecture de mon précédent article sur Installation d’OpenBSD 7.3 sous Proxmox (BIOS/UEFI), ou je reviens plus en détail sur différentes méthodes d’installation d’OpenBSD, et où je dresse un bref aperçu de la compatibilité de ce dernier avec Cloud-init.

Dans cet article, nous allons donc explorer ensemble, comment créer et déployer facilement une VM avec un bureau complet (sous Mate), en utilisant une image non-officielle d’OpenBSD adaptée à Cloud-init, tout en bénéficiant d’une bonne accélération graphique grâce au GPU Passthrough.

Création de notre template OpenBSD

Comme nous l’avons vu, il n’existe pas d’implémentation officielle de Cloud-init dans OpenBSD. Nous utiliserons donc une image non-officielle disponible ici https://bsd-cloud-image.org.

On reprend ces quelques ligne pour créer un VM initialisable avec Cloud-init :

 qm create 112 \
    --name obsd-ci \
    --agent 1,type=isa \
    --memory 4096 \
    --bios seabios \
    --boot order='scsi0' \
    --sockets 1 --cores 4 \
    --net0 virtio,bridge=vmbr0 \
    --sshkey /root/.ssh/id_rsa.pub \
    --ide0 local-lvm:cloudinit \
    --scsihw virtio-scsi-pci \
    --boot order='scsi0' \
    --serial0 socket \
    --vga serial0 \
    --usb0 046d:c08b,usb3=1 \
    --usb1 04ca:007d,usb3=1

Explications:

  • sshkey /root/.ssh/id_rsa.pub : On importe notre clé SSH, ce qui nous assurera un accès à la VM (nous verrons pourquoi cet accès est important)
  • serial0 socket & vga serial0 : ont défini l’affichage par défaut sur la sortie de la console série (configuration par défaut pour cloud-init).
  • boot order=‘scsi0’ : On définit l’ordre de boot sur l’image cloud d’OpenBSD, que nous importerons ensuite dans notre configuration.
  • ide0 local-lvm:cloudinit : Emplacement du disque Cloud-init.
  • usb0 et usb0 : correspondent aux id’s USB de mon clavier et de ma souris, que j’ai récupéré depuis l’hyperviseur avec ”lsusb”.

J’importe ensuite l’image disque:

wget -P /mnt/pve/PVE1/template/iso https://object-storage.public.mtl1.vexxhost.net/swift/v1/1dbafeefbd4f4c80864414a441e72dd2/bsd-cloud-image.org/images/openbsd/7.3/2023-04-22/ufs/openbsd-7.3-2023-04-22.qcow2
qm set 112 --scsi0 local-lvm:0,import-from=/mnt/pve/PVE1/template/iso/openbsd-7.3-2023-04-22.qcow2

je fais ensuite un resize de l’image:

qm resize 112 scsi0 +20G

Configuration Cloud-init

Il est important d’avoir plusieurs point en tête avant d’aller plus loin avec cette image:

  • Afin d’être cohérent avec Cloud-Init, sudo est activé par défaut pour l’utilisateur ‘openbsd’ (doas reste toujours disponible cependant).
  • Lors de la génération d’un nouvel utilisateur avec Cloud-init, cela ne fonctionnera que partiellement : l’utilisateur sera bien créer, mais le hash de son password (en SHA-256) ne pourra être correctement interprété par OpenBSD qui utilise un algorithme de hachage différent, depuis quelques versions déjà, à savoir bcrypt. C’est pourquoi nous nous contenterons d’utiliser l’utilisateur par défaut ‘openbsd’. En savoir plus …
  • D’autre part, si nous modifions la configuration sur le disque cloud-init et ce même après re-génération de ce dernier, OpenBSD ne mettra pas automatiquement à jours la nouvelle configuration.
  • Aussi, à l’heure actuelle, il ne semble ne pas y avoir encore de solution concernant la gestion de la sortie audio depuis l’HDMI, plus de détails sur:. C’est pourquoi je ne m’encombre pas dans ma configuration, avec des paquets supplémentaires comme pulseaudio, pavucontrol, …
  • Enfin, nous ne pourrons pas ajouter, de base, la carte graphique à notre template. En effet sans les bons drivers, la VM échouera à démarrer.

Bien, l’objectif va être maintenant de créer un fichier de configuration Cloud-init, en ayant ces éléments en tête. Quelques explications sont nécessaires :

  • Nous n’allons pas définir de nouvel utilisateur, on conservera celui par défaut openbsd.
  • On passe à la définition de la timezone et la disposition clavier en azerty
  • On ajoute les drivers AMD pour la carte graphique (elle sera ajoutée dans la configuration par la suite).
  • On installe quelques paquets utiles, le qemu-agent ainsi que l’environnement de bureau Mate.
  • On adapte le comportement de l’agent QEMU, pour le port serial ISA.
  • Comme cette image d’OpenBSD ne dispose pas de serveur d’affichage, il va nous falloir l’installer. Cependant, rapport à la méthode de conception d’OpenBSD, nous ne pouvons le faire via un simple pkg_add, nous allons donc importer l’archive xserv73 depuis les dépôts officiels d’OpenBSD.
  • On configure les derniers services et fichiers de configuration pour X11 et Mate.
cat << EOF >> /mnt/pve/PVE1/snippets/ci-obsd73-xbase-gpu.yaml
#cloud-config

runcmd:
  - ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
  - echo "keyboard.encoding=fr" >> /etc/wsconsctl.conf
  - fw_update amdgpu
  - pkg_add -U qemu-ga avahi
  - pkg_add -U mate-desktop mate-notification-daemon mate-terminal mate-panel mate-session-manager mate-icon-theme mate-control-center gnome-colors-icon-theme mate-calc caja caja-extensions pluma atril eom gnome-system-monitor mate-utils mate-media engrampa dconf-editor ghostscript-10.01.1
  - echo "pkg_scripts=qemu_ga" >> /etc/rc.conf.local
  - echo 'qemu_ga_flags="-t /var/run/qemu-ga -m isa-serial -p /dev/cua01 -f /var/run/qemu-ga/qemu-ga.pid"' >> /etc/rc.conf.local
  - /etc/rc.d/qemu_ga stop && /etc/rc.d/qemu_ga start
  - ftp -o /tmp/xserv73.tgz https://ftp.fr.openbsd.org/pub/OpenBSD/7.3/amd64/xserv73.tgz 
  - tar xzvphf /tmp/xserv73.tgz
  - rcctl enable xenodm
  - rcctl enable messagebus
  - rcctl enable avahi_daemon
  - rcctl enable multicast
  - usermod -G operator openbsd
  - echo "LANG=fr_FR.UTF-8" >> /home/openbsd/.xsession
  - echo "LC_TYPE=fr_FR.UTF-8" >> /home/openbsd/.xsession
  - echo "LC_ALL=fr_FR.UTF-8" >> /home/openbsd/.xsession
  - echo "exec ck-launch-session mate-session" >> /home/openbsd/.xsession
EOF

Pour passer la configuration à notre VM on entre la commande:

qm set 112 --cicustom "vendor=PVE1:snippets/ci-obsd73-xbase-gpu.yaml"

On démarre la VM, en laissant le processus d’initialisation ce déroulé (vous pouvez vérifier l’avancement en passant par la console noVNC de proxmox):

qm start 112

Une fois l’initialisation terminée on se connecte via SSH (avec l’utilisateur openbsd) à notre VM pour le reset de la configuration Cloud-init:

ssh openbsd@XXX.XXX.XX.XX
# une fois connecté à la VM 
rm -f /var/log/cloud-init.log && rm -Rf /var/lib/cloud/*

On éteint notre VM et avant de passer à la conversion en template, au passage, j’ajoute la carte graphique à la configuration:

qm shutdown 112
qm set 112 --hostpci0 0000:01:00,x-vga=1
qm template 112

Déploiement depuis le template

Voilà, il ne vous restera plus qu’à cloner notre template OpenBSD pour chaque nouvelle VM.

qm clone 112 113 --full 1 --name obsd-mate

Comme nous avons “reset” notre précédente configuration cloud-init, nous pourrons ajouter de nouveaux paramètres pour le clone

qm set 113 --ipconfig0 ip=192.168.2.76/24,gw=192.168.2.1 --sshkey /PATH/TO/ANOTHER/id_rsa.pub
qm start 113

Comme nous l’avons vu précédemment, l’ajout d’un utilisateur directement depuis Cloud-init reste problématique, et c’est ce pourquoi je vous recommandais de rester sur l’utilisateur par défaut ‘openbsd’. Passer simplement par SSH pour définir un nouveau password, avant de vous connecter sur la session Mate.

Ressources :