La solution retenue pour les communications réseau entre système hôte et machine virtuelle utilise la fonction TUN/TAP du noyau Linux. Cette solution est utilisée dans toutes les sections suivantes de ce document.
Indépendamment du contexte de la virtualisation, TUN/TAP
est une fonction de réception et de
transmission de paquets entre le noyau et les programmes de
l'espace utilisateur. Cette fonction peut être vue comme une simple
interface point à point ou Ethernet qui, au lieu de recevoir les
paquets d'un média physique, les reçoit du programme de l'espace
utilisateur. De même, cette interface au lieu d'envoyer les paquets
vers un média physique, les transmet au programme de l'espace
utilisateur.
Dans le contexte de ce document, le programme de l'espace
mémoire utilisateur est l'instance virtuelle de système
d'exploitation. L'interface réseau TUN/TAP
devient un canal de communication
réseau entre le système hôte et un système virtualisé. Par
analogie, on peut assimiler ce canal de communication à un cordon
de brassage qui relie le système de commutation de circuit fourni
par le système hôte à l'interface Ethernet du système
virtualisé.
La création d'une interface TAP doit se faire par l'intermédiaire d'un programme de l'espace utilisateur. En fonction des usages, plusieurs outils différents permettent de manipuler ces interfaces. On peut citer tunctl qui fait partie du paquet uml-utilities. L'acronyme UML correspond à User Mode Linux une solution qui permet «d'imbriquer» l'exécution de plusieurs systèmes Linux. On peut aussi citer openvpn qui appartient au paquet éponyme. Il s'agit là de manipuler le tunnel correspondant au réseau virtuel.
Cette section se décompose en deux parties consacrées à la mise en œuvre d'une interface TAP. La première propose une configuration d'interface à partir de la session utilisateur alors que la deuxième propose une configuration permanente au niveau système sur la distribution Debian GNU/Linux.
Configuration manuelle d'une interface TAP
Aujourd'hui, la commande ip du paquet iproute2 est devenue le «couteau suisse» des manipulations réseau. C'est elle que l'on utilise le plus souvent.
La création d'une interface utilise la syntaxe suivante :
$
sudo ip tuntap add mode tap dev tap1 group kvm multi_queue$
ip addr ls tap1 14: tap1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether f6:98:ad:8f:8e:c1 brd ff:ff:ff:ff:ff:ff$
sudo ip link set dev tap1 up$
ip addr ls tap1 14: tap1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000 link/ether f6:98:ad:8f:8e:c1 brd ff:ff:ff:ff:ff:ff
L'utilisation de sudo suppose que les droits aient
été délégués au préalable. Soit l'utilisateur a été intégré au
groupe système %kvm ALL=(ALL) NOPASSWD: /usr/bin/ovs-vsctl, /sbin/ip, /usr/sbin/iotop |
|
L'attribution de l'interface tap1 au groupe système L'option |
|
Pour être utilisable, l'interface tap1 doit être activée. Pour reprendre
l'analogie entre canal de communication mémoire et cordon de
brassage, on peut considérer que la prise réseau dispose d'un
«interrupteur». La commande d'ouverture de cet interrupteur est
symétrique à celle présentée dans la copie d'écran ci-dessus :
|
Configuration système d'une interface TAP
Pour généraliser l'utilisation d'une interface TAP
, il est possible de la paramétrer
directement au niveau système dans le fichier de configuration des
interfaces réseau. Voici un extrait de fichier /etc/network/interfaces
.
auto tap1 iface tap1 inet manual up ip tuntap add mode tap dev $IFACE group kvm multi_queue up ip link set dev $IFACE up down ip link set dev $IFACE down down ip tuntap del mode tap dev $IFACE
À partir de cet exemple, il est possible de créer autant de «cordons de brassage» que nécessaire sur le système hôte.
Pour conclure cette section, on dispose maintenant d'interfaces qui sont utilisées dans la suite du document pour connecter les instances de systèmes virtuels aux ports du commutateur réseau du système hôte.