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).
Installez le paquet qemu
.
/usr/local/share/doc/pkg-readmes/qemu
$ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/i386/cd52.iso
$ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/amd64/cd52.iso
$ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/sparc/cd52.iso
$ qemu-img create -f qcow2 virtual.img 10G
$ qemu-system-i386 -m 32 -monitor stdio -no-fd-bootchk -hda virtual.img -cdrom cd52.iso -boot d
$ qemu-system-x86_64 -m 32 -monitor stdio -no-fd-bootchk -hda virtual.img -cdrom cd52.iso -boot d
$ qemu-system-sparc -m 32 -monitor stdio -hda virtual.img -cdrom cd52.iso -boot d
Notes :
xterm
ou équivalent.-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
. qemu-system-ppc*
et qemu-system-sparc*
échoue actuellement avec l'usage des drapeaux malloc J
ou S
$ qemu-img convert -c -O qcow2 virtual.img v.tmp && mv v.tmp virtual.img
Note : Ne pas faire cela pendant que QEMU fonctionne ou utilise le disque virtuel
$ qemu-system-i386 -m 32 -nographic -no-fd-bootchk -hda virtual.img
$ qemu-system-x86_64 -m 32 -nographic -no-fd-bootchk -hda virtual.img
$ qemu-system-sparc -m 32 -nographic -hda virtual.img
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é :
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.
NOTE : Si vous utilisez l'argument -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
.
NOTE : le réseau du mode invité ne supporte pas actuellement IPv6, QEMU se plaindra s'il ne peut pas trouver de serveur DNS, si /etc/resolv.conf
contient seulement des serveurs DNS IPv6.
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):
NOTE : Lors de l'exécution de sessions multiples simultanées sur le même bridge, il faut faire attention car l'adresse MAC du réseau par défaut est 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.
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
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
set tty com0
à l'invite 'boot>'.b.
qemu-system-i386 -nographic .. virtual.img -fda floppy52.fs -boot a
-nographic
. 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.
NOTE : L'arrêt d'OpenBSD fonctionne avec QEMU, ce qui provoque effectivement la sortie de QEMU. C'est une bonne chose, car il n'est actuellement pas possible de définir le périphérique de blocage à partir duquel QEMU est démarré au moment de l'exécution. Par conséquent, si vous démarrez une installation à partir d'un CD-ROM, vous démarrerez toujours à partir d'un CD-ROM chaque fois que vous redémarrerez cette session QEMU jusqu'à ce que vous quittiez et redémarriez QEMU à partir du disque dur virtuel.
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
NOTE : cela présume que l'utilisateur qemu
existe, créez-le ou paramétrez USER=
en lui donnant un utilisateur existant pour utiliser cet exemple.
Contribut(rice|eur)s :