Ajout du support des interfaces physiques + mise à jour de la documentation

master
ycharbi 3 years ago
parent f8dd00e706
commit 20311f0d13

@ -1,9 +1,9 @@
# Usage # 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*. Les fichiers *ifup.sh* et *ifdown.sh* sont les scripts de gestion des interfaces réseaux supportant les *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) * *ifup.sh* permet l'attribution d'une interface physique à un conteneur ainsi que la création et le placement d'une interface réseau virtuelle 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 * *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) : 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 scripts dans l'exemple) :
``` bash ``` bash
systemctl edit systemd-nspawn@.service systemctl edit systemd-nspawn@.service
@ -14,26 +14,24 @@ Collez-y le contenu suivant. Ceci aura pour effet de créer le fichier `/etc/sys
``` ini ``` ini
[Service] [Service]
ExecStartPre=/etc/systemd/nspawn/ifup.sh %i ExecStartPre=/etc/systemd/nspawn/ifup.sh %i
ExecStart=
ExecStart=systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --network-veth --settings=override --machine=%i
ExecStopPost=/etc/systemd/nspawn/ifdown.sh %i ExecStopPost=/etc/systemd/nspawn/ifdown.sh %i
``` ```
*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.*
Pour configurer les interfaces réseaux d'un conteneur, il faut :
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 virtuelle : 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 physique : utiliser la directive `Interface=` de façon [normale](https://www.freedesktop.org/software/systemd/man/systemd.nspawn.html#Interface=) en veillant à ne pas avoir l'une des deux lignes de commentaire dans les deux lignes au dessus de celle-ci
Pour une interface non étiqueté : Pour une interface non étiqueté :
``` ini ``` ini
PONT=votrepont #PONT=votrepont
VLAN=vid #VLAN=vid
``` ```
Pour une interface de tronc 802.1Q : Pour une interface de tronc 802.1Q :
``` ini ``` ini
PONT=votrepont #PONT=votrepont
8021Q=vid1,vi2,vid3 #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`) : Il est possible de mixer les notions au travers de plusieurs interfaces comme dans l'exemple suivant (fichier `/etc/systemd/nspawn/web.nspawn`) :
@ -48,16 +46,18 @@ Interface=web_121
#PONT=br0 #PONT=br0
#8021Q=5,210 #8021Q=5,210
Interface=web_T1 Interface=web_T1
Interface=eth2
#PONT=br0 #PONT=br0
#8021Q=181,1109 #8021Q=181,1109
Interface=web_T2 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. 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. En utilisation avec un conteneur, les messages de retour du script sont visibles dans le journal du service via `systemctl status systemd-nspawn@votreConteneur.service` ou `journalctl -xe`.
: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: :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 # 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()` : 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 se faire, vous pouvez ajouter la commande `echo` devant l'action d'exécution comme suit (et comme précisé en commentaire dans le script) dans la fonction `execCmdIntRzo()` (le script exige un nom de conteneur en paramètre) :
``` bash ``` bash
echo ${commandes_a_executer["${id_commande_rzo}"]} echo ${commandes_a_executer["${id_commande_rzo}"]}

