commit
8f1a2c449e
@ -0,0 +1,30 @@
|
||||
# Fichier *ifup.sh*
|
||||
Ce fichier est le script d'initialisation des interfaces réseau pour les conteneurs *Systemd-nspawn* que j'ai écrit.
|
||||
|
||||
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
|
||||
ExecStartPre=/etc/systemd/nspawn/ifup.sh %i
|
||||
```
|
||||
|
||||
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
|
||||
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:
|
||||
|
||||
``` 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\"" )
|
||||
```
|
||||
# À tester
|
||||
Tester le comportement du script lorsque aucun fichier de configuration n'existe et en fonction du résultat, ajouter un test sur ce critaire.
|
||||
<!-- # http://www.ixany.org/docs/Shell_Les_tableaux_en_bash.html
|
||||
# https://abs.traduc.org/abs-5.1-fr/ch26.html
|
||||
# https://forums.commentcamarche.net/forum/affich-27586475-supprimer-tout-ce-qui-precede-un-pattern-de-caracteres
|
||||
-->
|
@ -0,0 +1,13 @@
|
||||
[Exec]
|
||||
Boot=on
|
||||
|
||||
[Network]
|
||||
#PONT=br0
|
||||
#VLAN=150
|
||||
Interface=apache1
|
||||
#PONT=br0
|
||||
#VLAN=151
|
||||
Interface=apache1bis
|
||||
#PONT=br0
|
||||
#VLAN=2
|
||||
Interface=apache1ter
|
@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
#echo "$1 éteint." >> /tmp/$1
|
||||
|
||||
#ip link del ${1}_h
|
@ -0,0 +1,94 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script d'initialisation des interfaces réseau d'un conteneur Systemd-nspawn
|
||||
|
||||
if [[ -n "${1}" ]]; then
|
||||
nom_conteneur="${1}"
|
||||
else
|
||||
echo "Erreur: aucun nom de conteneur renseigné."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
generCmdIntRzo(){
|
||||
# Fonction exécuté en deuxième. Permet la génération de commandes pour la création d'interfaces réseau.
|
||||
if [[ "${pont_init}" -eq 1 && "${vlan_init}" -eq 1 && "${interface_init}" -eq 1 ]]; then
|
||||
commandes_a_executer+=( "ip link add ${interface} type veth peer name ${interface}_h" )
|
||||
commandes_a_executer+=( "ip link set ${interface}_h up" )
|
||||
commandes_a_executer+=( "ip link set ${interface}_h master ${pont}" )
|
||||
commandes_a_executer+=( "bridge vlan del dev ${interface}_h vid 1 PVID untagged master" )
|
||||
commandes_a_executer+=( "bridge vlan add dev ${interface}_h vid ${vlan} pvid untagged master" )
|
||||
|
||||
# Réinitialisation des variables témoins
|
||||
pont_init=0
|
||||
vlan_init=0
|
||||
interface_init=0
|
||||
fi
|
||||
}
|
||||
|
||||
recupParams(){
|
||||
# Fonction exécuté en premier. Récuppère les paramètres du fichier de configuration du conteneur
|
||||
declare -a params_int=( $(grep -B 2 "^Interface" /etc/systemd/nspawn/"${nom_conteneur}".nspawn | sed "/^--/d") )
|
||||
nb_params="${#params_int[*]}"
|
||||
|
||||
for ((i=0 ; "${nb_params}" - "${i}" ; i++)); do
|
||||
nom_param=$(echo "${params_int[${i}]}" | sed "s/=.*//" | sed "s/#//")
|
||||
val_param=$(echo "${params_int[${i}]}" | sed "s/.*=//")
|
||||
|
||||
# Récupération des données d'après le fichier de configuration
|
||||
if [ "${nom_param}" == "PONT" ]; then
|
||||
if [[ $(ip link show "${val_param}" 2> /dev/null) ]]; then
|
||||
pont="${val_param}"
|
||||
pont_init=1
|
||||
else
|
||||
echo "Erreur: le pont ${val_param} n'existe pas. Arrêt immédiat du script \"${0}\" sans aucune modification du système."
|
||||
exit 1
|
||||
fi
|
||||
elif [ "${nom_param}" == "VLAN" ]; then
|
||||
if [[ "${val_param}" =~ ^-?[0-9]+$ && "${val_param}" -ge 1 && "${val_param}" -le 4094 && $(echo -n "${val_param}" | cut -c 1) -ne 0 ]]; then
|
||||
if [[ "${pont_init}" -eq 1 ]]; then
|
||||
vlan="${val_param}"
|
||||
vlan_init=1
|
||||
else
|
||||
echo "Erreur: le paramètre \"#pont=votrePont\" est manquant."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "Erreur: le VLAN \"${val_param}\" n'est pas un entier compris entre 1 et 4094. Arrêt immédiat du script \"${0}\" sans aucune modification du système."
|
||||
exit 1
|
||||
fi
|
||||
elif [ "${nom_param}" == "Interface" ]; then
|
||||
if [[ ! $(ip link show "${val_param}" 2> /dev/null) ]]; then
|
||||
if [[ "${vlan_init}" -eq 1 ]]; then
|
||||
interface="${val_param}"
|
||||
interface_init=1
|
||||
else
|
||||
echo "Erreur: le paramètre \"#vlan=votreVLAN\" est manquant."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
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
|
||||
fi
|
||||
else
|
||||
echo "Erreur: le paramètre numéro $((${i}+1)) (\"${params_int[${i}]}\") dans le fichier de configuration est mal formé (faute de frappe)."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Génération des commandes de création des interfaces réseau du conteneur
|
||||
generCmdIntRzo
|
||||
done
|
||||
}
|
||||
|
||||
execCmdIntRzo(){
|
||||
for ((i=0 ; "${#commandes_a_executer[*]}" - "${i}"; i++)); do
|
||||
${commandes_a_executer["${i}"]}
|
||||
done
|
||||
}
|
||||
|
||||
principale(){
|
||||
# Fonction d'exécution du script de création d'interfaces réseau pour le conteneur en cours.
|
||||
recupParams
|
||||
execCmdIntRzo
|
||||
}
|
||||
|
||||
principale
|
@ -0,0 +1,52 @@
|
||||
# SPDX-License-Identifier: LGPL-2.1+
|
||||
#
|
||||
# This file is part of systemd.
|
||||
#
|
||||
# systemd is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation; either version 2.1 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
[Unit]
|
||||
Description=Container %i
|
||||
Documentation=man:systemd-nspawn(1)
|
||||
Wants=modprobe@tun.service modprobe@loop.service modprobe@dm-mod.service
|
||||
PartOf=machines.target
|
||||
Before=machines.target
|
||||
After=network.target systemd-resolved.service modprobe@tun.service modprobe@loop.service modprobe@dm-mod.service
|
||||
RequiresMountsFor=/var/lib/machines/%i
|
||||
|
||||
[Service]
|
||||
# Make sure the DeviceAllow= lines below can properly resolve the 'block-loop' expression (and others)
|
||||
ExecStartPre=/etc/systemd/nspawn/ifup.sh %i
|
||||
ExecStart=systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --network-veth -U --settings=override --machine=%i
|
||||
ExecStopPost=/etc/systemd/nspawn/ifdown.sh %i
|
||||
KillMode=mixed
|
||||
Type=notify
|
||||
RestartForceExitStatus=133
|
||||
SuccessExitStatus=133
|
||||
Slice=machine.slice
|
||||
Delegate=yes
|
||||
TasksMax=16384
|
||||
WatchdogSec=3min
|
||||
|
||||
# Enforce a strict device policy, similar to the one nspawn configures when it
|
||||
# allocates its own scope unit. Make sure to keep these policies in sync if you
|
||||
# change them!
|
||||
DevicePolicy=closed
|
||||
DeviceAllow=/dev/net/tun rwm
|
||||
DeviceAllow=char-pts rw
|
||||
|
||||
# nspawn itself needs access to /dev/loop-control and /dev/loop, to implement
|
||||
# the --image= option. Add these here, too.
|
||||
DeviceAllow=/dev/loop-control rw
|
||||
DeviceAllow=block-loop rw
|
||||
DeviceAllow=block-blkext rw
|
||||
|
||||
# nspawn can set up LUKS encrypted loopback files, in which case it needs
|
||||
# access to /dev/mapper/control and the block devices /dev/mapper/*.
|
||||
DeviceAllow=/dev/mapper/control rw
|
||||
DeviceAllow=block-device-mapper rw
|
||||
|
||||
[Install]
|
||||
WantedBy=machines.target
|
Loading…
Reference in new issue