Installation d'OpenBSD 7.3 sous Proxmox (BIOS/UEFI)

Page content

On fait une petite pause dans notre série “GPU/PCI Passthrough sur Proxmox”, je dois dire que le quatrième article sur OpenBSD m’a donné du fil à retordre. Alors je me suis dit que c’était l’occasion de faire le point sur les différentes méthodes d’installation d’OpenBSD sur notre hyperviseur favori. On va envisager différent cas de figures en fonction des types de BIOS disponibles sous Proxmox (OVMF, SEABIOS); des différentes images d’installation d’OpenBSD; et, pour finir, nous parlerons de l’épineux sujet de la compatibilité d’OpenBSD avec Cloud-init.

Mise au point sur les différentes images d’installations

OpenBSD propose de nombreuses images, il n’est pas forcément évident de-ci retrouver. L’idée n’est pas tant de faire un descriptif exhaustif de toutes les images d’installation, que de précisé quelques points sur les images les plus adaptées en fonction des cas d’usages pour une installation.

Commençons donc, dans le set d’images proposées par OpenBSD, je retiendrais les suivantes :

  • install73.img L’image d’installation la plus complète, contenant l’essentiel des paquets pour installer le système, compatible BIOS/UEFI.

  • install73.iso Une image plus adaptée au format CD contient également l’essentiel des paquets pour installer le système, cependant cette image n’est pas compatible avec une installation en UEFI.

  • cd73.iso et miniroot73.img Sont les versions allégées des images précitées (par analogie on pourrait les comparer à une image “Netinstall” chez Debian).

L’ensemble de ces images supportes les principales architectures (amd64, arm64, i386), exception faite de l’architecture arm64 pour les images ISO.

Installation (BIOS/UEFI)

Import des images OpenBSD

Je vais utiliser install73.iso pour l’installation en mode BIOS et install73.img pour l’installation en mode UEFI. Vous pouvez tout à fait utiliser install73.img pour les deux types d’installation, mais dans le cadre de cet article je voulais présenter le plus large panel de méthode d’installation (avec leurs subtilités pour certaines).

wget -P /mnt/pve/PVE1/template/iso/ https://ftp.openbsd.org/pub/OpenBSD/7.3/amd64/install73.img https://ftp.openbsd.org/pub/OpenBSD/7.3/amd64/install73.iso

Création des VM

BIOS

 qm create 109 \
    --name obsd-bios \
    --agent 1,type=isa \
    --memory 2192 \
    --bios seabios \
    --sockets 1 --cores 2 \
    --cpu kvm64 \
    --net0 virtio,bridge=vmbr0 \
    --scsihw virtio-scsi-single \
    --boot order='ide0;scsi0' \
    --scsi0 local-lvm:35 \
    --ide0 PVE1:iso/install73.iso,media=cdrom

Explications :

  • agent 1,type=isa Configuration particulière de l’agent QEMU, via le port série ISA.
  • bios seabios (machine i440fx) La configuration par défaut des hôtes QEMU.
  • boot order=‘ide0;scsi0’ On définit un odre de boot classique (le support d’installation en premier).
  • ide0 PVE1:iso/install73.iso,media=cdrom l’Emplacement du disque d’installation.

UEFI

 qm create 110 \
    --name obsd-uefi \
    --agent 1,type=isa \
    --memory 2192 \
    --bios ovmf \
    --machine q35 \
    --sockets 1 --cores 2 \
    --cpu kvm64 \
    --net0 virtio,bridge=vmbr0 \
    --scsihw virtio-scsi-single \
    --boot order='scsi0;ide0' \
    --efidisk0 local-lvm:0 \
    --scsi0 local-lvm:35

Explications :

  • bios ovmf et machine q35 Le firmware alternatif à Seabios, conviendra mieux notamment si, vous souhaitez utiliser des périphériques en PCIe.
  • boot order=‘scsi0;ide0’ Pour l’ordre de boot on place le disque d’installation en seconde position.
  • efidisk0 local-lvm:0 la nécessaire partition EFI, pour tout type d’installation en UEFI.

Aussi il nous faudra faire l’import de l’image d’installation au format RAW, que nous placerons en ide0.

