Virtualiser des systèmes (vmd) §

C'est de plus en plus facile de virtualiser un système dans OpenBSD grâce à vmd.

Euh, ok, mais ça veut dire quoi virtualiser ?

Pour faire fonctionner plusieurs systèmes d'exploitation, vous imaginez peut-être qu'il est nécessaire d'avoir plusieurs ordinateurs? Que nenni 😁. Vous pouvez héberger des systèmes virtuels sur votre serveur.

Le disque du nouveau système est un simple fichier, et le virtualiseur fait comme s'il était une vraie machine pour exécuter le système d'exploitation présent dans ce fichier.

Plus simplement, il vous est possible d'avoir plusieurs OpenBSD dans une OpenBSD (openbsdception 😁), comme s'il s'agissait de plusieurs machines indépendantes.

Cela présente de nombreux avantages :

Toutefois, cela consomme davantage de ressources.

Avant d'aller plus loin, afin de bien nous comprendre, il faut préciser à quoi fera référence le vocabulaire suivant :

OpenBSD nous propose trois outils pour virtualiser un système :

Vérifiez tout d'abord si votre matériel prend en charge la virtualisation avec la commande suivante :

$ dmesg | egrep '(VMX/EPT|SVM/RVI)'

Si le résultat n'est pas vide, c'est tout bon 😊.

N'oubliez pas de mettre à jour les firmwares si besoin : # fw_update.

Activez vmd avant de passer à la suite :

# rcctl enable vmd
# rcctl start vmd

Pour ajouter une machine virtuelle, nous procéderons toujours dans l'ordre suivant :

1. Installation d'un système dans une machine virtuelle sur un fichier disque avec vmctl ;

2. Configuration de vmd pour qu'il gère cette machine automatiquement.

Virtualisation d'OpenBSD §

Installation d'une machine virtuelle §

Nous allons créer en exemple une machine virtuelle avec OpenBSD dessus. Pour nous simplifier la vie, nous créons nos machines virtuelles dans le dossier /var/vm :

# mkdir /var/vm

Tout d'abord, créez une image disque de 50G par exemple :

# vmctl create -s 50G /var/vm/obsdvm.qcow2 
vmctl: qcow2 imagefile created

Vous pouvez voir qu'il y a un nouveau fichier obsdvm.qcow2 : c'est le disque de la machine virtuelle.

Maintenant, installez OpenBSD sur cette image. Trois possibilités :

1 : Si vous avez téléchargé une image d'installation de type installXX.iso :

# vmctl start -c -m 1G -L -i 1 -r installXX.iso -d /var/vm/obsdvm.qcow2 openbsdvm 

Voici la signification des diverses options :

2 : Si vous avez une image disque installXX.img (ou minirootXX.img)

# vmctl start -c -m 1G -L -i 1 -d installXX.img -d /var/vm/obsdvm.qcow2 openbsdvm

3 : Si vous avez juste le fichier /bsd.rd (sans doute déjà présent sur votre machine) :

# vmctl start -c -m 1G -L -i 1 -b /bsd.rd -d /var/vm/obsdvm.qcow2 openbsdvm 

Attention, ce type d'installation nécessite un accès à internet pour votre machine virtuelle. Configurez-le avant 😉 (c.f. le paragraphe "Accès au réseau pour toutes les machines virtuelles").

L'installation d'OpenBSD se passe comme d'habitude.

Une fois l'installation terminée, choisissez "Halt" puis quittez la console de la machine virtuelle en appuyant successivement sur ~ et .. Attention si vous utilisez une connexion SSH, il faudra alors entrer la séquence ~~. au risque de vous déconnecter de votre session SSH en même temps que la console de la machine virtuelle.

Arrêtez proprement la machine virtuelle ainsi :

# vmctl stop openbsdvm

Maintenant que l'installation est terminée, on va simplifier la gestion de la machine virtuelle.

Ajout de la machine virtuelle dans vmd §

Laissons vmd gérer automatiquement la machine virtuelle désormais.

Éditez le fichier /etc/vm.conf qui sera lu par vmd afin de préciser quelques informations concernant la machine virtuelle :

vm "openbsdvm" {
    memory 1G
    enable
    disk /var/vm/obsdvm.qcow2
    local interface
    owner batman 
}

