\newpage # Utiliser LXC Le but de cette première partie est d'appréhender la virtualisation légère au travers d'un programme, `lxc`, qui va mettre en place pour nous un environnement distinct. ## Lancer un conteneur Avec le paquet LXC que vous avez installé, vous avez également récupéré un certain nombre de modèles de système (souvent installés dans le dossier `/usr/share/lxc/templates/`). La méthode la plus simple pour lancer un conteneur LXC est d'utiliser l'un de ces modèles qui va installer tout un environnement pour vous. On utilise pour cela la commande `lxc-create` : ``` lxc-create --name toto_first --template ubuntu ``` Ce modèle va créer un dossier dans `/var/lib/lxc/` portant le nom que vous avez précisé. Ce dossier va contenir la configuration LXC du conteneur (`config`), la table des partitions (`fstab`) s'il y a besoin de faire des montages particuliers et enfin le dossier `rootfs` contenant le système en lui-même. Une fois l'installation terminée, on peut démarrer le conteneur : ``` lxc-start --name toto_first ``` LXC va appeler `/sbin/init` et démarrer tous les services que l'on peut s'attendre à trouver dans n'importe quelle machine virtuelle plus classique (la seule différence réside donc dans le fait que le noyau est partagé avec l'hôte). Généralement on lance `lxc-start` avec l'option `--daemon`, car on ne s'attend pas à ce que la machine s'arrête lorsque l'on va quitter notre terminal. Dans ce cas, utiliser la commande `lxc-console` pour vous attacher à votre conteneur. À tout moment, vous pouvez vous détacher de la console (sans que cela n'affecte l'état du conteneur) en pressant les touches : `^A q`. Connectez-vous, lancez quelques commandes puis éteignez la machine avec `sudo poweroff` dans le conteneur. Vous pouvez aussi lancer la commande `lxc-stop --name toto_first` dans un autre terminal, depuis la machine hôte. ## Le réseau Le modèle ubuntu que vous avez utilisé initialise un fichier de configuration sans paramètres pour le réseau. Vous n'avez donc pas d'interface dans le conteneur pour le connecter au réseau. Un excellent article détaillant les différents types de réseau est accessible à . N'ayant qu'une seule interface physique sur la machine et n'ayant pas accès à la configuration des VLAN de la pièce, il ne nous reste que deux méthodes pour obtenir du réseau dans nos conteneurs : Virtual Ethernet ou MACVLAN. Malheureusement, ces deux méthodes nécessitent de mettre en place un pont Ethernet sur votre machine : ### Installation du pont réseau #### Bridge interface #### Port forwarding ### Virtual Ethernet Virtual Ethernet est la configuration la plus simple. On met en place un pont sur la machine hôte, puis on crée une interface `veth` par conteneur que l'on veut lancer. On n'oubliera pas d'ajouter ces interfaces au pont. Voici un extrait de configuration correspondant au paramétrage d'une interface `eth0` pour un conteneur donné : ``` lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 ``` Cette technique a pour inconvénient de laisser au noyau le soin de router les paquets selon leur adresse IP, ce qui peut être lent et coûteux étant donné que la carte est placé en mode de promiscuité. ### MACVLAN Ici, le noyau va orienter les paquets en fonction de leur adresse MAC de destination. ``` lxc.network.type = macvlan lxc.network.macvlan.mode = bridge lxc.network.flags = up lxc.network.link = br0 ``` ## Utilisation du conteneur ### Redémarrage du conteneur ### Installation de InFluxDB et Graphana ### Test de l'installation ## Rendu ### Configuration du conteneur En plus des modifications que vous avez effectuées durant le TP, modifiez la configuration du conteneur afin qu'il ne puisse pas utiliser plus que 256 MB de RAM et 512 MB de swap. Limitez ensuite les `capabilities(7)` de ce conteneur afin qu'il s'exécute avec le strict minimum de droits, nécessaire au bon fonctionnement des programmes installés. **Rendez le fichier `config` de ce premier conteneur.** N'hésitez pas à laisser des commentaires justifiant vos éventuels choix. ### Questions 1. Quel type de virtualisation réseau avez-vous utilisé ? pourquoi ? 1. Quels sont les autres types de virtualisation réseau existants ? Expliquez en chacun une phrase leurs particularités. 1. Dans quel langage InfluxDB a-t-il était écrit ? Quelle est la particularité des binaires générés par ce langage ? 1. Quels sont les avantages et les inconvénients associés au linkage statique et au linkage dynamique ? (pas forcément que dans le cadre de la virtualisation légère). 1. J'ai utilisé la méthode *Virtual Ethernet* pour relier mes conteneurs à Internet, via un PAT (`br0`). Quelle(s) règle(s) `iptables` devrais-je écrire sur mon hôte afin de permettre l'accès à InfluxDB depuis une autre machine ?