qm set 110 --ide0 local-lvm:0,import-from=/mnt/pve/PVE1/template/iso/install73.img

Processus d’installation

Paramètres communs BIOS/UEFI

lancement de l’installateur

Welcome to the OpenBSD/amd64 7.3 installation program.
(I)nstall, (U)pgrade, (A)utoinstall or (S)hell? I

choose your keyboard layout (’?’ or ’L’ for list) [default] fr
System hostname? (short form, e.g. *foo’) openbsd

Configuration réseau

Available network interfaces are: vio0 vlan0.
Network interface to configure? (name, lladdr, ’?’, or ’done’) [vio0] 
IPv4 address for vioO? (or ’autoconf’ or ’none’) [autoconf]
IPv6 address for vioO? (Cor ’autoconf’ or ’none’) [none]
Network interface to configure? (name, lladdr, ’?’, or ’done’) [done] 

Définition du compte ROOT

Password for root account? (will not echo) 
Password for root account? (again)

Activation des services de base (xorg/sshd/xenodm)

Start sshd(8) by default? [yes]
Do you expect to run the X Window System? [yes]
Do you want the X Window System to be started by xenodm(1)? [no]
Change the default console to com0? [no] 

Définition d’un utilisateur

Setup a user? (enter a lower-case loginname, or ’no’) [no] openbsd
Full name for user openbsd? [openbsd] openbsd
Password for user openbsd? (will not echo)
Password for user openbsd? (again)

Configuration de sécurité pour SSH

Allow root ssh login? (yes, no, prohibit-password) [no]

Timezone

What timezone are you in? (’?’ for list) [Europe/Paris]

Partitionnement et installation du système de base en mode BIOS

On commence par définir le disque de destination pour l’installation sd0, si vous avez un doute sur quel disque sélection vous pouvez les lister avec '?', ensuite la méthode de partitionnement du disque (MBR). Enfin, on sélectionne la proposition de partionnement automatique [a].

Available disks are: sdO. Encrypt the root disk? (disk, ‘no’ or ’?’ for details) [no]
Which disk is the root disk? (’?’ for details) [sd0] 
Use (W)hole disk MBR, whole disk (G)PT or (E)dit? [whole] 
Setting OpenBSD MBR partition to whole sdO...done. The auto-allocated layout for sdO is:
# size offset fstype [fsize bsize cpg] 
a: 1.0G 512 4.2B5SD 2048 16384 1 # / 
b: 2.5G 2097664 Swap 
c: 35 .0G O unused 
d: 2.1G 7352384 4.2BSD 2048 16384 1 # /tmp 
e: 3.2G 11670784 4.2B5D 2048 16384 1 # /var
f: 3.9G 18452736 4.2B5D 2048 16384 1 # /usr 
g: 1.0G 26615584 4.2BSD 2048 16384 1 # /usr/X11R6 
h: 4.6G 28712736 4.2BSD 2048 16384 1 # /usr/local 
i: 2.0G 38446176 4.2BSD 2048 16384 1 # /usr/src 
j: 6.0G 42536320 4.2BSD 2048 16384 1 # /usr/obj 
k: 6.7G 55058400 4.2BSD 2048 16384 1 # /home
Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout? [a]

Pour installer le système, nous devrons indiquer ou sont stockés les packages de base, dans cd0 en l’occurrence, ce qui correspont à nôtre ide0 PVE1:iso/install73.iso, enfin ont bypass la vérification SHAZ56.sig pour installer l’ensemble.

Let’s install the sets? 
Location of sets? (cd0 disk http nfs or ’done’) [cd0] 
Pathname to the sets? (Cor ’done’) [7.3/amd64]

Select sets by entering a set name, a file name pattern or ‘all’. De-select
sets by prepending a ’-’, e.g.: *-gamex’. Selected sets are labelled ’[X]’. 
[X] bsd [X] base73.tgz [X] game73.tgz [X] xfont73.tgz 
[X] bsd.mp [X] comp73.tgz [X] xbase73.tgz [X] xserv73.tgz 
[X] bsd.rd [X] man73.tgz [X] xshare73.tgz
Set name(s)? (Cor ’abort’ or ’done’) [done]
Directory does not contain SHAZ56.sig. Continue without verification? [no] yes 
Location of sets? (cdO disk http nfs or ’done’) [done] 
CONGRATULATIONS! Your OpenBSD install has been successfully completedt
When you login to your new system the first time, please read your mail using the ’mail’ command.
Exit to (S)hell, (H)alt or (R)eboot? [reboot]

