mardi 6 mars 2007, par
QEMU permet d’executer des machines virtuelles sur une machine physique : Définition de Wikipedia
il est possible d’utiliser le réseau dans qemu de différentes manières :
User mode network
TAP network interfaces
C’est le méthode la plus simple pour accéder au web. Il ne nécessite pas les privilèges de root. Inconvénient : La machine hôte ne peut pas accéder aux ressources de la machine virtuelle.
Dans ce cas, il n’y a rien de spécial à faire, qemu se comporte comme une passerelle/pare-feu et, si l’accès à internet est configuré sur la machine hôte, le web sera aussi disponible pour la machine cliente.
Un service DHCP (propre à qemu) attribuera automatiquement une adresse IP à la machine cliente et lui fournira les adresses de la passerelle et du serveur DNS.
Sur la machine cliente, il faudra activer DHCP client (attribuer automatiquement une adresse IP). Il est possible aussi d’utiliser une IP statique. Il faudra dans ce cas renseigner :
Passerelle par défaut : 10.0.2.2
Masque de réseau : 255.255.255.0
Serveur DNS : 10.0.2.3
qemu -hda qemu_xp.img -net user
Permet de créer une interface virtuelle sur notre machine hôte qui se nommera tapN (tap0, tap1, ...). Cette interface pourra être utilisée pour créer un routage de type NAT ou bien un accès direct sur le réseau (bridged).
1-Activer l’interface tap :
Dans tous les cas (Host-only, NAT ou bridged), il faudra activer une interface tapN.
l’utilitaire tunctl est nécessaire. Une fois installé, ouvrir le fichier /etc/udev/permissions.d/50-udev.permissions et modifier la ligne qui concerne le device tun :
tun:root:root:0666
sur une mandriva, il faudra modifier le fichier /etc/udev/rules.d/50-mdk.rules :
KERNEL=="tun", SYMLINK+="net/%k", , MODE="0666"redémarrer udev et charger le module :
/etc/init.d/udev restart
modprobe tunvérifier que ce module est bien chargé :
lsmod | grep tun
tun 8864 0vérifier que ce module est accesible en lecture/écriture pour tous :
ls -l /dev/tun
crw-rw-rw- 1 root root 10, 200 fév 27 10:20 /dev/tunqemu a besoin d’un script qui permet de créer l’interface tap. Ce script est automatiquement executé par qemu dans le mode TAP network. Le script sera différent selon qu’on utilise le mode Host-only, NAT ou bridged (vous trouverez des exemples spécifiques ci-dessous). Il faudra rendre ce script executable :
chmod 755 /etc/qemu-ifupPour que ce script fonctionne, il faut que l’utilisateur normal ait le droit d’executer les commandes qui sont invoquées dans le script. Il faudra donc modifier le fichier /etc/sudoers.
Exemple de fichier sudoers qui fonctionnera pour tous les types de réseau (Host-only,NAT ou Bridged) :
Cmnd_Alias QEMU=/sbin/ifconfig, /sbin/modprobe, /usr/bin/tunctl, /usr/sbin/brctl, /sbin/ip, /sbin/dhclient
daniel ALL=NOPASSWD: QEMUVous pourrez adapter ce fichier à votre configuration (chemins, executables nécessaires, utilisateurs, ...).
2-Host-only :

Dans ce mode, la machine virtuelle a accès uniquement à la machine hôte.
exemple du fichier /etc/qemu-ifup dans le mode Host-only :
#!/bin/sh
echo "Configure $1 interface..."
sudo -p "Password for $0:" /usr/bin/tunctl -u 'daniel' -t $1
echo "Activating link for $1..."
sudo -p "Password for $0:" /sbin/ip link set $1 up
echo "IP address on $1..."
sudo -p "Password for $0:" /sbin/ifconfig $1 192.168.2.1 broadcast 192.168.2.255 netmask 255.255.255.0
echo "Done."Adapter ce script à votre configuration (chemins, nom d’utilisateur, adresse réseau désirée, ...).
Et maintenant testez votre réseau :
qemu -hda qemu_xp.img -net nic -net tap
Configure tap0 interface...
Activating link for tap0...
IP address on tap0...
Done.Vous pouvez vérifier qu’une nouvelle interface réseau a bien été créée :
ifconfig
tap0 Link encap:Ethernet HWaddr FA:0B:C9:B1:AC:21
inet adr:192.168.2.1 Bcast:192.168.2.255 Masque:255.255.255.0
adr inet6: fe80::f80b:c9ff:feb1:ac21/64 Scope:Lien
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:500
RX bytes:0 (0.0 b) TX bytes:432 (432.0 b)Il faudra aussi configurer le réseau sur la machine cliente, par exemple 192.168.2.2.
3-NAT :

La configuration est identique au mode Host-only sauf qu’en plus, il faut configurer une passerelle sur notre machine hôte.
Cela se résume à activer le forward de paquets IP (transfert des paquets) et activer le masquerading (masquage des paquets IP) :
Activer le forwarding :
Tout simplement en tapant cette commande :
echo "1" >> /proc/sys/net/ipv4/ip_forwardPour qu’il soit activé à chaque démarrage (sur une mandriva), ajouter dans le fichier /etc/sysconfig/network :
FORWARD_IPV4=true
Activer le masquerading :
Il faut ajouter une règle iptables à la table NAT :
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEla configuration réseau de la machine cliente devra être modifiée, Dans notre exemple :
Adresse IP : 192.168.2.2
Masque : 255.255.255.0
passerelle par défaut : 192.168.2.1
4-Bridged :

