%
Puffy image/svg+xml Puffy 2019-06-14 Stéphane HUC OpenBSD Team Inkscape Puffy OpenBSD https://www.openbsd.org/art4.html English "Puffy", it's a symbol of OpenBSD

Qemu : Virtualisation sous OpenBSD

Article publié, le et modifié le
7 minutes de lecture

Cet article contient 1435 mots.
Source brute de l'article :
Commit version : 6c1c6bd

Description

QEMU est un émulateur machine open source. Il peut exécuter des systèmes d’exploitations et des programmes faits pour une machine (càd, une carte ARM) sur une machine différente (càd, votre propre PC).

Installation

Installez le paquet qemu.

Configuration

Démarrage rapide

Obtenez une image ISO

  • Pour i386 : $ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/i386/cd52.iso
  • ou respectivement pour amd64 : $ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/amd64/cd52.iso
  • voire SPARC : $ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/sparc/cd52.iso

Créez un disque virtuel

$ qemu-img create -f qcow2 virtual.img 10G

Installez le système d’exploitation

  • pour i386 : $ qemu-system-i386 -m 32 -monitor stdio -no-fd-bootchk -hda virtual.img -cdrom cd52.iso -boot d
  • pour amd64 : $ qemu-system-x86_64 -m 32 -monitor stdio -no-fd-bootchk -hda virtual.img -cdrom cd52.iso -boot d
  • pour SPARC : $ qemu-system-sparc -m 32 -monitor stdio -hda virtual.img -cdrom cd52.iso -boot d
Info

Compressez le disque virtuel

$ qemu-img convert -c -O qcow2 virtual.img v.tmp && mv v.tmp virtual.img

Attention

Démarrez normalement le disque virtuel

  • Pour i386 : $ qemu-system-i386 -m 32 -nographic -no-fd-bootchk -hda virtual.img
  • Pour amd64 : $ qemu-system-x86_64 -m 32 -nographic -no-fd-bootchk -hda virtual.img
  • Pour SPARC : $ qemu-system-sparc -m 32 -nographic -hda virtual.img

Gestion du réseau

Paramétrage par défaut

Par défaut, QEMU définit les paramètres réseaux suivants :

-net nic,vlan=0,model=e1000,macaddr=52:54:00:12:34:56
-net user,vlan=0

De même, à l’intérieur du mode réseau virtuel, il utilise le segment 10.0.2.0/24 et dessert DHCP à l’intérieur du réseau virtuel. Des adresses statiques peuvent être utilisées s’il n’est pas possible d’utiliser DHCP dans l’hôte invité :

  • IP du système hôte : 10.0.2.15
  • Passerelle par défaut : 10.0.2.2
  • Serveur de nom : 10.0.2.3

C’est suffisant pour la plupart des opérations, QEMU assume la NAT lui-même et permet au réseau de l’espace utilisateur de faire des opérations TCP/UDP. ICMP et autres aspects réseaux ne sont pas possible dans ce mode.

Info
Attention

Mode tap

Parfois il est souhaitable de configurer QEMU pour accéder au réseau directement via la Couche de niveau 2. Une manière de faire cela sans exécuter QEMU avec les droits root est de laisser root ouvrir le périphérique /dev/tapN et de passer le fichier descripteur à QEMU. L’interface tap(4) devrait être de préférence configurée avant de démarrer QEMU : # ifconfig tap0 192.168.0.254

L’interface peut aussi être configurée comme partie de bridge(4), dans ce cas l’adresse ip peut être omise : # ifconfig bridge0 add tap0 add em0 up

Les interfaces tunnel et bridge peuvent aussi être configurées au démarrage du système en éditant les fichiers /etc/hostname.tapN et /etc/hostname.bridgeN, respectivement (voir hostname.if(5)).

Après la configuration du réseau virtuel, nous pouvons utiliser doas pour laisser root ouvrir le périphérique tunnel et ensuite utiliser encore doas pour supprimer les privilèges et démarrer QEMU :

$ doas sh -c "doas -u $USER qemu-system-i386 -nographic -net nic -net tap,fd=3 -no-fd-bootchk -hda virtual.img 3<>/dev/tap0"
Info

Une alternative à la procédure décrite ci-dessus est de laisser QEMU paramétrer le réseau via le fichier /etc/qemu-ifup. Ceci n’est toutefois pas recommandé, puisque vous allez exécuter QEMU avec les droits root, et qu’il n’y a pas de moyen de supprimer les privilèges root à ce niveau.

/etc/qemu-ifup contient quelques paramètres par défaut qui permettent de faire ce qui suit : # qemu-system-i386 -net nic -net tap -no-fd-bootchk -hda virtual.img

Cela présume que vous souhaitez que l’interface tap(4) discute avec l’interface gérant la route IPv4 par défaut (basculant sur trunk0 si aucune route n’est trouvée), et que vous voulez que bridge0 soit utilisée en tant que bridge en second.

