# QEMU (Français)

From ArchWiki
Jump to navigation Jump to search
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.

Related articles

- Category:Hypervisors
- Libvirt
- QEMU/Guest graphics acceleration
- PCI passthrough via OVMF

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

Categories:

- Emulation (Français)
- Hypervisors (Français)