Commit 5cf93464da34450be5127f03d01e3b6bcd167ae6

Authored by hmalti
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
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