Commit 5cf93464da34450be5127f03d01e3b6bcd167ae6
1 parent
5161dfdb
Ajout interfaces réseaux
Showing
2 changed files
with
83 additions
and
41 deletions
Show diff stats
create_container.sh
1 | #!/bin/bash | 1 | #!/bin/bash |
2 | set -x | 2 | set -x |
3 | -REPERTOIRE=${PWD} | ||
4 | -NOM_IMAGE=$3; | ||
5 | -#LIM_MEMORY=$4; NOT YET | ||
6 | -NOM_CONTAINER=$4; | ||
7 | -ADDR_IPV4=$5; | ||
8 | -NOM_BRIDGE=$6; | ||
9 | -PROGRAM=$7; | ||
10 | - | 3 | +while getopts i:c:b:r:a:p: o; do |
4 | + case $o in | ||
5 | + (i) NOM_IMAGE=$OPTARG;; | ||
6 | + (c) NOM_CONTAINER=$OPTARG;; | ||
7 | + (b) BRIDGES=$OPTARG;; | ||
8 | + (r) REPERTOIRE=$OPTARG;; | ||
9 | + (a) ADDRS_IPV4=$OPTARG;; | ||
10 | + (p) PROGRAM=$OPTARG;; | ||
11 | + | ||
12 | + esac | ||
13 | +done | ||
11 | 14 | ||
12 | #Check existence image, bridge | 15 | #Check existence image, bridge |
16 | +if [[ -z "$PATH_MANIFEST/images/$NOM_IMAGE.manifest" ]] || [ -z $NOM_IMAGE ]]; then | ||
17 | + echo "Image non existante." | ||
18 | + exit | ||
19 | +fi | ||
13 | 20 | ||
21 | +if [[ ! -z $NOM_BRIDGE ]] [[ -z "$PATH_MANIFEST/bridges/$NOM_BRIDGE.manifest" ]]; then | ||
22 | + echo "Bridge non existant." | ||
23 | + exit | ||
24 | +fi | ||
14 | 25 | ||
15 | #On veut récupérer le chemin de l'image | 26 | #On veut récupérer le chemin de l'image |
16 | -PATH_IMAGE= grep chemin $PATH_MANIFEST/images/$NOM_IMAGE.manifest | cut -d':' -f2 | 27 | +PATH_IMAGE= ${grep chemin $PATH_MANIFEST/images/$NOM_IMAGE.manifest | cut -d':' -f2} |
17 | 28 | ||
18 | -#on fait une copie dans /var/BaleineImages pour mount depuis le conteneur | 29 | +#on fait une copie dans /var/baleine/images pour mount depuis le conteneur |
19 | if [[ ! -d "$PATH_BALEINE/containers/$NOM_CONTAINER" ]]; then | 30 | if [[ ! -d "$PATH_BALEINE/containers/$NOM_CONTAINER" ]]; then |
20 | - mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER #&& cp $PATH_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/ | 31 | + mkdir -p $PATH_BALEINE/containers/$NOM_CONTAINER |
21 | fi | 32 | fi |
22 | 33 | ||
23 | cp $PATH_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE | 34 | cp $PATH_IMAGE $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE |
24 | 35 | ||
25 | -#On fait le unshare sur l'image passée en paramètre, | 36 | + |
26 | 37 | ||
27 | #on monte le système de fichiers | 38 | #on monte le système de fichiers |
28 | -echo "je vais mount" | 39 | +echo "Montage de l'image" |
29 | mount -t ext4 -o loop $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE /mnt/baleine/$NOM_CONTAINER | 40 | mount -t ext4 -o loop $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE /mnt/baleine/$NOM_CONTAINER |
30 | 41 | ||
31 | #On renseigne le fichier fstab du conteneur | 42 | #On renseigne le fichier fstab du conteneur |
32 | echo "proc /proc proc defaults 0 0" >> /mnt/$NOM_IMAGE/etc/fstab | 43 | echo "proc /proc proc defaults 0 0" >> /mnt/$NOM_IMAGE/etc/fstab |
33 | echo "$PROGRAM" >> /mnt/$NOM_IMAGE/etc/rc.local | 44 | echo "$PROGRAM" >> /mnt/$NOM_IMAGE/etc/rc.local |
34 | 45 | ||
46 | +#On fait le unshare sur l'image passée en paramètre, | ||
35 | nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER $PROGRAM -c "mount /proc" & | 47 | nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER $PROGRAM -c "mount /proc" & |
36 | PID=$! | 48 | PID=$! |
37 | echo "j'ai finis le unshare-nohup" | 49 | echo "j'ai finis le unshare-nohup" |
@@ -39,27 +51,16 @@ echo "j'ai finis le unshare-nohup" | @@ -39,27 +51,16 @@ echo "j'ai finis le unshare-nohup" | ||
39 | ps axo ppid,pid | grep "^ *$PID" | sed -e 's/.* //' | 51 | ps axo ppid,pid | grep "^ *$PID" | sed -e 's/.* //' |
40 | echo $PID | 52 | echo $PID |
41 | 53 | ||
42 | -# #Enregistrer les infos du conteneur dans un fichier | ||
43 | -# NUMBER=$(cat /dev/urandom | tr -dc '0-9' | fold -w 256 | head -n 1 | sed -e 's/^0*//' | head --bytes 3) | ||
44 | -# if [ "$NUMBER" == "" ]; then | ||
45 | -# NUMBER=0 | ||
46 | -# fi | ||
47 | - | ||
48 | FILE=$NOM_CONTAINER.manifest | 54 | FILE=$NOM_CONTAINER.manifest |
49 | touch $FILE #création du fichier | 55 | touch $FILE #création du fichier |
56 | +date=${date} | ||
57 | + | ||
50 | echo "nom_container:$NOM_CONTAINER" >> $FILE #nom de son image | 58 | echo "nom_container:$NOM_CONTAINER" >> $FILE #nom de son image |
51 | echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image | 59 | echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image |
52 | echo "pid:$PID" >> $FILE #Son PID | 60 | echo "pid:$PID" >> $FILE #Son PID |
53 | echo "nom_bridge:$NOM_BRIDGE" >> $FILE #SON BRIDGE | 61 | echo "nom_bridge:$NOM_BRIDGE" >> $FILE #SON BRIDGE |
62 | +echo "starting_time: $date" >> $FILE #starting time | ||
54 | 63 | ||
55 | -#temps d'exécution du container ? | ||
56 | -# start_time=`date +%s` | ||
57 | -# <command-to-execute> | ||
58 | -# end_time=`date +%s` | ||
59 | -# echo execution time was `expr $end_time - $start_time` s. | ||
60 | -# ou | ||
61 | -#start_time=`date +%s` | ||
62 | -#<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s | ||
63 | 64 | ||
64 | if [[ ! -d "$PATH_MANIFEST/containers" ]]; then | 65 | if [[ ! -d "$PATH_MANIFEST/containers" ]]; then |
65 | mkdir -p $PATH_MANIFEST/containers | 66 | mkdir -p $PATH_MANIFEST/containers |
@@ -68,16 +69,47 @@ fi | @@ -68,16 +69,47 @@ fi | ||
68 | mv $NOM_CONTAINER.manifest $PATH_MANIFEST/containers/$NOM_CONTAINER.manifest | 69 | mv $NOM_CONTAINER.manifest $PATH_MANIFEST/containers/$NOM_CONTAINER.manifest |
69 | 70 | ||
70 | 71 | ||
71 | -#TODO : son interface réseau (bridge) - taille mémoire / limite mémoire | 72 | +#TODO : taille mémoire / limite mémoire |
73 | + | ||
74 | +#AWK pour récupèrer le nombre d'addresses IPV4 données en arguments | ||
75 | +#(https://unix.stackexchange.com/questions/144217/counting-comma-separated-characters-in-a-row) | ||
76 | + | ||
77 | +NOMBRE_INTERFACES=echo $ADDRS_IPV4 | awk -F '[,]' '{print NF}' | ||
78 | + | ||
79 | +NOMBRE_BRIDGES=echo $BRIDGES | awk -F '[,]' '{print NF}' | ||
80 | + | ||
81 | +if [ NOMBRE_INTERFACES -ne NOMBRE_BRIDGES ]; do | ||
82 | + echo "Erreur: Il n'y a pas autant de bridges que d'interfaces réseaux" | ||
83 | + exit 1 | ||
84 | +done | ||
85 | + | ||
86 | +for i in $(seq 1 $NOMBRE_INTERFACES); do | ||
87 | + ip link add $NOM_CONTAINER_$i type veth peer name eth$i | ||
88 | +done | ||
89 | + | ||
90 | +echo "J'ai fini de créer les interfaces chef" | ||
91 | +NOMBRE_BRIDGES=echo $BRIDGES | awk -F '[,]' '{print NF}' | ||
92 | + | ||
93 | +IFS="," | ||
94 | + | ||
95 | +ARRAY_BRIDGES=() | ||
96 | +ARRAY_IPV4=() | ||
97 | + | ||
98 | +for b in $BRIDGES; do | ||
99 | + ARRAY_BRIDGES+=(b) | ||
100 | +done | ||
101 | + | ||
102 | +for a in $ADDRS_IPV4; do | ||
103 | + ARRAY_IPV4+=(a) | ||
104 | +done | ||
105 | + | ||
106 | +for (( i=0 ; i < ${#ARRAY_BRIDGES[*]} ; i++ )); do | ||
107 | + ip link set $NOM_CONTAINER_$i master ${ARRAY_BRIDGES[i]} | ||
108 | +done | ||
72 | 109 | ||
73 | #création de son interface réseau | 110 | #création de son interface réseau |
74 | -#TODO: gerer le cas de plusieurs interfaces sur un meme container | ||
75 | 111 | ||
76 | -ip link add $NOM_CONTAINER type veth peer name eth0@$NOM_CONTAINER | ||
77 | ip link set $NOM_CONTAINER master $NOM_BRIDGE | 112 | ip link set $NOM_CONTAINER master $NOM_BRIDGE |
78 | ip link set $NOM_CONTAINER up | 113 | ip link set $NOM_CONTAINER up |
79 | ip link set eth0@$NOM_CONTAINER netns /proc/$PID/ns/net name eth0 | 114 | ip link set eth0@$NOM_CONTAINER netns /proc/$PID/ns/net name eth0 |
80 | ip netns exec /proc/$PID/ns/net ip addr add $ADDR_IPV4 dev eth0 | 115 | ip netns exec /proc/$PID/ns/net ip addr add $ADDR_IPV4 dev eth0 |
81 | -#à voir (pour récupérer depuis la commande les n interfaces données et les n bridges ??) | ||
82 | -#grep ipv4 $@ | wc | ||
83 | -#grep ipv4 $@ | cut | ||
84 | \ No newline at end of file | 116 | \ No newline at end of file |
test.sh
1 | #!/bin/bash | 1 | #!/bin/bash |
2 | 2 | ||
3 | -echo $@ | ||
4 | -while getopts i:proxy: o "$@"; do | ||
5 | - case $o in | ||
6 | - (i) IMAGE=$OPTARG;; | ||
7 | - (proxy) PROXY=$OPTARG;; | ||
8 | - esac | 3 | +BRIDGES="pont,petitpont" |
4 | +ADDRS_IPV4="lala,lulu" | ||
5 | + | ||
6 | +ARRAY_BRIDGES=() | ||
7 | +ARRAY_IPV4=() | ||
8 | + | ||
9 | +IFS=',' | ||
10 | +for b in $BRIDGES; do | ||
11 | + ARRAY_BRIDGES+=($b) | ||
9 | done | 12 | done |
10 | 13 | ||
11 | -echo "Le proxy est $PROXY" | ||
12 | -echo "L'image est $IMAGE" | 14 | +for a in $ADDRS_IPV4; do |
15 | + ARRAY_IPV4+=($a) | ||
16 | +done | ||
17 | + | ||
18 | + | ||
19 | +for ((i = 0, j = 0 ; i < ${#ARRAY_BRIDGES[*]} && j < ${#ARRAY_BRIDGES[*]} ; i++, j++ )); do | ||
20 | + echo "i= ${ARRAY_BRIDGES[i]}" | ||
21 | + echo "j= ${ARRAY_IPV4[j]}" | ||
22 | +done | ||
13 | \ No newline at end of file | 23 | \ No newline at end of file |