Container Debian Jessie non privilégié

UPDATE (09/01/2016) Fajar Nugraha a écrit une très bonne série de tutoriels à propos de LXC et Debian. En particulier, il explique comment créer un container Debian Jessie non privilégié d'une manière que je trouve bien plus propre que celle que j'explique ici. Je vous invite donc à utiliser de préférence sa façon de faire plutôt que la mienne.

Comme de nombreuses distributions GNU/Linux, Debian utilise systemd comme système d'initialisation par défaut depuis sa version 8.0 (Jessie). Ce changement a plusieurs conséquences et, en particulier, il n'est pas possible de créer simplement un container LXC embarquant Debian Jessie à l'aide de la commande lxc-download. L'objet de ce billet n'est pas de discuter du bien-fondé ou non d'avoir choisi systemd. Nous présentons une méthode simple et basée sur les outils développés par l'équipe de LXC afin de créer un container non privilégié embarquant Debian Jessie sans systemd.

Création de l'image

Les outils autour de LXC sont essentiellement développés en direction de Ubuntu. Ils fonctionnent très bien sous d'autres distributions mais il y a souvent des manipulations à faire. Afin d'éviter de rentrer dans des détails peu utiles, la procédure décrite dans cette section est réalisée dans un système Ubuntu Server 14.04.2 mais elle peut facilement être adaptée.

Pour construire une image à destination d'un container LXC, il faut utiliser les outils d'intégration continue du projet LXC. Ces outils sont disponibles dans GitHub sous le nom de lxc-ci. La première étape consiste à installer le minimum nécessaire, à savoir git et lxc.

apt-get install git lxc

Une fois dans le répertoire de votre choix, vous pouvez maintenant récupérer les outils de lxc-ci,

git clone https://github.com/lxc/lxc-ci.git

En utilisant ces outils dans l'état, il est possible de créer directement une image avec Debian Jessie. Cependant, celle-ci serait inutilisable en pratique du fait de la présence de systemd par défaut. Sans entrer dans les détails, le script de construction des images procède en deux étapes : un debootstrap pour créer le système de base puis un chroot pour exécuter quelques commandes afin d'adapter le système créé. C'est dans cette seconde étape que nous allons remplacer systemd par le bon vieux sysv. Ces commandes à exécuter dans le chroot sont listées dans le fichier modèle debian.json,

vim lxc-ci/templates/debian.json

Pour installer sysv et supprimer systemd, il faut ajouter deux lignes à la section post_create,

"post_create": ["passwd -dl root",
                "apt-get remove --purge openssh-server -y",
                "apt-get install sysvinit sysvinit-core sysvinit-utils -y --force-yes",
                "apt-get remove --purge systemd -y"]

Nous pouvons maintenant lancer le script build-image et aller prendre un café,

cd lxc-ci
mkdir target
sudo bin/build-image git://github.com/lxc/lxc master HEAD debian jessie amd64 default target/

Une fois que tout est terminé, nous trouvons les fichiers meta.tar.xz et root.tar.xz dans le dossier target.

Création du container non privilégié

Les fichiers créés dans la section précédente peuvent être utilisés dans n'importe quel environnement GNU/Linux où lxc est installé. Pour rappel, afin de créer un container non-privilégié, l'utilisateur doit disposer de plages de UID et de GID subordonnées dans les fichiers /etc/subuid et /etc/subgid. Pour la suite, nous supposerons que ces plages débutent à 100000 et contiennent 65536 ids. Le lecteur intéressé trouvera plus de détails sur le blog de Stéphane Graber.

Afin d'utiliser directement les fichiers meta.tar.xz et root.tar.xz que nous avons créés, nous les plaçons dans le dossier de cache. Pour un utilisateur classique, ce dossier est ~/.cache/lxc et, pour l'utilisateur root, il s'agit de /var/cache/lxc. Il faudra donc adapter les commandes suivantes si vous souhaitez créer un container non privilégié appartenant à root.

mkdir -p ~/.cache/lxc/download/debian/jessie/amd64/default
mv rootfs.tar.xz ~/.cache/lxc/download/debian/jessie/amd64/default
tar Jxf meta.tar.xz -C ~/.cache/lxc/download/debian/jessie/amd64/default

Nous créons un fichier de configuration jessie.config pour un container non privilégié tout simple et sans interface réseau,

lxc.id_map = u 0 100000 65536
lxc.id_map = g 0 100000 65536
lxc.network.type = empty

Enfin, nous utilisons lxc-download pour créer le container en lui précisant d'utiliser le cache que nous avons mis en place plutôt que d'aller télécharger quoi que ce soit,

lxc-create -n jessie -f jessie.config -t download -- --force-cache --dist debian --release jessie --arch amd64

Vous disposez à présent d'un container non privilégié embarquant Debian Jessie sans systemd. Vous pouvez donc utiliser les dépôts jessie et profiter de cette version récente du système Debian.

Social