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 | 1 | #!/bin/bash |
2 | 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 | 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 | 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 | 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 | 32 | fi |
22 | 33 | |
23 | 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 | 38 | #on monte le système de fichiers |
28 | -echo "je vais mount" | |
39 | +echo "Montage de l'image" | |
29 | 40 | mount -t ext4 -o loop $PATH_BALEINE/containers/$NOM_CONTAINER/$NOM_IMAGE /mnt/baleine/$NOM_CONTAINER |
30 | 41 | |
31 | 42 | #On renseigne le fichier fstab du conteneur |
32 | 43 | echo "proc /proc proc defaults 0 0" >> /mnt/$NOM_IMAGE/etc/fstab |
33 | 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 | 47 | nohup unshare -p -f -m -n -u chroot /mnt/baleine/$NOM_CONTAINER $PROGRAM -c "mount /proc" & |
36 | 48 | PID=$! |
37 | 49 | echo "j'ai finis le unshare-nohup" |
... | ... | @@ -39,27 +51,16 @@ echo "j'ai finis le unshare-nohup" |
39 | 51 | ps axo ppid,pid | grep "^ *$PID" | sed -e 's/.* //' |
40 | 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 | 54 | FILE=$NOM_CONTAINER.manifest |
49 | 55 | touch $FILE #création du fichier |
56 | +date=${date} | |
57 | + | |
50 | 58 | echo "nom_container:$NOM_CONTAINER" >> $FILE #nom de son image |
51 | 59 | echo "nom_image:$NOM_IMAGE" >> $FILE #nom de son image |
52 | 60 | echo "pid:$PID" >> $FILE #Son PID |
53 | 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 | 65 | if [[ ! -d "$PATH_MANIFEST/containers" ]]; then |
65 | 66 | mkdir -p $PATH_MANIFEST/containers |
... | ... | @@ -68,16 +69,47 @@ fi |
68 | 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 | 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 | 112 | ip link set $NOM_CONTAINER master $NOM_BRIDGE |
78 | 113 | ip link set $NOM_CONTAINER up |
79 | 114 | ip link set eth0@$NOM_CONTAINER netns /proc/$PID/ns/net name eth0 |
80 | 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 | 116 | \ No newline at end of file | ... | ... |
test.sh
1 | 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 | 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 | 23 | \ No newline at end of file | ... | ... |