Conteneurs - systemd
Systemd permet d'exécuter des conteneurs système à la manière de LXC. L'avantage de cette solution est qu'elle est extrêmement simple et rapide à mettre en œuvre, ce qui en fait une option de choix pour faire des tests sans prises de tête (waw j'ai vraiment écrit ça au sujet d'un composant Systemd ! Comme quoi tout est possible...).
Il existe deux façons de procéder:
- Systemd-nspawn, réalise une exécution éphémère et sans possibilité de quitter le conteneur (il ne rend pas la main et doit être terminé pour cela). Le principal intérêt est selon moi, le test rapide et l'expérimentation de paramètres.
- Machinectl, s'apparente plus à LXC avec un démarrage automatique possible des conteneurs avec le système (non testé). La production est envisageable avec cette méthode.
INFORMATION
Une grande partie de cette page est issue de cet article source que je vous encourage à consulter.Systemd-nspawn
Installation des paquets
apt install --no-install-recommends debootstrap systemd-container debian-archive-keyring
Note: seul <source lang="bash" inline>systemd-container</source> est nécessaire.
Création d'un répertoire d'accueil
mkdir -p ~/tmp/conteneur && cd $_
Importation d'une racine Debian pour le système du conteneur
debootstrap --arch amd64 --include=systemd-container buster modèle.buster http://deb.debian.org/debian/
le paramètre <source lang="bash" inline>--include=systemd-container</source> permet d'installer ledit paquet dans le système invité. Vous pouvez en préciser plusieurs en les séparent par des virgules.
ATTENTION
{{{1}}}Note: Vous pouvez utiliser ce système comme un modèle que vous copierez afin de faire un nouveau conteneur. Cette pratique est plus rapide si vous n'avez pas de miroir de dépôt local mais n'oubliez pas de mettre à jour le système après la copie (si votre modèle est vieux).
Copie du modèle
cp -a modèle.buster buster1
Se connecter au conteneur sans le démarrer (identique à un chroot)
systemd-nspawn -D buster1
Si vous rencontrez une impossibilité de vous connecter au shell de votre conteneur par la suite (ça n'a pas été mon cas), il faudra supprimer le fichier de liste blanche des TTY autorisés pour la connexion (/etc/securetty) afin de permettre l'authentification comme suit.
rm /etc/securetty
On assignera enfin un mot de passe root avant de quitter le conteneur.
passwd exit
Démarrer le conteneur et s'y connecter
systemd-nspawn -bD buster1
Il n'est pas possible de se détacher du conteneur avec cette méthode. Pour sortir, il faut soir éteindre le conteneur (via les commandes habituelles), soit le terminer par la force via la répétition successive de trois fois la combinaison de touches suivante: <source lang="bash" inline><ctrl> + ]</source>.
Machinectl
Cet outil ressemble plus à la gestion traditionnelle d'un LXC. Il travail exclusivement dans le répertoire <source lang="bash" inline>/var/lib/machines</source> là où Systemd-nspawn s'adaptait au paramètre passé
Mise en œuvre
Création d'un conteneur Debian Sid en amd64 avec les branches de dépôt main, contrib et non-free s'appelant "sid1" et comportant le paquet supplémentaire <source lang="bash" inline>systemd-container</source>:
apt install --no-install-recommends debootstrap systemd-container debian-archive-keyring debootstrap --arch amd64 --include=systemd-container --components=main,contrib,non-free sid /var/lib/machines/sid http://deb.debian.org/debian/ machinectl clone sid sid1 machinectl start sid1 machinectl shell sid1
Commandes utiles
Voici les commandes utiles:
| Argument | Signification |
|---|---|
| <source lang="bash" inline>machinectl</source> ou <source lang="bash" inline>machinectl list</source> | Liste les conteneurs actifs |
| <source lang="bash" inline>machinectl list-images</source> | Liste les conteneurs sans distinctions |
| <source lang="bash" inline>machinectl start sid1</source> | Démarre le conteneur et rend la main (il se comporte comme un service) |
| <source lang="bash" inline>machinectl poweroff sid1</source> ou <source lang="bash" inline>machinectl stop sid1</source> | Éteint le conteneur sid1 proprement, stop est un alias de poweroff |
| <source lang="bash" inline>machinectl terminate sid1</source> | Tue le conteneur (force l'arrêt) |
| <source lang="bash" inline>machinectl clone sid sid1</source> | Copie le conteneur (un <source lang="bash" inline>cp -a /var/lib/machines/conteneur_source /var/lib/machines/conteneur_destination</source> fait la même chose) |
| <source lang="bash" inline>machinectl remove sid1</source> | Supprime le conteneur (un <source lang="bash" inline>rm -rf /var/lib/machines/conteneur_source conteneur_destination</source> fait la même chose si tant est qu'il est bien arrêté) |
| <source lang="bash" inline>machinectl clean --all</source> | Supprime tout les conteneurs |
| <source lang="bash" inline>machinectl login sid1</source> | Attache un conteneur en passant par l'outil de connexion du système (pour sortir, il faut utiliser la répétition successive de trois fois la combinaison de touches suivante: <source lang="bash" inline><ctrl> + ]</source>) |
| <source lang="bash" inline>machinectl shell sid1</source> | Se connecte automatiquement au conteneur sans demander de mot de passe (identique à un <source lang="bash" inline>chroot</source> ou un <source lang="bash" inline>su - utilisateur</source> depuis root). Pour sortir, il faut faire un <source lang="bash" inline>exit</source> ou <source lang="bash" inline><ctrl> + d</source> |
| <source lang="bash" inline>machinectl copy-to sid1 ~/Documents/proc.jpeg /root/image.jpg</source> | Copie un fichier dans le conteneur (la syntaxe pour un dossier est identique sans paramètres supplémentaires). Est identique à une copie standard mais part de la racine du conteneur |
| <source lang="bash" inline>machinectl copy-from sid1 /root/xyz abc</source> | Même chose dans l'autre sens. Permet de récupérer un fichier/dossier |
| <source lang="bash" inline>machinectl export-tar sid1 /tmp/sid1.tar.gz</source> | Réalise une sauvegarde du conteneur sous forme d'archive compressée (tar.gz) |
| <source lang="bash" inline>machinectl import-tar /tmp/sid1.tar.gz sid2</source> | Importe un conteneur précedemment sauvegardé. En dehors des deux dernières commandes, ces opérations sont réalisables manuellements via les commandes standards. |
Sources
- Très largement inspirée: https://www.blog-libre.org/2020/04/17/une-presentation-de-systemd-nspawn/
- Complémentaires:
- Pages de manuels: