OpenBSD : Virtualisation de Debian Stretch

Article publié, le et modifié le
10 minute(s) de lecture

Cet article contient 1979 mots.
Source brute de l'article : MD

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

Danger

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 convention 1.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)'
vmm0 at mainbus0: VMX/EPT
vmm0 at mainbus0: VMX/EPT
vmm0 at mainbus0: VMX/EPT
vmm0 at mainbus0: VMX/EPT

Attention

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

Attention

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

1
2
3
4
5
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 :

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
Attention

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
}

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

Attention

PF

Il sera ensuite nécessaire de modifier le fichier /etc/pf.conf ajouter au moins les règles suivantes :

Fichier : /etc/pf.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
()

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 vether0 doit être traduit (NATé) vers les adresses IP faisant partie du groupe egress
  • La deuxième règle demande à ce que tout flux entrant qui vient du service domain (port 53) sur les protocoles udp et tcp depuis le réseau lié à l’interface vether0 soit redirigé vers le service en question. L’adresse IPv4 1.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’interface locale 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 par enable pour la VM debian - si vous désirez que la VM correspondante démarre, soit lors du démarrage de votre machine, si et seulement si le service vmd est bien actif et démarré lors du processus de démarrage machine, soit lorsque vous redémarrez le service vmd 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 !


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 à :

Autres Sources


Enjoy-IT!
Enjoy-ID!