Partitionnement et installation du système de base en mode UEFI

On commence par définir le disque de destination pour l’installation sd0, si vous avez un doute sur quel disque sélection vous pouvez les lister avec '?', ensuite ont sélectionne la méthode de partitionnement en (GPT). Pour finir on sélectionne la proposition de partionnement automatique [a].

Available disks are: sdO. Encrypt the root disk? (disk, ‘no’ or ’?’ for details) [no]
Which disk is the root disk? (’?’ for details) [sd0]  # ont défini içi le disque de destination pour l'installation
Use (W)hole disk MBR, whole disk (G)PT or (E)dit? [gpt] 
Setting OpenBSD MBR partition to whole sdO...done. The auto-allocated layout for sdO is:
# size offset fstype [fsize bsize cpg] 
a: 1.0G 512 4.2B5SD 2048 16384 1 # / 
b: 2.5G 2097664 Swap 
c: 35 .0G O unused 
d: 2.1G 7352384 4.2BSD 2048 16384 1 # /tmp 
e: 3.2G 11670784 4.2B5D 2048 16384 1 # /var
f: 3.9G 18452736 4.2B5D 2048 16384 1 # /usr 
g: 1.0G 26615584 4.2BSD 2048 16384 1 # /usr/X11R6 
h: 4.6G 28712736 4.2BSD 2048 16384 1 # /usr/local 
i: 2.0G 38446176 4.2BSD 2048 16384 1 # /usr/src 
j: 6.0G 42536320 4.2BSD 2048 16384 1 # /usr/obj 
k: 6.7G 55058400 4.2BSD 2048 16384 1 # /home
Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout? [a]

Ont défini cette fois disk comme type d’emplacement pour le package-set ensuite dans la liste des disques disponible nous sélectionnerons le seul disque disponible n’étant pas sd0 en l’occurence wd0, ce qui correspont à nôtre ide0 PVE1:iso/install73.img. Et pour finir ont bypass la vérification SHAZ56.sig pour installer l’ensemble.

