Le but de cet exercice est d’automatiser la gestion des conteneurs à base de unshare.
Les conteneurs sont créés à partir d’une image, c’est à dire un système de fichiers contenu
dans un fichier. Un conteneur est créé connecté à un ou plusieurs commutateurs virtuels.
En cas de non-existence d’un commutateur virtuel c’est la commande permettant de déplacer une extrémité de l’interface virtuelle dans le commutateur qui échouera.# ip link set vif1 master bridge1Il faut alors supprimer les interfaces virtuelles déjà créées, tuer le unshare, démonter le système de fichier et effacer les informations déjà sauvegardées. Il est donc intéressant de commencer par créer les interfaces virtuelles et déplacer leur première extrémité dans les commutateurs virtuels avant lancer le unshare et sauver les informations du conteneur.
Il faut stocker le PID du unshare, les noms des interfaces virtuelles et le point de montage du système de fichiers. Ces informations peuvent être sauvées dans un fichier texte sur trois lignes :1234 # PID vif1234_1 vif1234_2 # Noms des interfaces /tmp/conteneur1/ # Point d'ancrageMettons que les informations soient sauvées dans le répertoire /var/lib/containers/ dans un fichier de nom le nom du conteneur (passé en paramètre au script de création).
Un script vaut mieux que de longues explications :#!/bin/sh infos=/var/lib/containers/$1 if [ $# != 1 ] ; then echo "Name missing !" ; exit 255 ; fi ( read pid kill $pid read vifs for vif in $vifs ; do ip link del dev $vif ; done read mnt umount $mnt rm $infos ) < $infos
Un script vaut mieux que de longues explications :#!/bin/sh infos=/var/lib/containers/$1 pid=`head -n 1 $infos` nsenter -t $pid /bin/bash
Un script vaut mieux que de longues explications :#!/bin/sh dir=/var/lib/containers/ for infos in $dir/* ; do base=`$infos` pid=`head -n 1 $infos` echo "$base -> $pid" done
Script très simple, il convient simplement d’éviter une attente active.#!/bin/sh for interface in $* ; do while ! ip link show dev $interface > /dev/null 2> /dev/null ; do sleep 1 done echo Interface $interface created done
Deux machines virtuelles Xen sont définies sur un serveur de virtualisation : bob et alice. Les fichiers de configuration des deux machines sont donnés :
# cat alice.cfg kernel = '/boot/vmlinuz-3.16.0-4-amd64' extra = 'elevator=noop' ramdisk = '/boot/initrd.img-3.16.0-4-amd64' vcpus = '1' memory = '1024' root = '/dev/xvda2 ro' disk = [ 'file:/usr/local/xen/domains/alice/disk.img,xvda2,w', 'file:/usr/local/xen/domains/alice/swap.img,xvda1,w' ] name = 'alice' vif = [ 'mac=00:61:6c:69:63:65,bridge=wonderland' ] # cat bob.cfg kernel = '/boot/vmlinuz-3.16.0-4-amd64' extra = 'elevator=noop' ramdisk = '/boot/initrd.img-3.16.0-4-amd64' vcpus = '2' memory = '4096' root = '/dev/xvda2 ro' disk = [ 'phy:/dev/big/bob,xvda2,w' ] name = 'bob' vif = [ 'mac=00:62:6f:62:20:20' ]
Il suffit de monter le disque virtuel d’alice puis d’afficher le contenu du fichier /etc/network/interfaces.# mount -o loop /usr/local/xen/domains/alice/disk.img /mnt # cat /mnt/etc/network/interfaces
La machine bob n’est probablement pas dans le même commutateur virtuel qu’alice. Il suffit de changer le fichier de configuration bob.cfg en ajoutant ,bridge=wonderland derrière l’adresse MAC dans la définition du vif.
Il faut étendre la partition virtuelle sur le serveur de virtualisation puis redimenssionner le système de fichiers sur bob :server# lvextend -L+10G /dev/big/bob bob# resize2fs /dev/xvda2
Cet exercice consiste à vous faire diagnostiquer une panne réseau étape par étape. Les utilisateurs
de base se contentent de crier "le réseau ne fonctionne pas" dès qu’ils n’arrivent plus à naviguer
sur Internet. En tant qu’ingénieur informaticien, vous êtes forcément plus subtil.
Vous avez commencé par regarder si la machine avait encore une adresse IPv4 valide avec la commande
ip address show et vous constaté que non. Le serveur DHCP semble donc hors-service ou non
accessible. Répondez aux questions suivantes pour cerner le problème.
Le plus simple est de regarder la prise RJ45 femelle de la carte Ethernet du PC. Si les LEDs de ce connecteur sont allumées c’est que la carte détecte une porteuse Ethernet. Le commutateur est alors forcément allumé. Vous pouvez aussi utiliser un utilitaire comme ethtool pour afficher l’état de la carte Ethernet qui indique si la dite porteuse est détectée. Vous aurez alors aussi la vitesse négociée avec le commutateur.
Configurez deux machines de la salle avec des adresses IPv4 dans le même réseau et tentez un ping de l’une sur l’autre :machine1# ip address add eth0 192.168.0.1/24 broadcast+ machine2# ip address add eth0 192.168.0.2/24 broadcast+ machine1# ping 192.168.0.2
Donnez à votre machine une adresse IPv4 du réseau local dans lequel elle se trouve et tentez un ping sur le routeur :machine1# ip address add eth0 172.26.145.242/24 machine1# ping 172.26.145.254
Après avoir configuré votre machine avec une adresse IPv4 du réseau local comme dans la question précédente, ajoutez une route par défaut vers le routeur et tentez un ping sur l’adresse du serveur DNS.machine1# ip route add default via 172.26.145.254 machine1# ping 193.48.57.48
Un simple test de résolution de nom suffit :machine1# host www.polytech-lille.fr
Si une requête DNS sur un nom non mis en cache au niveau du serveur DNS fonctionne c’est que la connexion Internet se porte bien. Il faut trouver un nom de site très peu fréquenté.