Ce fichier est le script d'initialisation des interfaces réseau pour les conteneurs *Systemd-nspawn* que j'ai écrit.
# Usage
Les fichiers *ifup.sh* et *ifdown.sh* sont les scripts de gestion des *VLAN* pour les conteneurs [Systemd-nspawn](https://doc.ycharbi.fr/index.php/Conteneurs_-_systemd) écrit par mes soins. Ils se bases sur la technologie de [filtrage des *VLAN*](https://doc.ycharbi.fr/index.php/Vlan_-_linux) du noyau *Linux*.
* *ifup.sh* permet la création et le placement d'une interface réseau dans un *VLAN* ou dans un tronc *802.1Q*. Il se charge également de l'intégrer à un pont spécifique (l'existence préalable de ce dernier est requise)
* *ifdown* se charge de supprimer les interfaces créées par *Systemd-nspawn* après l'extinction du conteneur
Afin qu'ils s'exécutent au démarrage et à l'arrêt d'un conteneur, il faut [modifier](https://philip-trauner.me/blog/post/machinectl-autologin) le service `systemd-nspawn@.service` pour y ajouter les directives adéquates (notez l'emplacement des fichiers) :
Il gère la création de plusieurs interfaces réseau ainsi que les VLAN et peut mettre ces interfaces dans des ponts différents. Afin qu'il s'exécute au démarrage d'un conteneur, il faut ajouter à la directive *[Service]* du fichier */lib/systemd/system/systemd-nspawn@.service* le paramètre suivant:
``` bash
systemctl edit systemd-nspawn@.service
```
Collez-y le contenu suivant. Ceci aura pour effet de créer le fichier `/etc/systemd/system/systemd-nspawn@.service.d/override.conf` qui persistera aux mises à jour du paquet *systemd-container*.
*Note : j'ai également retiré le `-U` des paramètres d'initialisation, d'où les deux `ExecStart=` (le premier, vide, permettant de réinitialiser la valeur par défaut). Ceci correspond à un besoin personnel et est facultatif.*
Il faut au préalable ajouter deux lignes de commentaires au dessus de chaque directive "*Interface=*" dans le fichier de configuration de votre conteneur:
``` bash
Pour configurer les interfaces réseaux d'un conteneur, il faut ajouter deux lignes de commentaires **au dessus** de chaque directive `Interface=` dans le [fichier de configuration](https://doc.ycharbi.fr/index.php/Conteneurs_-_systemd#Fichier_de_configuration) de celui-ci.
Pour une interface non étiqueté :
``` ini
PONT=votrepont
VLAN=vid
```
Le script vérifie que ce que vous avez renseigné est valide. Si non, il ne fait rien. Le fichier "*apache1.nspawn*" est un exemple (se trouve dans */etc/systemd/nspawn/* sur le système de test).
Pour tester le script sans créer les interfaces, veillez remplacer les lignes d'initialisation du tableau *commandes_a_executer[]* de la fonction *generCmdIntRzo()* par les lignes suivantes:
Pour une interface de tronc 802.1Q :
``` ini
PONT=votrepont
8021Q=vid1,vi2,vid3
```
Il est possible de mixer les notions au travers de plusieurs interfaces comme dans l'exemple suivant (fichier `/etc/systemd/nspawn/web.nspawn`) :
``` ini
[Network]
#PONT=br0
#VLAN=100
Interface=web_100
#PONT=br0
#VLAN=121
Interface=web_121
#PONT=br0
#8021Q=5,210
Interface=web_T1
#PONT=br0
#8021Q=181,1109
Interface=web_T2
```
Le script vérifie que ce que vous avez renseigné est valide. S'il rencontre la moindre erreur, il s'interrompt sans modifier le système et vous oriente sur le problème.
:warning: *J'attire votre attention sur le fait que l'ajout, en cours de fonctionnement, de directives `Interface=` dans le ficher de configuration de votre conteneur a pour effet de neutraliser l'exécution d'*ifdown.sh*. Ceci est intrinsèque à la façon dont il fonctionne. Les interfaces créées par *ifup.sh* devront alors êtres supprimées manuellement.* :warning:
# Tests sans altérations
Si vous voulez modifier les scripts, il peut être pratique d'afficher les commandes générées au lieu de les appliquer lors de vos tests. Pour ce faire, vous pouvez ajouter la commande `echo` devant l'action d'exécution comme suit dans la fonction `execCmdIntRzo()` :
``` bash
commandes_a_executer+=( "echo \"ip link add ${interface} type veth peer name ${interface}_h\"" )
commandes_a_executer+=( "echo \"ip link set ${interface}_h up\"" )
commandes_a_executer+=( "echo \"ip link set ${interface}_h master ${pont}\"" )
commandes_a_executer+=( "echo \"bridge vlan del dev ${interface}_h vid 1 PVID untagged master\"" )
commandes_a_executer+=( "echo \"bridge vlan add dev ${interface}_h vid ${vlan} pvid untagged master\"" )