Let’s install the sets? 
Location of sets? (cd0 disk http nfs or ’done’) [http] disk
Is the disk partition already mounted? [yes] no 
Available disks are: sd0 sd1.
Which disk contains the install media? (or '‘done') [sd1] 
a: 1358848 18624 4.2BSD 2048 16384 16142 
i: 960 64 MSDOS 
Available sd1 partitions are: a i. 
which sd1 partition has the install sets? (or ‘done') [a]
Pathname to the sets? (or 'done') [7.3/amd64]

Select sets by entering a set name, a file name pattern or ‘all’. De-select
sets by prepending a ’-’, e.g.: *-gamex’. Selected sets are labelled ’[X]’. 
[X] bsd [X] base73.tgz [X] game73.tgz [X] xfont73.tgz 
[X] bsd.mp [X] comp73.tgz [X] xbase73.tgz [X] xserv73.tgz 
[X] bsd.rd [X] man73.tgz [X] xshare73.tgz
Set name(s)? (Cor ’abort’ or ’done’) [done]
Directory does not contain SHAZ56.sig. Continue without verification? [no] yes 
Location of sets? (cdO disk http nfs or ’done’) [done] 
CONGRATULATIONS! Your OpenBSD install has been successfully completedt
When you login to your new system the first time, please read your mail using the ’mail’ command.
Exit to (S)hell, (H)alt or (R)eboot? [reboot]

Post installation

Concernant la VM BIOS vous pouvez directement l’éteindre et déconnecter le disque d’installation :

qm stop 109 && qm set 109 --delete ide0
qm start 109 

Pour la VM UEFI je vous de recommande de simplement la redémarer depuis la console, et de ne pas retirer le disque d’installation (openbsd semble en avoir besoin au boot).

Une fois nos VMs re-démarrée, il faudra encore passer quelques configurations pour l’agent QEMU.

# Check de l'adresse IP (me sera utile pour passer le reste de la config via SSH)
ifconfig

# Installation de l'agent QEMU
pkg_add qemu-ga

# Configuration ISA QEMU Guest agent
cat <<'EOF' >> /etc/rc.conf.local

pkg_scripts=qemu_ga
qemu_ga_flags="-t /var/run/qemu-ga -m isa-serial -p /dev/cua00 -f /var/run/qemu-ga/qemu-ga.pid"

EOF

# Activation du service QEMU Guest agent
/etc/rc.d/qemu_ga stop && /etc/rc.d/qemu_ga start

Cloud-init et image “Cloud” d’OpenBSD

Maintenant venons en au douloureux sujet de la compatibilité entre OpenBSD et Cloud-init, officiellement OpenBSD ne propose pas d’image “Cloud” préconfiguré avec Cloud-init ni de package pour ce dernier. Cependant, divers projets proposent des implémentations non-officielle notamment ici https://bsd-cloud-image.org.

Voilà comment j’ai procédé :

je commence par créer mon template

 qm create 112 \
    --name obsd-ci \
    --agent 1,type=isa \
    --memory 2192 \
    --bios seabios \
    --boot order='scsi0' \
    --sockets 1 --cores 2 \
    --net0 virtio,bridge=vmbr0 \
    --ide0 local-lvm:cloudinit \
    --sshkey /root/.ssh/id_rsa.pub \
    --scsihw virtio-scsi-pci \
    --serial0 socket \
    --vga serial0 

Explications :

  • sshkey /root/.ssh/id_rsa.pub : On importe notre clé SSH, ce qui nous assure un accès autre que la sortie SERIAL.
  • 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.

Je télécharge l’image Cloud d’OpenBSD depuis https://bsd-cloud-image.org, et je lance la commande pour l’importation.

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 crée mon fichier de configuration pour Cloud-init, comme je l’avais fait dans mon précédent article GPU passtrought sous Proxmox VE - Debian 12 (Part. 02x04) je vais stocker mon fichier de config dans ”/mnt/pve/PVE1/snippets”, rapport à ma configuration particulière (point de montage vers mon NAS). Dans votre cas préféré le chemin natif “/var/lib/vz/snippets”.

  • On définit un nouvel utilisateur avec les droits super-utilisateur
  • On importe notre clée ssh pour le nouvel utilisateur (n’est pas nécessaire, mais cela nous permet de conserver un accès SSH à notre VM au cas où)
  • Enfin ont passe les dernières commandes de post installation dans la section runcmd. Attention cependant, comme la sortie console (pour cloud-init) occupe déja serial0 il nous faudra sélectionner un autre port série pour ISA en l’occurrence /dev/cua01.
cat << EOF >> /mnt/pve/PVE1/snippets/obsd73.yaml
#cloud-config

users:
 - name: openbsd
   gecos: openbsd
   groups: wheel
   ssh_authorized_keys:
$(cat /root/.ssh/authorized_keys | grep -E "^ssh" | xargs -iXX echo "     - XX")

chpasswd:
  expire: false
  list:
    - openbsd:PASSWORD

runcmd:
  - pkg_add qemu-ga
  - 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
EOF

En plus de passer notre fichier de configuration, nous allons définir en supplément le type d’attribution IP avec les commandes.

qm set 112 --ipconfig0 ip=dhcp
qm set 112 --cicustom "vendor=PVE1:snippets/obsd73.yaml"

Dans votre cas, pour la dernière commande, utilisez plutôt (chemin par défaut pour le dossier “snippets”) :

qm set 112 --cicustom "vendor=local:snippets/obsd73.yaml"

Je fait un petit resize sur l’image QCOW2 puis on démarre la VM, et voilà une notre OpenBSD est prête à l’emploi.

qm resize 112 scsi0 +10G
qm start 112

Nous restons pour le moment sur cette configuration minimale, quant au support du PCI Passthrough et la gestion de templates, ce sera l’objet du prochain article.

Ressources :