Qemu

De ArchwikiFR
Révision datée du 23 juillet 2012 à 19:00 par Reventlov (discussion | contributions) (Basique)

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

Qemu existe en 2 versions, qemu et qemu-kvm.

D'un côté, Qemu est un émulateur dans le sens où il n'apporte pas, par défaut, d'accélération matérielle. On peut activer le support de KVM, mais ce dernier est moins abouti que sur qemu-kvm. De plus qemu peut émuler un grand nombre d'architectures. (ppc, arm, mips…)

De l'autre, qemu-kvm ne supporte que les architectures i686 et x86_64 tout en apportant une accélération matérielle vous permettant d'avoir de meilleures performances dans les machines virtuelles. C'est à l'heure actuelle le plus rapide des logiciels de virtualisation complète.

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

Selon votre cas :

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

Pour pouvoir utiliser kvm :

gpasswd -a UTILISATEUR kvm

1. Si votre processeur supporte l'extension Intel VT-x , charger les modules kvm et kvm-intel.

modprobe kvm
modprobe kvm-intel

2. Si votre processeur supporte l'extension AMD AMD-V, charger les modules kvm et kvm-amd.

modprobe kvm
modprobe kvm-amd

Pour activer les extensions dès le démarage ajoutez les dans /etc/rc.conf

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 :

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

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

Fichier: /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 :

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

Fichier: /etc/fstab
none /proc/bus/usb usbfs defaults 0 0
Fichier: /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