Conteneurs avec systemd-nspawn

Published: mer. 01 septembre 2021
Updated: mar. 16 août 2022
By Jorispilot

In sysadmin.

Ici se trouve mes notes de la création d’un conteneur avec systemd-nspawn, pour lesquelles je me suis appuyé sur la documentation d’Archlinux [1]. L’intérêt de systemd-nspawn par rapport à d’autres solutions, c’est la simplicité de configuration. Ma principale difficulté a été la configuration du réseau afin que la machine soit présente comme une machine indépendante sur le réseau.

Création du conteneur

On commence par créer le conteneur <name> dans /var/lib/machines/ en suivant directement les instructions sur Archlinux [1]:

# mkdir /var/lib/machines/<name>
# pacstrap -c /var/lib/machines/<name> base neovim openssh openvpn
# systemd-nspawn -D /var/lib/machines/<name>
[root@<name> ~] # passwd
[root@<name> ~] # rm /etc/securetty /usr/share/factory/etc/securetty
[root@<name> ~] # nvim /etc/pacman.conf ## Add files above to NoExtract
[root@<name> ~] # logout

C’est un peu comme installer un nouvel Archlinux. La commande systemd-nspawn -D est similaire à un démarrage du noyau avec init=/bin/sh

Comme indiqué dans [1], j’ai dû supprimer securetty.

Configuration du réseau

Internet est accessible depuis le conteneur sans aucune configuration. Il utilise pour cela la configuration de la machine hôte. Dans cette configuration, j’ai voulu faire en sorte que le conteneur soit visible depuis le réseau comme une machine indépendante.

Configuration du pont sur la machine hôte

Il y a plusieurs outils pour faire ça. On peut utiliser iproute2 directement (les instructions ip …), mais j’ai préféré utiliser le gestionnaire de réseau Network Manager avec son éditeur graphique nm-connection-editor.

Note L’outil en ligne de commande nmcli est pratique pour visualiser l’état du réseau, plus qu’avec ip.

J’ai d’abord créé un pont, c’est-à-dire une connection br0 de type Virtual Bridge, dans lequel j’ai renseigné les informations de connection de la machine hôte (DHCP, serveurs de noms, …). J’ai ensuite créé au sein du pont un port br0p1 lié à mon interface Ethernet. En relançant la connexion, pas mal de choses se sont cassées dans mon système: Gnome Settings, les montages sshfs, … En rebootant, tout est tombé en marche.

Note Le DHCP de mon réseau a attribué une adresse IP différente à la machine hôte. C’est effectivement l’adresse MAC associée à br0 qui est envoyée au serveur DHCP. Il a fallu reconfigurer les allocations d’adresses de mon réseau local.

On redémarre ensuite le conteneur:

# systemd-nspawn -bD /var/lib/machines/<name> --network-bridge=br0

Une nouvelle interface vb-<name> s’est créé sur la machine hôte. nmcli lui attribue un statut unmanaged. Je l’ajoute dans le pont sous le nom br0p2.

Configuration du réseau pour le conteneur

J’utilise systemd-networkd pour gérer le réseau dans le conteneur

[root@<name> ~] # systemctl start systemd-networkd

Et ça marche directement!

Note Curieusement, il semble que c’est les serveurs de nom du pont qui ont été passés au conteneur. C’est effectivement ce qui se passe d’après [1] et [3].

Configuration pérenne

Il suffit de configurer le pont dans le fichier de configuration [2] /etc/systemd/nspawn/<name>.nspawn:

[Network]
Bridge=br0

On peut ensuite gérer la machine avec la commande machinectl.

Monter un dossier de l’hôte dans le conteneur

C’est assez facile à la ligne de commande systemd-nspawn, il suffit d’ajouter l’option --bind=<répertoire-hôte>:<répertoire-conteneur>, et le répertoire <répertoire-hôte> sera monté dans <répertoire-conteneur>. Les propriétaires et groupes ne sont toutefois pas modifiés.

Avec l’outil machinectl, il faut ajouter dans le fichier de config

[Files]
Bind=<répertoire-hôte>:<répertoire-conteneur>

Toutefois , l’isolation des utilisateurs est activé dans ce mode et les propriétaires et groupes sont réaffecté à nobody et nogroup. Il faut de plus desactiver l’isolation

[Exec]
PrivateUsers=no

Pour que les propriétaires et groups soit attribués.

[1](1, 2, 3, 4) https://wiki.archlinux.org/title/Systemd-nspawn
[2]https://man.archlinux.org/man/systemd.nspawn.5
[3]https://man.archlinux.org/man/systemd-nspawn.1

links

social