Dans ce mode, notre machine virtuelle a accès directement au LAN. L’utilitaire brctl est nécessaire pour créer un bridge et doit-être installé.
Le principe consiste à configurer les interfaces eth0 et tap0 en mode promiscuite (c’est à dire qu’elles écoutent tout, même ce qui ne les concerne pas) et de les rajouter dans le bridge br0.
exemple du fichier /etc/qemu-ifup dans le mode Bridged :
#!/bin/sh
INTERFACE_LAN=eth0
INTERFACE_BRIDGE=br0
echo "Configure $1 interface..."
sudo -p "Password for $0:" /usr/bin/tunctl -u 'daniel' -t $1
echo "Activating link for $1..."
sudo -p "Password for $0:" /sbin/ip link set $1 up
sleep 1
echo "Configure $INTERFACE_BRIDGE bridge..."
sudo -p "Password for $0:" /usr/sbin/brctl addbr $INTERFACE_BRIDGE
sudo -p "Password for $0:" /usr/sbin/brctl addif $INTERFACE_BRIDGE $1
sudo -p "Password for $0:" /usr/sbin/brctl addif $INTERFACE_BRIDGE $INTERFACE_LAN
echo "Activating promiscuous mode on $1 and $INTERFACE_LAN..."
sudo -p "Password for $0:" /sbin/ifconfig $1 0.0.0.0 promisc up
sudo -p "Password for $0:" /sbin/ifconfig $INTERFACE_LAN 0.0.0.0 promisc up
sleep 2
echo "IP address on $INTERFACE_BRIDGE..."
# static
sudo -p "Password for $0:" /sbin/ifconfig $INTERFACE_BRIDGE 192.168.1.1 broadcast 192.168.1.255 netmask 255.255.255.0
# or dhcp
# sudo -p "Password for $0:" /sbin/dhclient br0
echo "Done."On teste notre réseau :
qemu -hda qemu_xp.img -net nic -net tap
la commande ifconfig affiche maintenant 3 interfaces (eth0, tap0 et br0) :
br0 Link encap:Ethernet HWaddr 00:0D:87:F3:06:4F
inet adr:192.168.1.1 Bcast:192.168.1.255 Masque:255.255.255.0
adr inet6: fe80::20d:87ff:fef3:64f/64 Scope:Lien
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:323402 errors:0 dropped:0 overruns:0 frame:0
TX packets:130299 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:0
RX bytes:156816836 (149.5 MiB) TX bytes:16901096 (16.1 MiB)
eth0 Link encap:Ethernet HWaddr 00:0D:87:F3:06:4F
adr inet6: fe80::20d:87ff:fef3:64f/64 Scope:Lien
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:321695 errors:0 dropped:0 overruns:0 frame:4066
TX packets:244189 errors:0 dropped:0 overruns:0 carrier:19
collisions:40108 lg file transmission:1000
RX bytes:149447785 (142.5 MiB) TX bytes:50003105 (47.6 MiB)
Interruption:20
tap0 Link encap:Ethernet HWaddr CE:86:70:8A:95:6E
adr inet6: fe80::cc86:70ff:fe8a:956e/64 Scope:Lien
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:500
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)Il faudra ensuite configurer le réseau de notre machine virtuelle :
Adresse IP : 192.168.1.2
Masque : 255.255.255.0
Notre machine virtuelle a maintenant accès à notre LAN comme si nous utilisions une machine physique !
Notre script modifie la configuration du réseau sur notre machine hôte. Il est souhaitable de tout reconfigurer lors de l’arrêt de notre machine virtuelle. Pour cela, il suffit de créer un script qui executera qemu et réinitialisera notre réseau lorsque l’execution de qemu sera terminée. par exemple, nous pouvons créer un fichier run_qemu.sh :
#!/bin/bash
INTERFACE_LAN=eth0
INTERFACE_BRIDGE=br0
# start qemu
echo "Start qemu ..."
qemu -hda ~/images_qemu/qemu_xp.img -net nic -net tap
sleep 2
# on desactive le bridge
echo "Deleting bridge ..."
sudo -p "Password for $0:" /sbin/ifconfig $INTERFACE_BRIDGE down
sleep 1
# on supprime le bridge
sudo -p "Password for $0:" /usr/sbin/brctl delbr $INTERFACE_BRIDGE
echo "Stop promiscuous mode ..."
# on supprime le mode promiscuite
sudo -p "Password for $0:" /sbin/ifconfig $INTERFACE_LAN -promisc down
sleep 1
# on reconfigure l'interface eth0
echo "IP address on $INTERFACE_LAN ..."
# static
sudo -p "Password for $0:" /sbin/ifconfig $INTERFACE_LAN 192.168.1.1 broadcast 192.168.1.255 netmask 255.255.255.0
# or dhcp
# sudo -p "Password for $0:" /sbin/dhclient eth0
echo "Done."Rendre executable :
chmod 755 run_qemu.sh
Execution du script jusqu’à l’arrêt de notre machine virtuelle :
./run_qemu.sh
Start qemu ...
Configure tap0 interface...
Activating link for tap0...
Configure br0 bridge...
Activating promiscuous mode on tap0 and eth0...
IP address on br0...
Done.
Deleting bridge ...
Stop promiscuous mode ...
IP address on eth0 ...
Done.Comme nous l’avons vu, il est très simple d’accéder à internet via notre machine virtuelle en executant qemu en User mode network. Ce mode convient bien à une utilisation classique du web (surf, messagerie,...).
Par contre si l’on désire avoir accès à des services plus avancés (comme par exemple joindre un domaine NT), on sera obligé d’utiliser le mode bridged.
Voir aussi :
j’émule, tu émules, il émule...
qemu-launcher, ou comment utiliser Qemu simplement
Si vous avez des commentaires ou vous constatez des omissions, n’hésitez pas à me contacter.
20/03/2007