QEMU (Français)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Tango-preferences-desktop-locale.pngCet article ou section a besoin d'être traduit(e).Tango-preferences-desktop-locale.png

Notes: Cet article ne respecte pas la structure de sa version anglophone, merci de le réécrire en conséquence. Vous pouvez aussi ajouter à la version anglophone les informations à-jour et dignes d’intérêt qui ne seraient portées que par la version francophone. Voir Archwiki:Translation_Team_(Français) (Discuss in Talk:QEMU (Français)#)

QEMU est un logiciel de virtualisation, au même titre que VirtualBox ou vmware.

Il existe plusieurs interfaces graphiques comme qemu-launcher, qemulator, qtemu ou encore qemudo.

Installation

Il existe un paquet pour qemu, qemu.

Pour savoir si votre machine est capable d'utiliser KVM :

egrep '(vmx|svm)' /proc/cpuinfo

Si vous avez une réponse, votre cpu est compatible (selon le fabricant, il se peut que cette option soit activable depuis le bios).

pacman -S qemu
Note: Pour lancer qemu avec l'option kvm : qemu -enable-kvm ...

Pour pouvoir utiliser kvm :

gpasswd -a UTILISATEUR kvm

Les modules kvm et kvm-intel/kvm-amd doivent être chargés. Ceci est normalement fait automatiquement, sinon, reportez vous à la page traitant des modules du noyau.

Utilisation

Basique

Création d'un disque dur virtuel qemu.img d'une taille de 1,5 Go :

qemu-img create qemu.img 1500M

Lancement de la machine virtuelle (exemple sur une architecture x86_64):

qemu-system-x86_64 -k fr -m 400 -hda qemu.img -boot d -cdrom cd.iso -net nic -net user

Descriptions des options :

  • -k fr : clavier français
  • -m 400 : spécifie la quantité de RAM
  • -hda : l'image à utiliser comme disque dur
  • -boot d : boot sur le cd
  • -cdrom : l'iso à utiliser
  • -net nic : crée une interface réseau
  • -net user : user mode networking, le dhcp et la passerelle sont émulés. Il suffit de lancer un client dhcp pour avoir accès au réseau internet de la machine hôte (en NAT). (Note: cela ne fonctionne qu'avec les protocoles tcp et udp, donc, ICMP, et par conséquent ping ne fonctionneront pas)
Astuce: Pour un système en 32 bits, la commande à utiliser est : qemu-system-i386.

Réseau accessible

L'option -net user est très conviviale, mais si on veut pouvoir y accéder depuis l'hôte :

On installe les outils et on crée une interface tap :

pacman -S uml_utilities
tunctl -u votre utilisateur -t tap0
ifconfig tap0 192.168.0.1 netmask 255.255.255.0 up

On lance la machine virtuelle :

qemu-system-x86_64 -k fr -usb -m 400 -hda qemu.img -boot d \
     -cdrom cd.iso -net nic -net tap,ifname=tap0,script=no

Et depuis l'invité :

ifconfig interface_machine_virtuelle 192.168.0.10 netmask 255.255.255.0 up
Astuce: Maintenant on peut se connecter par ssh à la machine virtuelle, avec -nographic ça devient vraiment agréable.

Utilisation de ponts

Maintenant on veut plusieurs qemu et qu'ils communiquent ensemble. Pour cela on va créer un pont.

pacman -S bridge-utils

Dans l'ordre on va créer une seconde interface pour une seconde machine virtuelle.

tunctl -u mon user -t tap1

Créer une interface de pontage ethernet virtuelle, et lui donner une ip :

brctl addbr br0
ifconfig br0 192.168.0.1 up

Attacher à l'interface de pontage virtuelle br0 tap0 et tap1 :

brctl addif br0 tap0
brctl addif br0 tap1

Veillez à ce que tap0 et tap1 n'aient pas d'IP et qu'elles soient actives :

ifconfig tap0 0.0.0.0 promisc up
ifconfig tap1 0.0.0.0 promisc up

On lance les machines virtuelles comme suit :

qemu disk1.img -net nic -net tap,ifname=tap0,script=no
qemu disk2.img -net nic -net tap,ifname=tap1,script=no

/etc/qemu-ifup

L'option script=no dans les commandes précédentes indique à qemu de ne pas lancer le script de configuration de l'interface réseau. Par défaut ce script est /etc/qemu-ifup. Nous pouvons l'utiliser pour automatiser quelques tâches :

/etc/qemu-ifup
#!/bin/sh

echo "Activation de l'interface $1"
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
echo "Ajout de $1 à br0..."
sudo /usr/sbin/brctl addif br0 $1
sleep 2
chmod +x /etc/qemu-ifup

Pour faciliter un peu plus :

qemu.sh
#!/bin/sh
IFACE=$(sudo tunctl -b -u $USER)
qemu-kvm -k fr -m 400 -net nic -net tap,ifname="$IFACE",downscript=no "$@"
sudo tunctl -d $IFACE &> /dev/null

En le plaçant dans un dossier dans le $PATH et après un :

chmod +x qemu.sh

Il ne reste plus qu'à lancer les machines avec :

qemu.sh disk.img

VDE

VDE[dead link 2021-11-15 ⓘ] est un réseau virtuel compatible ethernet pouvant s'adosser à un réseau physique.

VDE permet de se passer des privilèges root pour utiliser des machines virtuelles connectées entre elles et/ou au réseau.

pacman -S vde2

Il faut néanmoins préparer le terrain en root :

vde_switch -tap tap0 -daemon -mod 660 -group kvm

Pour pouvoir communiquer avec l'hôte :

ifconfig tap0 192.168.2.1 netmask 255.255.255.0 up

Pour pouvoir accéder au réseau extérieur :

sysctl net.ipv4.ip_forward=1 # -w pour sauvegarder

Pour pouvoir utiliser plusieurs invités :

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

(en supposant que eth0 est votre interface connectée à l'extérieur)

Une fois le terrain préparé, il n'y a plus qu'à lancer en utilisateur :

qemu -net nic -net vde disk1.img

Pour lancer une n-ième machine, il faut modifier l'adresse MAC pour ne pas avoir de conflit :

qemu -net nic,macaddr=52:54:00:12:01:00 -net vde disk2.img
Note: Depuis la doc KVM, un moyen assez simple de générer une adresse MAC aléatoire :
printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256))

USB

Pour activer l'émulation de l'usb sous qemu :

qemu -usb ...

qemu utilise l'arborescence /proc/bus/usb, pour la rendre disponible, il faut d'abord monter le répertoire :

mount -t usbfs none /proc/bus/usb

Par défaut, l'utilisateur n'a pas accès à cette arborescence, il existe plusieurs possibilités pour y accèder, la plus rapide étant de lancer en root :

chown -R utilisateur /proc/bus/usb

Pour une utilisation régulière, vous pouvez rajouter le montage à /etc/fstab et une règle udev pour donner l'accès au groupe kvm par exemple :

/etc/fstab
none /proc/bus/usb usbfs defaults 0 0
/etc/udev/rules.d/95-perso.rules

SUBSYSTEM=="usb", MODE="0664", GROUP="kvm"

Si vous avez déjà monté le répertoire, sans redémarrer, vous pouvez lancer :

udevadm trigger && udevadm settle

Dans un console QEMU Ctrl+Alt+2 :

info usbhost
   Device 1.2, speed 480 Mb/s
   Class 00: USB device 1234:5678, USB DISK

Pour passer le contrôle d'un périphérique à la machine émulée :

usb_add host:1234:5678

À chaque retrait/ajout de périphérique, il faut refaire la manipulation.

Vous pouvez aussi lancer qemu avec :

qemu -usb -usbdevice host:1234:5678 [...]

En vrac

  • Ctrl+Alt désactive la capture du clavier/souris,
  • Ctrl+Alt+f plein écran,
  • Ctrl+Alt+1 (ou 2-9) les consoles de QEMU.
  • Ctrl+Alt+a h l'aide QEMU en -nographic
  • Activer le port série de la machine émulée pour une utilisation avec -nographic