Veillez à bien adapter les options "disk" et "owner" selon la configuration souhaitée. "owner" permet de pouvoir gérer votre machine virtuelle en tant que simple utilisateur, sans avoir à devenir root, et ça c'est cool 😎. Vous pouvez de cette façon dédier une machine virtuelle à certains utilisateurs.

Relancez vmd pour profiter de cette configuration. Ce dernier va démarrer automatiquement la machine virtuelle. Vous pouvez toujours vous y connecter avec la commande :

vmctl console obsdvm

Accès au réseau pour toutes les machines virtuelles §

Par défaut, les machines virtuelles sont "enfermées" sur le serveur. Si vous souhaitez leur autoriser un accès à internet, quelques manipulations sont à réaliser.

Tout d'abord, ajoutez ceci dans la configuration du pare-feu (/etc/pf.conf) pour autoriser le flux sortant des machines virtuelles:

# utilisation d'un resolveur DNS public
pass in quick proto { tcp udp } from 100.64.0.0/10 to any port domain \
    rdr-to 9.9.9.9 port domain
match out on egress from 100.64.0.0/10 to any nat-to (egress)

Ici, on utilise le résolveur DNS public de quad9 pour les machines virtuelles.

https://www.quad9.net/

Vous voudrez sans doute modifier cette partie, notamment "9.9.9.9" par un résolveur qui vous convient peut-être davantage.

Dans le cas où vous avez configuré le résolveur unwind sur l'hôte (et c'est une excellente idée 😎), vous pouvez faire en sorte que les machines virtuelles puissent s'en servir plutôt que d'utiliser le résolveur précédent :

# Utilisation du résolveur unwind(8) de l'hôte pour les VM
pass in proto { tcp udp } from 100.64.0.0/10 to any port domain \
    rdr-to localhost port domain
match out on egress from 100.64.0.0/10 to any nat-to (egress)

Si vous avez configuré votre pare-feu de façon à ce qu'il bloque tout par défaut, vous devrez ajouter ceci afin d'autoriser l'interface servant à communiquer avec les machines virtuelles :

pass on tap0 from 127.0.0.1 to any
pass on tap0 from 100.64.0.0/10 to any

Dans tous les cas, il faudra activer la redirection d'IP dans le fichier /etc/sysctl.conf :

net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

Ainsi, les requêtes sont correctement redirigées vers (ou depuis) les machines virtuelles.

Après avoir pris en compte ces modifications, c'est tout bon 😊.

Dédier une machine virtuelle à une tâche §

Vous voudrez peut-être attribuer à chacune de vos machines virtuelles un rôle bien précis : l'une pour servir les sites web, une autre pour les mails... C'est bien entendu tout à fait possible, mais nécessite une configuration réseau différente de celle présentée jusqu'ici.

Ajout d'une interface virtuelle côté hôte §

Sur votre serveur, créez une nouvelle interface de type "vether" (ethernet virtuel...)

# echo 'inet 10.0.0.1 255.255.255.0' > /etc/hostname.vether0
# sh /etc/netstart vether0

