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, FR) 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
vether0
de 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
enp0s3
de 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.conf
de 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
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 :
Fichier : /etc/default/grub
|
|
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 :
Code : sh
$ 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 :
Code : sh
$ 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 :
Code : sh
# 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 ESC/ECHAP pour choisir le menu Execute a shell.
Une fois dans le shell, il faut taper les commandes qui suivent :
Code : sh
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 e puis
cherchez toutes les occurrences de 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
CTRL+x pour sortir de l’éditeur de Grub et démarrez le
système Debian fraîchement installé !
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
…
Fichier : /etc/vm.conf
|
|
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 :
Fichier : /etc/pf.conf
|
|
- La première règle indique que tout ce qui vient du réseau lié à l’interface
vether0
doit ê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 protocolesudp
ettcp
depuis le réseau lié à l’interfacevether0
soit redirigé vers le service en question. L’adresse IPv41.1.1.1
est 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
vether0
depuis l’interfacelocale
vers ailleurs… - Quant à la quatrième, elle autorise tout du réseau, en entrée et en sortie, lié à l’interface
vether0
vers 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é
disable
parenable
pour 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 servicevmd
est bien actif et démarré lors du processus de démarrage machine, soit lorsque vous redémarrez le servicevmd
lui-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) 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!