@ -29,7 +29,10 @@ recupParams(){
# Récupération des données d'après le fichier de configuration # Récupération des données d'après le fichier de configuration
if [ "${nom_param}" == "Interface" ]; then if [ "${nom_param}" == "Interface" ]; then
if [[ $(ip link show "${val_param}" 2> /dev/null) ]]; then if [[ $(ls /run/network/ | sed -e "s/ifstate//g" -e "s/^.//" -e "/^$/d" -e "/^lo$/d" | grep "${val_param}" 2> /dev/null) ]]; then
interface="${val_param}"
interface_init=0
elif [[ $(ip link show "${val_param}" 2> /dev/null) ]]; then
interface="${val_param}" interface="${val_param}"
interface_init=1 interface_init=1
else else

@ -46,7 +46,7 @@ recupParams(){
nb_params="${#params_int[*]}" nb_params="${#params_int[*]}"
for ((id_param_fichier=0 ; "${nb_params}" - "${id_param_fichier}" ; id_param_fichier++)); do for ((id_param_fichier=0 ; "${nb_params}" - "${id_param_fichier}" ; id_param_fichier++)); do
nom_param=$(echo "${params_int[${id_param_fichier}]}" | sed "s/=.*//" | sed "s/#//") nom_param=$(echo "${params_int[${id_param_fichier}]}" | grep -v '#.*Interface' | sed "s/=.*//" | sed "s/#//")
val_param=$(echo "${params_int[${id_param_fichier}]}" | sed "s/.*=//") val_param=$(echo "${params_int[${id_param_fichier}]}" | sed "s/.*=//")
# Récupération des données d'après le fichier de configuration # Récupération des données d'après le fichier de configuration
@ -64,7 +64,7 @@ recupParams(){
vlan="${val_param}" vlan="${val_param}"
vlan_init=1 vlan_init=1
else else
echo "Erreur: le paramètre \"#pont=votrePont\" est manquant." echo "Erreur: le paramètre \"#PONT=votrePont\" est manquant."
exit 1 exit 1
fi fi
else else
@ -80,7 +80,7 @@ recupParams(){
if [[ "${pont_init}" -eq 1 ]]; then if [[ "${pont_init}" -eq 1 ]]; then
ieee8021q_init=1 ieee8021q_init=1
else else
echo "Erreur: le paramètre \"#pont=votrePont\" est manquant." echo "Erreur: le paramètre \"#PONT=votrePont\" est manquant."
exit 1 exit 1
fi fi
else else
@ -94,16 +94,18 @@ recupParams(){
interface="${val_param}" interface="${val_param}"
interface_init=1 interface_init=1
else else
echo "Erreur: le paramètre \"#vlan=votreVLAN\" est manquant." echo "Erreur: le paramètre \"#VLAN=votreVLAN\" est manquant."
exit 1 exit 1
fi fi
elif [[ $(ls /run/network/ | sed -e "s/ifstate//g" -e "s/^.//" -e "/^$/d" -e "/^lo$/d" | grep "${val_param}" 2> /dev/null) ]]; then
pont_init=0
vlan_init=0
ieee8021q_init=0
interface_init=0
else else
echo "Erreur: l'interface ${val_param} est déjà existante. Arrêt immédiat du script \"${0}\" sans aucune modification du système." echo "Erreur: l'interface ${val_param} est déjà existante. Arrêt immédiat du script \"${0}\" sans aucune modification du système."
exit 1 exit 1
fi fi
else
echo "Erreur: le paramètre numéro $((${id_param_fichier}+1)) (\"${params_int[${id_param_fichier}]}\") dans le fichier de configuration est mal formé (faute de frappe)."
exit 1
fi fi
# Génération des commandes de création des interfaces réseau du conteneur # Génération des commandes de création des interfaces réseau du conteneur
@ -111,9 +113,11 @@ recupParams(){
done done
} }
# Fonction d'éxécution des commandes préparées dans la fonction genCmdIntRzo() # Fonction d'exécution des commandes préparées dans la fonction genCmdIntRzo()
execCmdIntRzo(){ execCmdIntRzo(){
for ((id_commande_rzo=0 ; "${#commandes_a_executer[*]}" - "${id_commande_rzo}"; id_commande_rzo++)); do for ((id_commande_rzo=0 ; "${#commandes_a_executer[*]}" - "${id_commande_rzo}"; id_commande_rzo++)); do
# Exécution des commandes préparées
# Pour afficher les commandes sans rien exécuter (dans le cas d'un déboggage/modification du script), il faut précéder la ligne suivante par la commande "echo"
${commandes_a_executer["${id_commande_rzo}"]} ${commandes_a_executer["${id_commande_rzo}"]}
done done
} }

Loading…
Cancel
Save