Ensuite, créez une interface de type bridge (qui fait le "pont" entre l'hôte et les machines virtuelles).

# echo 'add vether0' > /etc/hostname.bridge0
# sh /etc/netstart bridge0

Désormais, la redirection dans le pare-feu se fait ainsi :

# ancienne ligne maintenant commentée : 
# match out on egress from 100.64.0.0/10 to any nat-to (egress)
match out on egress from vether0:network to any nat-to (egress)

# necessaire pour resolutions DNS
pass in quick proto { udp tcp } from vether0:network to any port domain \
    rdr-to 9.9.9.9 port domain

#pass on tap0 from 127.0.0.1 to any
#pass on tap0 from 100.64.0.0/10 to any
pass on vether0 from 127.0.0.1 to any
pass on vether0 from 10.0.0.0/24 to any
# ou pour ne pas s'embeter :
# pass on vether0

Afin de lancer une machine virtuelle, nous n'utiliserons plus l'option -L avec vmctl ni l'option local interface dans /etc/vm.conf. À la place, on configure une adresse bien précise pour chaque machine virtuelle dans le fichier /etc/vm.conf :

switch "my_switch" {
    interface bridge0
}

vm "openbsdvm" {
    memory 1G
    enable
    disk /var/vm/obsdvm.qcow2
    owner batman 
    interface { switch "my_switch" }
}

Configuration du réseau côté machine virtuelle §

Sur la machine virtuelle, vous pouvez configurer une IP dans la plage 10.0.0.0/24 : c'est ce qu'on a mis dans le fichier /etc/hostname.vether0. Par exemple : "10.0.0.2", "10.0.0.3"...

La route par défaut à indiquer est 10.0.0.1. Cela donnera :

# cat /etc/hostname.vio0
inet 10.0.0.2 255.255.255.0 10.0.0.255
!route add default 10.0.0.1

# cat /etc/resolv.conf
nameserver 10.0.0.1

Redirection du trafic vers les machines virtuelles §

Selon la nature de la demande, vous enverrez le flux sur la machine virtuelle concernée. Prenons l'exemple suivant :

Sur le serveur hôte, vous configurerez le pare-feu de cette façon :

pass in on egress proto tcp from any to (egress) port { 80 443 } rdr-to 10.0.0.2
pass in on egress proto tcp from any to (egress) port 22 rdr-to 10.0.0.3

Pour plusieurs sites web, vous voudrez plutôt utiliser relayd afin de répartir la charge...

Virtualisation de debian §

On télécharge debian puis on l'installe après avoir créé le disque :

ftp "https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.5.0-amd64-netinst.iso"
vmctl create -s 50G /var/vm/debian.qcow2 
vmctl start -c -m 1G -L -i 1 -r debian*.iso -d /var/vm/debian.qcow2 debianvm

Choissez le menu "Install" SANS VALIDER ⚠.

Appuyez sur TAB puis modifiez la ligne qui apparaît pour entrer à la place :

/install.amd/vmlinuz vga=off initrd=/install.amd/initrd.gz --- quiet console=ttyS0,115200n8 

Vous devez modifier les options vga et ajouter "console=...." Merci à PengouinBSD pour l'astuce.

La suite, c'est comme d'habitude sous debian.

Il est impératif de modifier les options de démarrage de debian une fois l'installation terminée. Au redémarrage, éditer le fichier de configuration de grub (le gestionnaire de démarrage). Il s'agit du fichier /etc/default/grub où vous veillerez à avoir ces lignes :

GRUB_TIMEOUT=1
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200"
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

Ensuite, reconstruisez la configuration de grub :

# update-grub

On peut maintenant configurer la machine virtuelle sur le serveur dans /etc/vm.conf.

switch "my_switch" {
    interface bridge0
}

vm "debianvm" {
    memory 200M
    enable
    disk /var/vm/debian.qcow2
    interface { switch "my_switch" }
    owner batman
}

Et voilà, vous avez debian virtualisée par OpenBSD 😊.

Vous voudrez sans doute configurer les interfaces réseau de la machine virtuelle debian par la suite.

Configuration de l'accès réseau pour l'hôte debian §

Remplissez sur la machine virtuelle le fichier "/etc/network/interfaces" selon l'interface détectée par debian.

Voir la documentation debian à ce sujet.

https://wiki.debian.org/NetworkConfiguration

Virtualisation d'Alpine Linux §

Alpine Linux est une distibution très légère, qui sera un choix appréciable si vous avez juste besoin d'un système Linux à virtualiser.

https://www.alpinelinux.org/

L'installation et la virtualisation de ce système minimaliste ne devrait poser aucune difficulté.

Téléchargez une image d'installation ".iso" alpine, puis procédez comme si vous virtualisiez OpenBSD :

# vmctl create -s 50G /var/vm/linux.qcow2 
# vmctl start -c -m 1G -L -i 1 -r image.iso -d /var/vm/linux.qcow2 linux

Lorsque la machine virtuelle démarre, appuyez sur "TAB" pour voir quel est l'image disponible. Ça peut être "lts". Indiquez alors au prompt l'image que vous voulez démarrer suivi de l'option concernant la console. Par exemple :

lts console=ttyS0,115200

Ou encore, avec l'image optimisée pour les systèmes virtualisés (notre cas):

virt console=ttyS0,115200

Validez avec Entrée puis poursuivez l'installation.

Aller plus loin avec vmd §

FAQ officielle:

https://www.openbsd.org/faq/faq16.html

openbsd.amsterdam propose des machines virtuelles et reverse une partie des gains à OpenBSD (16% tout de même ! 😊).

https://openbsd.amsterdam/

Détails de l'infrastructure d'OpenBSD.amsterdam:

https://openbsd.amsterdam/setup.html


Table des matières

Donate