Description
La virtualisation de machine virtuelle sous OpenBSD est officiellement
disponible nativement dans le système de base depuis OpenBSD 5.9.
Néanmoins, la FAQ Virtualisation (EN) apparaît à partir d’OpenBSD 6.4 -
(preuve d’une certaine maturité !?)
- Version : native
- OS : OpenBSD 6.4, 6.5
Installation
ATTENTION : Ce tutoriel ne documente pas dans les moindres détails les phases d’installation, voire de configuration.
Il est VRAIMENT nécessaire de faire preuve de réflexion, discernement et d’avoir un minimum de compétences, pour comprendre les liens entre les différentes briques !
Merci de votre compréhension…
Petites précisions
Il existe au moins deux manières d’installer Debian dans une VM.
-
la première méthode - la plus simple - par le biais de l’outil qemu.
-
la seconde native à OpenBSD avec la commande vmctl.
Précisions de commandes
Pour information, les commandes précédées du symbole $ sont à exécuter en tant
qu’utilisateur ; celles précédées du symbole # le sont avec des droits
administrateurs, soit en tant que root, soit par l’usage de la commande
doas
.
Précisions réseaux
-
L’interface
vether0de l’hôte aura pour adresse IPv4 :192.168.0.1, cette adresse IP sera l’adresse de la passerelle pour l’interface réseau de la VM. -
L’interface
enp0s3de la VM Debian aura pour adresse IPv4 :192.168.0.2… -
Dans les deux cas, le masque de réseau est de 24 bits.
-
Le serveur DNS renseigné dans le fichier
/etc/resolv.confde la VM de Debian est, par convention1.1.1.1. C’est celui de Cloudfare. Mais il peut être très bien tout autre, pourvu qu’il soit respectueux de la confidentialité…
tel que ceux de Quad9, par exemple ! -
Ce même serveur DNS peut être renseigné dans la règle PF de redirection de flux DNS vers la VM.
Pré-requis
Il est nécessaire que votre machine sur laquelle vous souhaitez virtualiser ait un CPU compatible avec les fonctions adéquates. Pour le vérifier, tapez dans votre terminal/console la commande suivante :
:$ dmesg | egrep '(VMX/EPT|SVM/RVI)'
La réponse du système doit être :
⇒ pour CPU Intel :
vmm0 at mainbus0: VMX/EPT
⇒ pour CPU Amd :
vmm0 at mainbus0: SVM/RVI
Si aucune ligne n’apparaît, aucune virtualisation ne sera possible. Par acquis de conscience, vérifiez votre BIOS|UEFI que celle-ci ne soit pas désactivée.
De même, en rapport avec les failles CPU relatives à Meltdown, Spectre, certains
CPU Intel sont patchés pour remédier à L1TF.
Sous OpenBSD, ces CPU reçoivent un correctif approprié. Malheureusement, cela
impacte la virtualisation et rend celle-ci impossible.
Vous pouvez vous retrouver dans la situation où vous auriez un CPU compatible,
mais dans les faits, la virtualisation ne pourrait être pleinement fonctionnelle.
Préférez AMD, en attendant ARM…
Il est nécessaire d’installer le firmware vmm pour que le kernel gère.
:# fw_update vmm
Par convention, créons un répertoire vm dans notre répertoire personnel, et
nous travaillerons à partir de celui-ci :
$ mkdir vm && cd vm
Bien-sûr, vous pouvez travailler à partir de n’importe quel répertoire -
débrouillez-vous !
Création de l’image qcow2
Dans les deux cas présentés, nous commencerons par créer la VM, très
simplement avec l’outil natif à OpenBSD, nommé vmctl :
# vmctl create ~/vm/debian.qcow2 -s 10G
(bien-sûr, vous pouvez changer la taille de la nouvelle VM en spécifiant une autre…)
Téléchargement de l’iso Debian
https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/ Et, modifiez en conséquence le code ci-dessous !
Ensuite, téléchargeons l’iso Debian :
:$ ftp https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/{debian-9.7.0-amd64-netinst.iso,SHA512SUMS}
Une fois téléchargée, vérifions sa somme de contrôle :
:$ sha512 -C SHA512SUMS debian-9.7.0-amd64-netinst.iso
(SHA512) debian-9.7.0-amd64-netinst.iso: OK
Si OK, alors c’est bon…
sinon, re-téléchargez !
Avec Qemu
Cette méthode est la plus facile, mais non conventionnelle.
Pour pouvoir créer une VM avec cette méthode (ou tout autre
distribution GNU/Linux dedans…), il est nécessaire d’utiliser le
paquet qemu :
:# pkg_add qemu
Puis exécutez qemu pour faire l’installation de Debian dans la VM -
que nous ne détaillerons pas, puisque c’est exactement comme sur
toute machine permettant de faire fonctionner Debian :
:$ qemu-system-x86_64 -hda ~/vm/debian.qcow2 -cdrom debian*.iso -boot d
à un détail près est qu’il vaut mieux à la fin de l’installation de
Debian ne pas redémarrer par le biais de l’installateur Debian, mais de
choisir le menu ’exit’ pour venir dans le shell, et d’exécuter la
commande :
# halt -
ou son équivalent # shutdown -h now - qui permettra d’arrêter proprement la VM.
Ensuite, passons à la configuration…
puis démarrons la VM debian :
:$ vmctl start debian -c
Puis une fois connecté, avec des droits administrateurs, il faut modifier le
fichier /etc/defaut/grub de telle manière :
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"
Puis de mettre à jour grub : # update-grub
Redémarrez votre debian, et profitez de son usage !
Une fois terminée, vous pouvez en finir avec la configuration…
Voilà !
Avec vmctl
Cette méthode est un peu plus “sioux”, mais ne nécessite que des outils natifs à OpenBSD.
Nous allons utiliser l’image de démarrage avec le fichier initrd modifié pour
Xen pour fonctionner avec…
Téléchargement
Téléchargeons les fichiers nécessaires :
:$ ftp http://ftp.debian.org/debian/dists/stretch/main/installer-amd64/current/images/hd-media/boot.img.gz
:$ ftp http://ftp.debian.org/debian/dists/stretch/main/installer-amd64/current/images/netboot/xen/initrd.gz
:$ ftp http://ftp.debian.org/debian/pool/main/l/linux/virtio-modules-4.9.0-8-amd64-di_4.9.135-1_amd64.udeb
virtio-modules
pourrait avoir changé… donc parcourez le site Debian pour trouver la version la plus récente !
Décompressions
Occupons-nous des différents phases de décompression des trois fichiers téléchargés :
:$ gzip -d initrd.gz
:$ mkdir stable
:$ cd stable
:$ ar -x ../virtio-modules-4.9.0-**-1_amd64.udeb data.tar.xz <= remplacez par le nom du paquet `virtio-modules` que vous avez téléchargé !
:$ xz -d data.tar.xz
:$ tar xf data.tar
:$ rm data.tar
:$ find . | cpio -o -A -H sv4cpio -O ../initrd
:$ cd ..
:$ gzip -9 initrd
:$ gzip -d boot.img.gz
Modifications
Il nous faut monter le fichier boot.img afin de faire les modifications
systèmes nécessaires :
:# vnconfig vnd1 ~/vm/boot.img
:# mount /dev/vnd1i /mnt
:# cp initrd.gz /mnt/INITRD.GZ
:# sed -i -e "s/\(.*\)append vga=788 initrd=initrd.gz --- quiet/\1append vga=off initrd=initrd.gz --- quiet console=ttyS0,115200n8/" /mnt/TXT.CFG
:# umount /mnt
:# vnconfig -u vnd1
Ensuite, passons à la configuration…
puis, démarrons la VM install.
Démarrage
:$ vmctl start install -c
Lorsque le menu d’installation est affiché, choisir Install, puis une fois
dans l’installateur, appuyez sur la touche
Une fois dans le shell, il faut taper les commandes qui suivent :
depmod
modprobe virtio_pci virtio_blk
lsmod
exit
puis, continuer la phase d’installation selon vos besoins.
Une fois l’installation terminée, ne redémarrez pas par le biais de l’installateur,
choisissez à nouveau d’exécuter le shell, puis écrivez la commande : # halt
afin d’arrêter la VM proprement !
Re-démarrage
Maintenant, il faut démarrer la VM debian :
$ vmctl start debian -c
afin de pouvoir voir le menu de Grub et l’éditer - si vous le ratez, vous
démarrez en mode initramfs et vous serez bon pour recommencer à démarrer la
VM afin d’arriver à éditer le Grub !
Il faut éditer le menu Grub ; tapez sur la touche vdb pour les transformer en vda -
ne touchez pas au numéro qui suit
, autrement vous
vous retrouveriez au prochain démarrage avec le même problème que décrit ci-dessus…
Une fois modifié, appuyez sur les touches
Une fois connecté, avec des droits administrateurs, il faut éditer le fichier
/boot/grub/grub.cfg pour remplacer les mêmes occurrences de vdb en vda,
puis d’exécuter la commande update-grub.
Pour finir, il faut éditer le fichier /etc/network/interfaces pour
remplacer le nom de l’interface enp0s4 par enp0s3 :
# sed -i -e 's/enp0s4/enp0s3/' /etc/network/interfaces
Maintenant vous pouvez redémarrer votre système Debian pour en profiter convenablement !
Une fois terminée, vous pouvez en finir avec la configuration…
Voilà !
Configuration
Le fichier de configuration se trouve être /etc/vm.conf. Il faut écrire votre
compte identifiant dans la variable USER, cela permettra à votre utilisateur
d’utiliser l’outil vmctl…
USER=""
ROOT="/home/$USER/vm"
switch "sw" {
interface bridge0
}
vm "install" {
disable
memory 1024M
disk $ROOT/boot.img
disk $ROOT/debian.qcow2
interface { switch "sw" }
owner $USER
}
vm "debian" {
disable
memory 1024M
disk $ROOT/debian.qcow2
interface { switch "sw" }
owner $USER
}
Vérifiez la configuration à l’aide de l’option -n de vmd :
:$ vmd -n
Après avoir configuré les interfaces réseaux, il faudra
démarrer le service vmd.
Il est assurément utile de s’occuper de la traduction d’adresses réseaux, et aussi des règles du parefeu…
Interfaces réseaux
Créons les interfaces réseaux nécessaires que sont vether0 et bridge0 qui
permettront un contrôle fin de l’adressage IP et des règles PF.
Pour l’interface vether0, il est possible d’utiliser n’importe quelle classe
privée IPv4 (A: 10.0/8 ; B: 172.0.0/16 ; C: 192.168.0.0/24) - nous utiliserons
un type de classe C privée, telle que 192.168.0.x*.
Après tout, nous n’avons pas plus de 256 VM à administrer… ;)
bridge0
Le fichier relatif est /etc/hostname.bridge0 : add vether0
vether0
Le fichier relatif est /etc/hostname.vether0 : inet 192.168.0.1 255.255.255.0
Une fois les fichiers d’interfaces créés, donnez des droits 0600 dessus, puis démarrez les deux interfaces :
:# chmod 0600 /etc/hostname.{bridge,vether}0
:# sh /etc/netstart {bridge,vether}0
NAT
Pour nous faciliter la vie avec notre futur VM, nous allons autoriser la redirection des paquets IP, pour qu’elle puisse communiquer sur Internet - ne serait-ce que pour faire les mises à jour…
Dans un terminal/console, écrivez :
:# sysctl net.inet.ip.forwarding=1
:# sysctl net.inet6.ip6.forwarding=1
La première ligne est pour IPv4, la seconde pour IPv6.
Puis, pour garder les paramètres au redémarrage, modifiez le fichier
/etc/sysctl.conf pour ajouter :
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
PF
Il sera ensuite nécessaire de modifier le fichier /etc/pf.conf ajouter au moins les règles suivantes :
(…)
match out on egress from vether0:network to any nat-to (egress)
(…)
pass in quick proto { udp tcp } from vether0:network to any port domain rdr-to 1.1.1.1 port domain
pass on vether0 from 127.0.0.1 to any
pass on vether0 from vether0:network to any
(…)
-
La première règle indique que tout ce qui vient du réseau lié à l’interface
vether0doit être traduit (NATé) vers les adresses IP faisant partie du groupeegress -
La deuxième règle demande à ce que tout flux entrant qui vient du service
domain(port53) sur les protocolesudpettcpdepuis le réseau lié à l’interfacevether0soit redirigé vers le service en question.
L’adresse IPv41.1.1.1est celle du serveur DNS de Cloudflare ; elle peut être très bien celle de tout autre serveur DNS. -
La troisième règle autorise tout ce qui passe en entrée et en sortie sur l’interface
vether0depuis l’interfacelocalevers ailleurs… -
Quant à la quatrième, elle autorise tout du réseau, en entrée et en sortie, lié à l’interface
vether0vers partout !
Pour finir
Une fois que vous avez fini l’installation de Debian dans votre VM, que vous
avez fait les derniers réglages nécessaires pour son bon fonctionnement, vous
pouvez faire deux choses utiles liés à l’édition du fichier /etc/vm.conf :
-
Supprimer/commenter toute écriture relative à la déclaration de la VM
install… -
Remplacer le mot clé
disableparenablepour la VMdebian- si vous désirez que la VM correspondante démarre, soit lors du démarrage de votre machine, si et seulement si le servicevmdest bien actif et démarré lors du processus de démarrage machine, soit lorsque vous redémarrez le servicevmdlui-même par vos soins.
Un tout petit laïus sur la commande vmctl : $ man vmctl pour découvrir les
différentes options bien utiles, dont show, status, start, et stop qu’il
semble nécessaire de maîtriser !
Dépannage
vmctl vmm bios firmware not found
Vous n’avez tout simplement pas installé le firmware vmm !
Documentations
-
Merci de lire la documentation officielle FAQ Virtualisation (EN, [FR][2]) afin de bien comprendre le sujet, les différentes informations nécessaires à une meilleure préhension de celui-ci.
-
Il est fortement intéressant de lire les pages de manuels, en anglais, relative à :
- vmctl(8)
- vmd(8)
- vm.conf(5)
- vmm(4)
- sans oublier doas , au besoin…
Autres Sources
Enjoy-IT!
Enjoy-ID!