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 | 13 | done |
14 | 14 | |
15 | 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 | 18 | if [ -z "$PATH_MANIFEST/images/$NOM_IMAGE.manifest" ] || [ -z $NOM_IMAGE ]; then |
20 | 19 | echo "Image non existante." |
21 | 20 | exit |
22 | 21 | fi |
23 | 22 | |
23 | +#Check existence bridge | |
24 | 24 | if [ ! -z $NOM_BRIDGE ] || [ -z "$PATH_MANIFEST/bridges/$NOM_BRIDGE.manifest" ]; then |
25 | 25 | echo "Bridge non existant." |
26 | 26 | exit |
... | ... | @@ -29,18 +29,15 @@ fi |
29 | 29 | #On veut récupérer le chemin de l'image |
30 | 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 | 33 | if [[ ! -d "$PATH_BALEINE/containers/$NOM_CONTAINER" ]]; then |
35 | 34 | mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER |
36 | 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 | 42 | if [[ ! -d "/mnt/baleine/$NOM_CONTAINER" ]]; then |
46 | 43 | mkdir -p /mnt/baleine/$NOM_CONTAINER |
... | ... | @@ -57,17 +54,20 @@ echo "$PROGRAM" >> /mnt/baleine/$NOM_CONTAINER/etc/rc.local |
57 | 54 | #On fait le unshare sur l'image passée en paramètre, |
58 | 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 | 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 | 69 | FILE=$NOM_CONTAINER.manifest |
69 | -touch $FILE #création du fichier | |
70 | -date=${date} | |
70 | +date=$(date) | |
71 | 71 | |
72 | 72 | echo "nom_container:$NOM_CONTAINER" >> $FILE #nom de son image |
73 | 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 | 87 | |
88 | 88 | #AWK pour récupèrer le nombre d'addresses IPV4 données en arguments |
89 | 89 | #(https://unix.stackexchange.com/questions/144217/counting-comma-separated-characters-in-a-row) |
90 | - | |
91 | 90 | NOMBRE_INTERFACES="$(echo $ADDRS_IPV4 | awk -F '[,]' '{print NF}')" |
92 | - | |
93 | 91 | NOMBRE_BRIDGES="$(echo $BRIDGES | awk -F '[,]' '{print NF}')" |
94 | 92 | |
95 | 93 | if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then |
... | ... | @@ -97,16 +95,35 @@ if [ $NOMBRE_INTERFACES -ne $NOMBRE_BRIDGES ]; then |
97 | 95 | exit 1 |
98 | 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 | 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 | 120 | done |
104 | 121 | |
105 | -echo "J'ai fini de créer les interfaces chef" | |
106 | 122 | |
107 | 123 | #Compte le nombre de bridges présents |
108 | 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 | 127 | IFS="," |
111 | 128 | |
112 | 129 | ARRAY_BRIDGES=() |
... | ... | @@ -121,20 +138,28 @@ for a in $ADDRS_IPV4; do |
121 | 138 | done |
122 | 139 | |
123 | 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 | 149 | done |
137 | 150 | |
138 | 151 | for (( i=0 ; i < ${#ARRAY_BRIDGES[*]} ; i++ )); do |
139 | - ip link set $NOM_CONTAINER$i master ${ARRAY_BRIDGES[i]} | |
140 | -done | |
141 | 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 | 167 | \ No newline at end of file | ... | ... |
down_bridge.sh
exec_container.sh
remove_container.sh
... | ... | @@ -15,3 +15,7 @@ umount /mnt/baleine/$NAME_CONTAINER_TO_REMOVE |
15 | 15 | rm -rf /mnt/baleine/$NAME_CONTAINER_TO_REMOVE |
16 | 16 | #supprime l'image associé au container (manifest du container) |
17 | 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 | 22 | \ No newline at end of file | ... | ... |
test.sh
1 | 1 | #bash baleine.sh bridge create mybridge 192.168.42.1 |
2 | 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 | 10 | \ No newline at end of file |
11 | +cp $PATH_IMAGE/$NOM_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE | |
11 | 12 | \ No newline at end of file | ... | ... |