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