Commit 055618a368540eef495f814acad0b69bb8f09dad
1 parent
5721892d
Ajout hash interfaces
Showing
6 changed files
with
70 additions
and
38 deletions
Show diff stats
baleine.sh
create_container.sh
@@ -13,14 +13,14 @@ while getopts i:c:b:r:a:p: o; do | @@ -13,14 +13,14 @@ while getopts i:c:b:r:a:p: o; do | ||
13 | done | 13 | done |
14 | 14 | ||
15 | echo "Creation du container $NOM_CONTAINER basé sur l'image $NOM_IMAGE lancant le programme $PROGRAM connecté au(x) bridge(s) $BRIDGES avec les adresses $ADDRS_IPV4" | 15 | echo "Creation du container $NOM_CONTAINER basé sur l'image $NOM_IMAGE lancant le programme $PROGRAM connecté au(x) bridge(s) $BRIDGES avec les adresses $ADDRS_IPV4" |
16 | -#/usr/local/apache2/bin | ||
17 | 16 | ||
18 | -#Check existence image, bridge | 17 | +#Check existence image |
19 | if [ -z "$PATH_MANIFEST/images/$NOM_IMAGE.manifest" ] || [ -z $NOM_IMAGE ]; then | 18 | if [ -z "$PATH_MANIFEST/images/$NOM_IMAGE.manifest" ] || [ -z $NOM_IMAGE ]; then |
20 | echo "Image non existante." | 19 | echo "Image non existante." |
21 | exit | 20 | exit |
22 | fi | 21 | fi |
23 | 22 | ||
23 | +#Check existence bridge | ||
24 | if [ ! -z $NOM_BRIDGE ] || [ -z "$PATH_MANIFEST/bridges/$NOM_BRIDGE.manifest" ]; then | 24 | if [ ! -z $NOM_BRIDGE ] || [ -z "$PATH_MANIFEST/bridges/$NOM_BRIDGE.manifest" ]; then |
25 | echo "Bridge non existant." | 25 | echo "Bridge non existant." |
26 | exit | 26 | exit |
@@ -29,18 +29,15 @@ fi | @@ -29,18 +29,15 @@ fi | ||
29 | #On veut récupérer le chemin de l'image | 29 | #On veut récupérer le chemin de l'image |
30 | PATH_IMAGE="$(grep chemin $PATH_MANIFEST/images/$NOM_IMAGE.manifest | cut -d':' -f2)" | 30 | PATH_IMAGE="$(grep chemin $PATH_MANIFEST/images/$NOM_IMAGE.manifest | cut -d':' -f2)" |
31 | 31 | ||
32 | -echo "PATH_IMAGE: $PATH_IMAGE" | ||
33 | -#on fait une copie dans /var/baleine/images pour mount depuis le conteneur | 32 | +#On fait une copie dans /var/baleine/images pour mount depuis le conteneur |
34 | if [[ ! -d "$PATH_BALEINE/containers/$NOM_CONTAINER" ]]; then | 33 | if [[ ! -d "$PATH_BALEINE/containers/$NOM_CONTAINER" ]]; then |
35 | mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER | 34 | mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER |
36 | fi | 35 | fi |
37 | 36 | ||
37 | +cp $PATH_IMAGE/$NOM_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE | ||
38 | 38 | ||
39 | -#Copie de l'image physique dans le container | ||
40 | -cp -r $PATH_IMAGE/$NOM_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE | ||
41 | 39 | ||
42 | - | ||
43 | -#création du du dossier de montage de l'image du container | 40 | +#Création du du dossier de montage de l'image du container |
44 | 41 | ||
45 | if [[ ! -d "/mnt/baleine/$NOM_CONTAINER" ]]; then | 42 | if [[ ! -d "/mnt/baleine/$NOM_CONTAINER" ]]; then |
46 | mkdir -p /mnt/baleine/$NOM_CONTAINER | 43 | mkdir -p /mnt/baleine/$NOM_CONTAINER |
@@ -57,17 +54,20 @@ echo "$PROGRAM" >> /mnt/baleine/$NOM_CONTAINER/etc/rc.local | @@ -57,17 +54,20 @@ echo "$PROGRAM" >> /mnt/baleine/$NOM_CONTAINER/etc/rc.local | ||
57 | #On fait le unshare sur l'image passée en paramètre, | 54 | #On fait le unshare sur l'image passée en paramètre, |
58 | #nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER "/bin/bash" -c "mount /proc" & | 55 | #nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER "/bin/bash" -c "mount /proc" & |
59 | 56 | ||
60 | - | 57 | +nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER /bin/sh -c "mount /proc ; $PROGRAM ; while true ; do sleep 10 ; done" & |
61 | 58 | ||
62 | PID=$! | 59 | PID=$! |
63 | -echo "j'ai finis le unshare-nohup" | ||
64 | 60 | ||
65 | -ps axo ppid,pid | grep "^ *$PID" | sed -e 's/.* //' | ||
66 | -echo $PID | 61 | +#Récupère tous les processus fils du unshare (donc ici le programme qu'on lance) |
62 | +#ps axo ppid,pid | grep "^ *$PID" | sed -e 's/.* //' | ||
63 | + | ||
64 | +echo "PID Unshare :$PID" | ||
65 | + | ||
66 | + | ||
67 | +#TODO : Gerer les noms des interfaces < x caractères | ||
67 | 68 | ||
68 | FILE=$NOM_CONTAINER.manifest | 69 | FILE=$NOM_CONTAINER.manifest |
69 | -touch $FILE #création du fichier | ||
70 | -date=${date} | 70 | +date=$(date) |
71 | 71 | ||
72 | echo "nom_container:$NOM_CONTAINER" >> $FILE #nom de son image | 72 | echo "nom_container:$NOM_CONTAINER" >> $FILE #nom de son image |
73 | echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image | 73 | echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image |
@@ -87,9 +87,7 @@ mv $NOM_CONTAINER.manifest $PATH_MANIFEST/containers/$NOM_CONTAINER.manifest | @@ -87,9 +87,7 @@ mv $NOM_CONTAINER.manifest $PATH_MANIFEST/containers/$NOM_CONTAINER.manifest | ||
87 | 87 | ||
88 | #AWK pour récupèrer le nombre d'addresses IPV4 données en arguments | 88 | #AWK pour récupèrer le nombre d'addresses IPV4 données en arguments |
89 | #(https://unix.stackexchange.com/questions/144217/counting-comma-separated-characters-in-a-row) | 89 | #(https://unix.stackexchange.com/questions/144217/counting-comma-separated-characters-in-a-row) |
90 | - | ||
91 | NOMBRE_INTERFACES="$(echo $ADDRS_IPV4 | awk -F '[,]' '{print NF}')" | 90 | NOMBRE_INTERFACES="$(echo $ADDRS_IPV4 | awk -F '[,]' '{print NF}')" |
92 | - | ||
93 | NOMBRE_BRIDGES="$(echo $BRIDGES | awk -F '[,]' '{print NF}')" | 91 | NOMBRE_BRIDGES="$(echo $BRIDGES | awk -F '[,]' '{print NF}')" |
94 | 92 | ||
95 | if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then | 93 | if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then |
@@ -97,16 +95,35 @@ if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then | @@ -97,16 +95,35 @@ if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then | ||
97 | exit 1 | 95 | exit 1 |
98 | fi | 96 | fi |
99 | 97 | ||
98 | +#Creation veth | ||
99 | +#Problématique : Sur Linux, impossible d'avoir des interfaces avec des noms de plus de 16 caractères | ||
100 | +# Impossible donc de mettre des interfaces du type | ||
101 | +#Solution : On hash le nom du container, on le ramène aux trois premiers digits, puis on ajoute l'index | ||
102 | + | ||
103 | +ARRAY_INTERFACES=() | ||
104 | + | ||
100 | for i in $(seq 1 $NOMBRE_INTERFACES); do | 105 | for i in $(seq 1 $NOMBRE_INTERFACES); do |
101 | - echo "Nom de l'interface : $NOM_CONTAINER$i" | ||
102 | - ip link add $NOM_CONTAINER$i type veth peer name eth$i | 106 | + #Creation d'un hash du nom du container pour créer les interfaces |
107 | + HASH=$(sha1sum <<< $NOM_CONTAINER) | ||
108 | + #On prend les trois premiers caractères du hash, succédé de l'index de l'interface | ||
109 | + INTERFACE_NAME="vif${HASH:0:3}_$i" | ||
110 | + ip link add $INTERFACE_NAME type veth peer name eth$i@$INTERFACE_NAME | ||
111 | + #On rajoute l'interface à la liste des interfaces du container | ||
112 | + ARRAY_INTERFACES+=($INTERFACE_NAME) | ||
113 | + | ||
114 | + #On redemarre l'interface virtuelle | ||
115 | + ip link set dev $INTERFACE_NAME down | ||
116 | + ip link set dev $INTERFACE_NAME up | ||
117 | + | ||
118 | + #On place l'une des extrémité de la paire veth dans le namespace du container | ||
119 | + ip link set eth$i@$INTERFACE_NAME netns /proc/$PID/ns/net name eth$i | ||
103 | done | 120 | done |
104 | 121 | ||
105 | -echo "J'ai fini de créer les interfaces chef" | ||
106 | 122 | ||
107 | #Compte le nombre de bridges présents | 123 | #Compte le nombre de bridges présents |
108 | NOMBRE_BRIDGES=$(echo $BRIDGES | awk -F '[,]' '{print NF}') | 124 | NOMBRE_BRIDGES=$(echo $BRIDGES | awk -F '[,]' '{print NF}') |
109 | 125 | ||
126 | +#On met le séparateur à "," pour délimiter les addresses ip et bridges | ||
110 | IFS="," | 127 | IFS="," |
111 | 128 | ||
112 | ARRAY_BRIDGES=() | 129 | ARRAY_BRIDGES=() |
@@ -121,20 +138,28 @@ for a in $ADDRS_IPV4; do | @@ -121,20 +138,28 @@ for a in $ADDRS_IPV4; do | ||
121 | done | 138 | done |
122 | 139 | ||
123 | for (( i=0 ; i < ${#ARRAY_IPV4[*]} ; i++ )); do | 140 | for (( i=0 ; i < ${#ARRAY_IPV4[*]} ; i++ )); do |
124 | - #Creation de la veth | ||
125 | - #ip link add dev $NOM_CONTAINER$i type veth peer name eth$i@$NOM_CONTAINER$i | ||
126 | - ip link add dev vif1 type veth peer name eth0@vif1 | ||
127 | - #Ajout d'une des extrémités de la veth dans le namespace du container | ||
128 | - #ip link set eth$i@$NOM_CONTAINER$i netns proc/$PID/ns/net name eth$i | ||
129 | - ip link set eth0@vif1 netns proc/$PID/ns/net name eth0 | ||
130 | - #Attribution de l'adresse ip à l'interface du container | ||
131 | - #ip netns exec proc/$PID/ns/net ip addr add ${ARRAY_IPV4[i]} dev eth$i | ||
132 | - ip netns exec proc/$PID/ns/net ip addr add ${ARRAY_IPV4[i]} dev eth0 | ||
133 | - ip netns exec proc/$PID/ns/net ip link set dev eth0 down | ||
134 | - ip netns exec proc/$PID/ns/net ip link set dev eth0 up | ||
135 | - | 141 | + nsenter -t $PID -n ip a |
142 | + | ||
143 | + #Attribution de la i-ème adresse ip à l'interface i | ||
144 | + nsenter -t $PID -n ip add ${ARRAY_IPV4[i]} dev eth$i | ||
145 | + | ||
146 | + #On redemarre l'interface i dans le container | ||
147 | + nsenter -t $PID -n ip link set dev eth$i down | ||
148 | + nsenter -t $PID -n ip link set dev eth$i up | ||
136 | done | 149 | done |
137 | 150 | ||
138 | for (( i=0 ; i < ${#ARRAY_BRIDGES[*]} ; i++ )); do | 151 | for (( i=0 ; i < ${#ARRAY_BRIDGES[*]} ; i++ )); do |
139 | - ip link set $NOM_CONTAINER$i master ${ARRAY_BRIDGES[i]} | ||
140 | -done | ||
141 | \ No newline at end of file | 152 | \ No newline at end of file |
153 | + #Pour chaque interface, on la relie à son bridge associé | ||
154 | + ip link set ${ARRAY_INTERFACES[i]} master ${ARRAY_BRIDGES[i]} | ||
155 | +done | ||
156 | + | ||
157 | +#Chaine de caractère contenant toutes les interfaces du container, séparées par "," | ||
158 | + | ||
159 | +STRING_INTERFACE="" | ||
160 | +for (( i=0 ; i < ${#ARRAY_INTERFACE[*]} ; i++)); do | ||
161 | + STRING_INTERFACE="$STRING_INTERFACE,${ARRAY_INTERFACES[i]}" | ||
162 | + #Exemple, à la fin on aura ",vif143,vif560" | ||
163 | +done | ||
164 | + | ||
165 | +#On supprime la première virgule exédentaire | ||
166 | +STRING_INTERFACE=$(echo $STRING_INTERFACE | sed -e 's/^.//') | ||
142 | \ No newline at end of file | 167 | \ No newline at end of file |
down_bridge.sh
@@ -9,4 +9,5 @@ if [[ -z "$NOM_BRIDGE" ]]; then | @@ -9,4 +9,5 @@ if [[ -z "$NOM_BRIDGE" ]]; then | ||
9 | echo "Il faut donner le nom du bridge Relancez la commande avec les bons arguments." | 9 | echo "Il faut donner le nom du bridge Relancez la commande avec les bons arguments." |
10 | exit | 10 | exit |
11 | fi | 11 | fi |
12 | + | ||
12 | ip link set $NOM_BRIDGE down | 13 | ip link set $NOM_BRIDGE down |
13 | \ No newline at end of file | 14 | \ No newline at end of file |
exec_container.sh
@@ -5,4 +5,5 @@ while getopts e: o; do | @@ -5,4 +5,5 @@ while getopts e: o; do | ||
5 | (e) $NOM_CONTAINER=$OPTARG;; | 5 | (e) $NOM_CONTAINER=$OPTARG;; |
6 | esac | 6 | esac |
7 | done | 7 | done |
8 | + | ||
8 | unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER /bin/bash | 9 | unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER /bin/bash |
9 | \ No newline at end of file | 10 | \ No newline at end of file |
remove_container.sh
@@ -15,3 +15,7 @@ umount /mnt/baleine/$NAME_CONTAINER_TO_REMOVE | @@ -15,3 +15,7 @@ umount /mnt/baleine/$NAME_CONTAINER_TO_REMOVE | ||
15 | rm -rf /mnt/baleine/$NAME_CONTAINER_TO_REMOVE | 15 | rm -rf /mnt/baleine/$NAME_CONTAINER_TO_REMOVE |
16 | #supprime l'image associé au container (manifest du container) | 16 | #supprime l'image associé au container (manifest du container) |
17 | rm -rf /var/lib/baleine/containers/$NAME_CONTAINER_TO_REMOVE | 17 | rm -rf /var/lib/baleine/containers/$NAME_CONTAINER_TO_REMOVE |
18 | + | ||
19 | +#TODO : Supprimer interfaces réseaux | ||
20 | +#TODO : Grep manifeste container, récupère les interfaces | ||
21 | +#TODO : Boucle sur les interfaces, les supprime une à une | ||
18 | \ No newline at end of file | 22 | \ No newline at end of file |
test.sh
1 | #bash baleine.sh bridge create mybridge 192.168.42.1 | 1 | #bash baleine.sh bridge create mybridge 192.168.42.1 |
2 | #bash baleine.sh container create -i TEST -c mycontainer -b mybridge -a 192.168.42.2 -p /usr/sbin/apache2 | 2 | #bash baleine.sh container create -i TEST -c mycontainer -b mybridge -a 192.168.42.2 -p /usr/sbin/apache2 |
3 | 3 | ||
4 | -A="HELLO" | ||
5 | -B=" WORLD" | ||
6 | 4 | ||
7 | -C="$A$B" | 5 | +PATH_IMAGE="/var/lib/baleine/images" |
6 | +NOM_IMAGE="myimage" | ||
7 | +PATH_BALEINE="/var/lib/baleine" | ||
8 | +NOM_CONTAINER="mycontainer" | ||
8 | 9 | ||
9 | -echo $C | ||
10 | \ No newline at end of file | 10 | \ No newline at end of file |
11 | +cp $PATH_IMAGE/$NOM_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE | ||
11 | \ No newline at end of file | 12 | \ No newline at end of file |