Inside Docker : comprendre Docker en créant son propre mini système de container - partie 2 - Isolation des processus.

Dans mon premier article nous avons vu comment utiliser chroot pour isoler nos fichiers, toutefois pour “imiter” le comportement de Docker nous allons aussi avoir besoin d’isoler les processus.
Pour ce deuxième tutoriel vous devez avoir le dossier rootfs disponible comme présenté lors de la première partie.
Nous allons utiliser une fonctionnalité du noyau Linux les namespaces. Unshare est un programme qui utilise les api du noyau permettant de créer un namespace.
Notre but est que la commande suivante, affiche dans notre chroot uniquement les processus appartenant à notre nouvel espace et non pas l’ensemble des processus lancés par la machine.
ps -aux
Grâce à la commande suivante nous allons pouvoir créer nouvel espace virtuel où les processus parents ne seront pas visibles, nous ne pourrons pas interagir avec eux (envoi de signal par exemple.)
sudo unshare -pf chroot rootfs /bin/sh
Nous pouvons le confirmer par la commande suivante :
mount -t proc proc /proc
ps -aux
Le résultat retourné est le suivant
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4340 764 ? S 19:56 0:00 /bin/sh
root 6 0.0 0.0 17504 2128 ? R+ 19:56 0:00 ps -aux
Nous constatons que le pid 1 qui est sur le le système le processus /init ou /sbin/init ne l’est plus qu’il s’agit du nouveau processus que nous avons lancés avec chroot.
Essayons d’effacer un processus par exemple le 5996 qui était en cours d’exécution sur ma machine à ce moment là.
kill 5996
/bin/sh: 4: kill: No such process
En consultant dans un autre terminal la liste des processus nous voyons que les identifiants sont différents mais que les processus sont biens listés :
root 18851 0.1 0.0 54884 3832 pts/18 S 21:12 0:00 sudo unshare -pf chroot rootfs /bin/sh
root 18852 0.0 0.0 7296 688 pts/18 S 21:12 0:00 unshare -pf chroot rootfs /bin/sh
root 18853 0.0 0.0 4340 684 pts/18 S+ 21:12 0:00 /bin/sh
Nous pouvons en faisant un kill 18853 constater que “l’hôte” a bien le contrôle.
Les namespaces linux permettent également d’isoler les connexions réseaux, les points de montages…
Code source d’unshare disponible ici : https://github.com/karelzak/util-linux/blob/master/sys-utils/unshare.c
Code source des “namespaces pid” : https://github.com/torvalds/linux/blob/2ce079f04d5914dae14fdc8618f804cc0d2a1b8f/kernel/pid_namespace.c
Le prochain article présentera comment isoler les interfaces réseaux.