Paramétrer les variables d’environnement ETHER et BRIDGE surchargera ces paramètres, respectivement.

Lors du démarrage de QEMU, le script essaie de sortir les informations utiles, mais il peut y avoir des messages d’erreurs qui apparaissent, aussi bien. Sur mon laptop, je veux router NAT nativement en utilisant PF et aussi en ayant accès à la couche de niveau 2 vers le réseau de QEMU. J’ai donc ceci dans le fichier /etc/hostname.trunk101 :

inet6 fe80::1c 64 lladdr 00:03:25:0d:7a:2c
inet 10.7.255.1 255.255.255.0
inet6 alias 2001:240:58a:45::1c

J’ai configuré dhcpd pour s’exécuter sur trunk101, et aussi rad.

Pour QEMU, le démarrage ressemble à cela :

# export ETHER=trunk101
# export BRIDGE=bridge101
# qemu-system-i386 -net nic,vlan=0,macaddr=52:54:00:12:35:00 \
	-net tap,vlan=0 -vnc :0 -localtime -usb -usbdevice tablet \
	-m 256 -no-fd-bootchk -hda virtual.img -monitor stdio
{tap0 (bridge101 <-> trunk101)ifconfig: bridge101: No such process
    ifconfig: bridge101: No such process
}
(qemu)

Ces erreurs sont normales et doivent être ignorées. Vérifiez que le réseau est proprement configurée en vérifiant l’interface bridge :

$ ifconfig bridge101
bridge101: flags=41<UP,RUNNING>
groups: bridge
priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp
designated: id 00:00:00:00:00:00 priority 0
tap0 flags=3<LEARNING,DISCOVER>
	port 16 ifpriority 0 ifcost 0
trunk101 flags=3<LEARNING,DISCOVER>
	port 6 ifpriority 0 ifcost 0
Addresses (max cache: 100, timeout: 240):
Info

Gestion de la souris

NOTE : Certains systèmes d’exploitation fonctionnent mieux avec le périphérique USB tablet qu’avec le périphérique normal de souris PS/2. Voir l’exemple ci-dessus pour l’usage.

-usb -usbdevice tablet

Gestion de la console série

Installer OpenBSD via la console série est parfois désirable. X peut ne pas être disponible… Il y a deux manières d’accomplir cela, les deux offrant la même solution :

a. qemu-system-i386 -vnc :0 -serial stdio .. virtual.img -cdrom install52.iso -boot d

  • cette option vous permet d’utiliser VNC depuis tout système pour vous connecter à l’instance QEMU et d’utiliser set tty com0 à l’invite boot>.
  • vous pouvez alors déconnecter VNC et utiliser le terminal avec lequel vous avez démarré QEMU pour faire l’installation.

b. qemu-system-i386 -nographic .. virtual.img -fda floppy52.fs -boot a

  • cela mappe à la fois le port série et l’invite du moniteur (qemu) sur le terminal où QEMU a été démarré.
  • pour basculer entre eux, utilisez Ctrl-a c
    • lire la page de manuel QEMU pour les autres commandes qui fonctionnent dans le mode -nographic.
  • la préparation de l’image de disquette pour forcer le mode de console série est simple :
vnconfig vnd0 floppy52.fs
mount /dev/vnd0c /mnt
mkdir /mnt/etc
echo set tty com0 > /mnt/etc/boot.conf
umount /mnt
vnconfig -u vnd0
  • Assurez-vous de choisir yes pour paramétrer com0 en tant que console série.
Info

Gestion du service

Parfois, vous voulez que QEMU démarre en tant que script système.

En plus des options ci-dessus, l’option -daemonize est très pratique, de même que pour désigner telnet: pour -serial et -monitor.

hddir=/var/vm
USER=qemu
if [ -x /usr/local/bin/qemu ]; then
    echo -n 'Qemu: vmi386'
	(
            ifconfig bridge101 add trunk101 add tap0 up

            sh -c "doas -u $USER \
                /usr/local/bin/qemu-system-i386 \
                -daemonize \
                -nographic \
                -net nic,vlan=0,macaddr=52:54:00:4e:62:8f \
                -net tap,vlan=0,fd=3 \
                -m 128 \
                -hda $hddir/virtual.img \
                -serial telnet:127.0.0.1:1080,server,nowait \
                -monitor telnet:127.0.0.1:1081,server,nowait \
                -no-fd-bootchk 3<>/dev/tap0"
	)
    echo "."
fi
Info

Documentation

  • Lire le fichier pkg-readme : /usr/local/share/doc/pkg-readmes/qemu

Historique

J’ai écrit historiquement de manière collaborative cette documentation sur le wiki de la communauté “OpenBSD Pour Tous”.