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
Notes :
- Démarrez dans un terminal
xterm
ou équivalent. - Assurez-vous de choisir la console série durant l’installation
- l’option
-no-fd-bootchk
permet un démarrage plus rapide quand il n’y a pas de lecteur disquette- ce n’est pas supporté par
qemu-system-sparc
.
- ce n’est pas supporté par
qemu-system-ppc*
etqemu-system-sparc*
échoue actuellement avec l’usage des drapeaux mallocJ
ouS
Compressez le disque virtuel
$ qemu-img convert -c -O qcow2 virtual.img v.tmp && mv v.tmp virtual.img
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.
-net
en ligne de commande, QEMU
présume que vous savez ce que vous faîtes et nettoie les valeurs par défaut
pour le reste des paramètres par défaut -net
./etc/resolv.conf
contient seulement des serveurs DNS IPv6.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"
NOTE : si vous utilisez sudo
à la place de doas
, souvenez vous que
sudo appelle closefrom(2)
.
Avant d’avoir plus d’un fd
passant l’interface tap
, ajouter une ligne
à sudoers
ressemblant à :
Defaults closefrom_override
et appeler sudo
via sudo -C 5 -u $USER qemu-system-i386 …
est requis.
Voir sudoers(5) et sudo(8) pour les détails.
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):
52:54:00:12:34:56
pour chaque instance QEMU. Pour changer cela,
observez la syntaxe macaddr=
dans l’exemple ci-dessus et choisissez un
lladdr
unique par interface QEMU.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’inviteboot>
. - 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
.
- lire la page de manuel QEMU pour les autres commandes qui fonctionnent dans le mode
- 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étrercom0
en tant que console série.
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
qemu
existe, créez-le ou paramétrez
USER=
en lui donnant un utilisateur existant pour utiliser cet exemple.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”.