Linux Containers (LXC) sur Debian

Les Linux Containers (LXC) (site officiel) utilisent les fonctionnalités de cgroups (documentation) pour isoler certains processus dans le contexte du système d'exploitation. Ultimement, LXC est une technique de virtualisation intégrée au noyau Linux.

L'avantage de cette technique de virtualisation est qu'elle est beaucoup moins complexe à mettre en place. Installer un logiciel de virtualisation tel que Virtualbox ou VMware nécessite l'installation de modules et de services supplémentaires qui ne sont pas inclus avec le système d'exploitation. Dans le cas de LXC, tous les modules sont inclus dans le noyau Linux, il suffit d'installer les outils de gestion.

Contrairement à la virtualisation « classique », les ressources comme la mémoire, l'espace de disque et le processeur attribués à un « machine virtuelle » (ou contenant) LXC ne sont pas réservés. Par exemple, avec Virtualbox, si une machine virtuelle (VM) a accès à 512 Mo de mémoire, peu importe l'utilisation réelle de la mémoire pour la VM, le système hôte doit réserver cette plage de mémoire et se retrouve donc avec 512 Mo de moins pour faire fonctionner d'autres processus.

Debian supporte LXC depuis la version 6.0 (Debian Squeeze) qui a été lancé en 2011. Depuis, le support pour LXC et les outils inclus dans le dépôt APT se sont améliorés constamment. Pratiquement toutes les distributions modernes supportent LXC, même RHEL et CentOS 6.

Sur Debian, si vous n'avez pas systemd (ce n'est pas nécessaire avec systemd si vous avez installé libvirt-bin, il faut ajouter cette ligne dans /etc/fstab :

cgroup  /sys/fs/cgroup  cgroup  defaults  0   0

Une fois le cgroup configuré, il suffit d'installer quelques paquets et de rouler l'outil de configuration :

apt-get install lxc bridge-utils libvirt-bin debootstrap
[...]

lxc-checkconfig
[...]
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Ensuite, pour créer notre premier contenant LXC, il suffit d'exécuter la commande suivante :

lxc-create -n my_first_lxc -t debian

Une fois le contenant LXC créé, il est possible de le démarrer comme ceci (assurez-vous de noter le mot de passe pour l'utilisateur root) :

lxc-start -n my_first_lxc

Il est possible d'ajuster une panoplie de paramètres (notamment les paramètres réseaux) en modifiant le fichier /var/lib/lxc/my_first_lxc/config.

Puisque les contenants LXC n'utilisent pas d'images de disque par défaut, il est possible d'aller jouer dans le système de fichier et de faire des références à d'autres endroits du système de fichier de l'hôte.

Selon moi, les contenants LXC sont très utiles pour la compilation de logiciel. Avant d'utiliser les LXC, j'étais un adepte de chroot. Ce dernier est un outil encore indispensable, mais il y a beaucoup de limitations avec chroot qui ne sont pas présentes en utilisant un contenant virtualisé comme LXC. On peut « bridger » l'interface réseau pour donner une adresse IP unique à la machine LXC. On peut aussi plus facilement isoler les services.

LXC est très simple d'utilisation, et c'est sans surprise que Docker se sert de LXC comme levier afin de faciliter la distribution et la gestion de plusieurs contenants de style « sandbox ».

Références supplémentaires :