9. Fonction TUN/TAP du noyau Linux

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 :

$ sudo1 ip tuntap add mode tap dev tap1 group kvm multi_queue2

$ 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 up3

$ 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

1

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 sudo, soit il dispose d'une délégation plus précise relative aux outils réseau. À titre d'exemple, le fichier /etc/sudoers peut contenir une ligne du type suivant qui autorise tous les membres du groupe kvm à utiliser trois commandes utiles :

%kvm ALL=(ALL) NOPASSWD: /usr/bin/ovs-vsctl, /sbin/ip, /usr/sbin/iotop

2

L'attribution de l'interface tap1 au groupe système kvm est importante. En effet, c'est l'appartenance à ce groupe qui donne accès aux ressources liées à la virtualisation. Dans l'exemple, l'interface créée pourra être utilisée lors de l'initialisation du processus utilisateur correspondant au système virtuel.

L'option multi_queue autorise l'utilisation de plusieurs descripteurs de fichiers pour une même interface. Il est ainsi possible de paralléliser l'émission ou la réception de paquets.

3

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 : $ sudo ip link set dev tap1 down.

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.