Sur les systèmes GNU/Linux, il existe une grande variété de solutions d'interconnexion réseau entre système hôte et systèmes virtuels. Il se trouve justement que l'interconnexion réseau est la préoccupation principale du site inetdoc. Il est donc essentiel de choisir les outils qui offrent le maximum de fonctionnalités. Le commutateur virtuel occupe une place essentielle dans une solution de virtualisation moderne.
Cette section présente la configuration du commutateur virtuel Open vSwitch. Ce commutateur comprend une partie noyau ainsi que des processus dans l'espace utilisateur. La partie noyau exploite la partie commutation de circuit de celui-ci. Dans le jargon, cette partie est connue sous le nom de Forwarding plane ou encore Forwarding Information Base (FIB). Côté espace utilisateur, on trouve les outils de configuration tels que ovs-vsctl et plusieurs démons de gestion des ports et des VLANs. Il faut ajouter que cet outil exploite les fonctions de routage (commutation de paquets) déjà présentes dans le noyau Linux.
Open vSwitch est une pièce maîtresse des architectures d'interconnexion de systèmes virtualisés. Il est présent dans la plupart des solutions intégrées de la famille du Software-defined networking. L'intégration sort du champ couvert par ce guide. On se contente ici de présenter le fonctionnement du commutateur virtuel à l'échelle unitaire. La topologie minimaliste présentée dans la suite correspond à la vue ci-dessous.
Tableau 1. Plan d'adressage de la topologie étudiée
Système | Interface | Adresse IPv4 | Rôle |
---|---|---|---|
Machine virtuelle | eth0 | 203.0.113.130/26 |
Interface réseau de la machine virtuelle |
Système hôte | sw0-vlan2 | 203.0.113.129/26 |
Passerelle par défaut de la machine virtuelle |
Système hôte | eth0 | 203.0.113.2/26 |
Interface réseau du système hôte |
Routeur | indéfinie | 203.0.113.1/26 |
Passerelle par défaut du système hôte |
Installation du commutateur
L'installation du paquet openvswitch-switch comprend la configuration système des outils et des démons de gestion de la configuration du commutateur. Voici quelques éléments relevés après l'installation du paquet.
-
Paquets installés
$
aptitude search ~iopenvswitch i A openvswitch-common - Open vSwitch common components i openvswitch-switch - Open vSwitch switch implementations -
Partie noyau
$
lsmod | grep openvswitch openvswitch 63837 0 vxlan 30915 1 openvswitch gre 12957 1 openvswitch libcrc32c 12426 1 openvswitch -
Démons de l'espace utilisateur
$
pstree init─┬─acpid ├─atd ├─cron ├─dbus-daemon ├─exim4 ├─6*[getty] ├─ovs-vswitchd───ovs-vswitchd───ovs-vswitchd ├─ovsdb-server───ovsdb-server ├─rsyslogd───3*[{rsyslogd}] └─udevd -
État de la configuration
$
sudo ovs-vsctl show cd95ab0d-643d-4a23-bae3-2e6c900a367f ovs_version: "1.9.3"
Configuration du commutateur
Pour configurer l'interconnexion présentée en début de section, on doit passer par les étapes suivantes.
-
Création du commutateur
sw0
$
sudo ovs-vsctl add-br sw0 -
Création de l'interface réseau pour le VLAN numéro
2
$
sudo ovs-vsctl add-port sw0 sw0-vlan2 tag=2 -- set Interface sw0-vlan2 type=internal -
Création du «cordon de brassage»
tap2
$
sudo ip tuntap add mode tap dev tap2 group kvm -
Raccordement du «cordon de brassage»
tap2
au commutateur et affectation du port correspondant au VLAN numéro2
$
sudo ovs-vsctl add-port sw0 tap2 tag=2 -
Visualisation de la configuration
$
sudo ovs-vsctl show cd95ab0d-643d-4a23-bae3-2e6c900a367f Bridge "sw0" Port "sw0-vlan2" tag: 2 Interface "sw0-vlan2" type: internal Port "tap2" tag: 2 Interface "tap2" Port "sw0" Interface "sw0" type: internal ovs_version: "1.9.3"
Modes accès ou trunk ? | |
---|---|
Sur un commutateur Open vSwitch un
port est par défaut en mode trunk ; c'est à dire qu'il reçoit le
trafic de tous les VLANs
«présents sur les autres ports». Dans l'exemple présenté ici, on
restreint l'utilisation des ports liés aux interfaces |
Activation des interfaces réseau et du routage
Pour que la configuration du commutateur soit effective, il faut que toutes les nouvelles interfaces réseau soient actives. De plus, on doit s'assurer que la fonction de routage est activée sur le système hôte.
-
Activation des interfaces
$
for intf in sw0 sw0-vlan2 tap2; do sudo ip link set dev $intf up; done -
État des interfaces sur le système hôte
$
ip link ls 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN \ mode DEFAULT group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP \ mode DEFAULT group default qlen 1000 link/ether ba:ad:00:ca:fe:00 brd ff:ff:ff:ff:ff:ff 4: sw0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN \ mode DEFAULT group default link/ether 16:8f:91:2c:e0:41 brd ff:ff:ff:ff:ff:ff 5: sw0-vlan2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN \ mode DEFAULT group default link/ether 8e:2a:a2:ff:d9:fb brd ff:ff:ff:ff:ff:ff 6: tap2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master sw0 state UP \ mode DEFAULT group default qlen 500 link/ether 46:12:48:6b:be:d4 brd ff:ff:ff:ff:ff:ff
La fonction de routage fournie par le noyau Linux peut être
activée via le fichier /etc/sysctl.conf
. Il suffit de décommenter les
entrées correspondantes. Pour appliquer les paramètres définis dans
le fichier on utilise l'instruction
. On peut vérifier les paramètres en n'affichant
que les lignes actives de ce même fichier.$
sudo sysctl
-p
$
egrep -e '(^$|^#)' -v /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv4.conf.all.log_martians = 1
Lancement du système virtuel
Comme dans le cas de la Section 8,
« Communications réseau en mode utilisateur », on
utilise une script qui rassemble toutes les options de
configuration utiles : ovs-startup.sh
. Le code de ce script est donné en
Section A.2, « Communication réseau avec commutateur
virtuel Open vSwitch ». La copie d'écran ci-dessous
correspond à la topologie minimale
décrite plus haut.
:~/vm$
./scripts/ovs-startup.sh vm0-debian-testing-amd64-base.raw 1024 2
~> Machine virtuelle : vm0-debian-testing-amd64-base.raw
~> Port SPICE : 5902
~> Mémoire RAM : 1024
~> Adresse MAC : ba:ad:00:ca:fe:02
Les options de ce script relatives aux fonctions réseau sont les suivantes :
-device virtio-net,netdev=net0,mac="$macaddress" \ -netdev tap,ifname=tap$tapnum,id=net0,script=no \
Le pilote d'interface réseau choisi utilise les fonctions présentées à la Section 4, « KVM et VIRTIO ». |
|
L'identifiant de l'interface utilisé pour le script est
|
|
L'adresse MAC de l'interface réseau est déterminée à partir du préfixe hexadécimal bad cafe et du numéro de l'interface TAP. macaddress="ba:ad:00:ca:fe:`printf "%02x" $tapnum`" |
|
Le raccordement de l'interface réseau identifiée par l'étiquette
|
Validation des communications entre système hôte et système virtuel
Pour conclure cette section, on peut valider le lien direct entre les système hôte et virtuel avec une connexion SSH. On commence par identifier l'adresse MAC au format EUI64 du système virtuel puis on l'utilise pour la connexion.
$
ip nei ls fe80::b8ad:ff:feca:fe02 dev sw0-vlan2 lladdr ba:ad:00:ca:fe:02 STALE fe80::503c:b3ff:febe:b94b dev eth0 lladdr 52:3c:b3:be:b9:4b router REACHABLE$
ssh etu@fe80::b8ad:ff:feca:fe02%sw0-vlan2 etu@fe80::b8ad:ff:feca:fe02%sw0-vlan2's password: Linux nested-vm0 3.12-1-amd64 #1 SMP Debian 3.12.6-2 (2013-12-29) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. No mail. Last login: Thu Jan 23 20:10:50 2014 from fe80::8c2a:a2ff:feff:d9fb%eth0etu@vm0:~$
Vue du système virtuel avec la configuration IP complète, on obtient les informations suivantes.
$
ip nei ls fe80::8c2a:a2ff:feff:d9fb dev eth0 lladdr 8e:2a:a2:ff:d9:fb router DELAY 203.0.113.129 dev eth0 lladdr 8e:2a:a2:ff:d9:fb STALE$
ip addr ls 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP \ group default qlen 1000 link/ether ba:ad:00:ca:fe:02 brd ff:ff:ff:ff:ff:ff inet 203.0.113.130/26 brd 203.0.113.191 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::b8ad:ff:feca:fe02/64 scope link valid_lft forever preferred_lft forever$
ip ro ls default via 203.0.113.129 dev eth0 203.0.113.128/26 dev eth0 proto kernel scope link src 203.0.113.130