Outils pour utilisateurs

Outils du site


system:emulators:qemu

QEMU

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.

Documentation

  • Lire le fichier pkg-readme : /usr/local/share/doc/pkg-readmes/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.
  • qemu-system-ppc* et qemu-system-sparc* échoue actuellement avec l'usage des drapeaux malloc J ou S

Compressez le disque virtuel

$ 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

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.

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.

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

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.

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.

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.

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

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 :

pengouinpdt
system/emulators/qemu.txt · Dernière modification: 2020/08/27 03:48 de pengouinpdt