« Conteneurs - systemd » : différence entre les versions

De Wiki doc

(→‎Réseau : Déplacement du script de configuration des interfaces réseau dans un répertoire plus adapté.)
(Correction d'une faute + remplacement des balises sources obsolètes)
 
(2 versions intermédiaires par le même utilisateur non affichées)
Ligne 14 : Ligne 14 :
  apt install --no-install-recommends debootstrap systemd-container debian-archive-keyring
  apt install --no-install-recommends debootstrap systemd-container debian-archive-keyring


''Note: seul <source lang="bash" inline>systemd-container</source> est nécessaire au fonctionnement des conteneurs.''
''Note: seul <syntaxhighlight lang="bash" inline>systemd-container</syntaxhighlight> est nécessaire au fonctionnement des conteneurs.''


'''Création d'un répertoire d'accueil'''
'''Création d'un répertoire d'accueil'''
Ligne 22 : Ligne 22 :
  debootstrap --arch amd64 --include=systemd-container buster modèle.buster http://deb.debian.org/debian/
  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é (au passage, ce paquet doit être présent dans le conteneur pour pouvoir être utilisé avec la fonction <source lang="bash" inline>login</source> de [[#Machinectl|Machinectl]]). Vous pouvez en préciser plusieurs en les séparent par des virgules.
le paramètre <syntaxhighlight lang="bash" inline>--include=systemd-container</syntaxhighlight> permet d'installer ledit paquet dans le système invité (au passage, ce paquet doit être présent dans le conteneur pour pouvoir être utilisé avec la fonction <syntaxhighlight lang="bash" inline>login</syntaxhighlight> de [[#Machinectl|Machinectl]]). Vous pouvez en préciser plusieurs en les séparent par des virgules.


{{attention|Si la commande vous renvoie un message du genre:
{{attention|Si la commande vous renvoie un message du genre:


<source lang="bash">
<syntaxhighlight lang="bash">
/usr/sbin/debootstrap: 1578: /usr/sbin/debootstrap: cannot create /tmp/conteneurs/modèle.buster/test-dev-null: Permission denied
/usr/sbin/debootstrap: 1578: /usr/sbin/debootstrap: cannot create /tmp/conteneurs/modèle.buster/test-dev-null: Permission denied
E: Cannot install into target '/tmp/conteneurs/modèle.buster' mounted with noexec or nodev
E: Cannot install into target '/tmp/conteneurs/modèle.buster' mounted with noexec or nodev
</source>
</syntaxhighlight>


c'est que le système de fichiers cible ne supporte pas l'exécution de binaires (ce serai le cas de certains d'entre eux dans un volume Luks non root). Là en l’occurrence c'est par ce que mon <source lang="bash" inline>/tmp</source> est un ''tmpfs'' (mais on va partir du principe qu'il s'agit d'un <source lang="bash" inline>/home/toto</source>). Pour corriger cela, il faut remonter le système de fichier avec les bons paramètres: <source lang="bash" inline>mount -i -o remount,exec,dev /home/toto</source>.
c'est que le système de fichiers cible ne supporte pas l'exécution de binaires (ce serai le cas de certains d'entre eux dans un volume Luks non root). Là en l’occurrence c'est par ce que mon <syntaxhighlight lang="bash" inline>/tmp</syntaxhighlight> est un ''tmpfs'' (mais on va partir du principe qu'il s'agit d'un <syntaxhighlight lang="bash" inline>/home/toto</syntaxhighlight>). Pour corriger cela, il faut remonter le système de fichier avec les bons paramètres: <syntaxhighlight lang="bash" inline>mount -i -o remount,exec,dev /home/toto</syntaxhighlight>.
}}
}}


Ligne 55 : Ligne 55 :
  systemd-nspawn -bD buster1
  systemd-nspawn -bD buster1


Il n'est pas possible de se détacher du conteneur avec cette méthode (pour cela, il faudra se tourner vers [[#Machinectl|Machinectl]]). Pour sortir, il faut soit é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>.
Il n'est pas possible de se détacher du conteneur avec cette méthode (pour cela, il faudra se tourner vers [[#Machinectl|Machinectl]]). Pour sortir, il faut soit é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: <syntaxhighlight lang="bash" inline><ctrl> + ]</syntaxhighlight>.


==Paramétrage==
==Paramétrage==
Ligne 63 : Ligne 63 :
Avec la commande précédente, le conteneur va se lancer avec l'ensemble des interfaces réseaux de l'hôte, ce qui peux s'avérer utiles dans les cas où l'on veut proposer un service à un ensemble de VLAN sans routage par exemple ou pour exécuter une application comme depuis l'hôte.
Avec la commande précédente, le conteneur va se lancer avec l'ensemble des interfaces réseaux de l'hôte, ce qui peux s'avérer utiles dans les cas où l'on veut proposer un service à un ensemble de VLAN sans routage par exemple ou pour exécuter une application comme depuis l'hôte.


Cependant, si l'on veut que notre conteneur soit limité à un ou plusieurs réseaux, il existe une section dédiée dans le [https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html#Networking%20Options manuel]. J'affectionne tout particulièrement l'usage de <source lang="bash" inline>--network-interface</source> qui permet de déplacer une interface ''veth'' dans l'espace de nom réseau du conteneur (ces interfaces doivent au préalable être créées). Ce paramètre peut être utilisé plusieurs fois afin de mettre notre système invité dans plusieurs ''VLAN'' par exemple:
Cependant, si l'on veut que notre conteneur soit limité à un ou plusieurs réseaux, il existe une section dédiée dans le [https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html#Networking%20Options manuel]. J'affectionne tout particulièrement l'usage de <syntaxhighlight lang="bash" inline>--network-interface</syntaxhighlight> qui permet de déplacer une interface ''veth'' dans l'espace de nom réseau du conteneur (ces interfaces doivent au préalable être créées). Ce paramètre peut être utilisé plusieurs fois afin de mettre notre système invité dans plusieurs ''VLAN'' par exemple:


<source lang="bash">
<syntaxhighlight lang="bash">
# Allumage de l'interface servant les services des conteneurs (reliée à un commutateur matériel)
# Allumage de l'interface servant les services des conteneurs (reliée à un commutateur matériel)
ip link set eth2 up
ip link set eth2 up
Ligne 112 : Ligne 112 :
# Démarrage de mon conteneur apache
# Démarrage de mon conteneur apache
systemd-nspawn -b --network-interface=apache180_c --network-interface=apache181_c -D /root/conteneurs/apache
systemd-nspawn -b --network-interface=apache180_c --network-interface=apache181_c -D /root/conteneurs/apache
</source>
</syntaxhighlight>


Le réseau dans mon conteneur est définit comme suit:
Le réseau dans mon conteneur est définit comme suit:
Ligne 118 : Ligne 118 :
  vim /root/conteneurs/apache/etc/network/interfaces
  vim /root/conteneurs/apache/etc/network/interfaces


<source lang="bash">
<syntaxhighlight lang="bash">
auto lo
auto lo
iface lo inet loopback
iface lo inet loopback
         up /usr/local/bin/confint
         up /usr/local/bin/confint
</source>
</syntaxhighlight>


  vim /root/conteneurs/apache/usr/local/bin/confint
  vim /root/conteneurs/apache/usr/local/bin/confint


<source lang="bash">
<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash


Ligne 135 : Ligne 135 :
ip addr add fd00:0:0:181::a0/64 dev apache181_c
ip addr add fd00:0:0:181::a0/64 dev apache181_c
ip link set apache181_c up
ip link set apache181_c up
</source>
</syntaxhighlight>


  chmod u+x /root/conteneurs/apache/usr/local/bin/confint
  chmod u+x /root/conteneurs/apache/usr/local/bin/confint


===Éphémérité===
===Éphémérité===
Il est également possible de lancer le conteneur en mode éphémère via un instantané (avec ''BTRFS'' ou ''XFS'') ou via une copie liée ''reflinks'' (avec ''EXT4'') en utilisant le paramètre <source lang="bash" inline>-x</source>. Ceci offre une liberté non négligeable pour vos tests vous puisque vous pouvez tout péter, une extinction supprimera l'instantané et votre conteneur n'aura pas été modifié d'un bit. Cerise sur le gâteau, un redémarrage du conteneur éphémère ne supprime pas cet instantané donc vous pouvez même tester des applications nécessitant un redémarrage contrairement aux [[Squashfs]] !
Il est également possible de lancer le conteneur en mode éphémère via un instantané (avec ''BTRFS'' ou ''XFS'') ou via une copie liée ''reflinks'' (avec ''EXT4'') en utilisant le paramètre <syntaxhighlight lang="bash" inline>-x</syntaxhighlight>. Ceci offre une liberté non négligeable pour vos tests vous puisque vous pouvez tout péter, une extinction supprimera l'instantané et votre conteneur n'aura pas été modifié d'un bit. Cerise sur le gâteau, un redémarrage du conteneur éphémère ne supprime pas cet instantané donc vous pouvez même tester des applications nécessitant un redémarrage contrairement aux [[Squashfs]] !


Encore plus fou, il est possible de conteneuriser son propre système alors qu'il est [https://unix.stackexchange.com/questions/211225/how-do-i-background-a-systemd-nspawn-container lui-même démarré] !
Encore plus fou, il est possible de conteneuriser son propre système alors qu'il est [https://unix.stackexchange.com/questions/211225/how-do-i-background-a-systemd-nspawn-container lui-même démarré] !
Ligne 147 : Ligne 147 :
Lorsque le conteneur est utilisé avec un [[#Fichier_de_configuration|fichier de configuration]], la journalisation doit être désactivée pour pouvoir le démarrer en mode éphémère. Les paramètres de configuration sont :
Lorsque le conteneur est utilisé avec un [[#Fichier_de_configuration|fichier de configuration]], la journalisation doit être désactivée pour pouvoir le démarrer en mode éphémère. Les paramètres de configuration sont :


<source lang="bash">
<syntaxhighlight lang="bash">
LinkJournal=no
LinkJournal=no
Ephemeral=on
Ephemeral=on
</source>
</syntaxhighlight>


À mettre dans la section <source lang="bash" inline>[Exec]</source>.
À mettre dans la section <syntaxhighlight lang="bash" inline>[Exec]</syntaxhighlight>.


===Montage===
===Montage===
Il est possible de monter des arborescences dans les conteneurs directement depuis la ligne de commande. Dans le cas d'un usage de ces notions dans un [[#Fichier_de_configuration|fichier de configuration]], ces paramètres sont à placer dans la section <source lang="bash" inline>[Files]</source>.
Il est possible de monter des arborescences dans les conteneurs directement depuis la ligne de commande. Dans le cas d'un usage de ces notions dans un [[#Fichier_de_configuration|fichier de configuration]], ces paramètres sont à placer dans la section <syntaxhighlight lang="bash" inline>[Files]</syntaxhighlight>.


Les options sont combinables.
Les options sont combinables.


====Montage lié====
====Montage lié====
L'outil permet de copier le comportement d'un <source lang="bash" inline>mount --bind</source> via le paramètre <source lang="bash" inline>--bind</source>. En voici un exemple :
L'outil permet de copier le comportement d'un <syntaxhighlight lang="bash" inline>mount --bind</syntaxhighlight> via le paramètre <syntaxhighlight lang="bash" inline>--bind</syntaxhighlight>. En voici un exemple :
  mkdir -p /tmp/toto/{titi,tata/{tutu,tyty}}
  mkdir -p /tmp/toto/{titi,tata/{tutu,tyty}}
  systemd-nspawn --bind=/tmp/toto:/mnt -bxD /root/conteneurs/apache/
  systemd-nspawn --bind=/tmp/toto:/mnt -bxD /root/conteneurs/apache/
Ligne 166 : Ligne 166 :
Ceci aura pour effet de monter le contenu du répertoire ''/tmp/toto/'' de l'hôte dans le répertoire ''/mnt/'' de l'invité (en cas d'omission de ce dernier paramètre, le répertoire sera monté dans le même que l'hôte).
Ceci aura pour effet de monter le contenu du répertoire ''/tmp/toto/'' de l'hôte dans le répertoire ''/mnt/'' de l'invité (en cas d'omission de ce dernier paramètre, le répertoire sera monté dans le même que l'hôte).


Le paramètre de configuration est <source lang="bash" inline>Bind=/tmp/toto:/mnt</source> (section <source lang="bash" inline>[Files]</source>).
Le paramètre de configuration est <syntaxhighlight lang="bash" inline>Bind=/tmp/toto:/mnt</syntaxhighlight> (section <syntaxhighlight lang="bash" inline>[Files]</syntaxhighlight>).
 
{{astuce|Il est également possible de passer un fichier (régulier, spécial, bloc...) à un conteneur via cette méthode.}}


====Montage tmpfs====
====Montage tmpfs====
Il est possible de monter un ''tmpfs'' dans le conteneur afin de disposer d'un ''ramdisk''. Après les <source lang="bash" inline>:</source>, les paramètres sont les même que pour un ''tmpfs'' traditionnel.
Il est possible de monter un ''tmpfs'' dans le conteneur afin de disposer d'un ''ramdisk''. Après les <syntaxhighlight lang="bash" inline>:</syntaxhighlight>, les paramètres sont les même que pour un ''tmpfs'' traditionnel.
  systemd-nspawn --tmpfs=/tmp/ramdisk:rw,size=2G -bxD /root/conteneurs/apache/
  systemd-nspawn --tmpfs=/tmp/ramdisk:rw,size=2G -bxD /root/conteneurs/apache/


Le répertoire ''/tmp/ramdisk'' est monté dans l'invité en ''tmpfs'' en lecture/écriture et limité à 2Go.
Le répertoire ''/tmp/ramdisk'' est monté dans l'invité en ''tmpfs'' en lecture/écriture et limité à 2Go.


Le paramètre de configuration est <source lang="bash" inline>TemporaryFileSystem=/tmp/ramdisk:rw,size=2G</source> (section <source lang="bash" inline>[Files]</source>).
Le paramètre de configuration est <syntaxhighlight lang="bash" inline>TemporaryFileSystem=/tmp/ramdisk:rw,size=2G</syntaxhighlight> (section <syntaxhighlight lang="bash" inline>[Files]</syntaxhighlight>).


====Montage superposé====
====Montage superposé====
Ligne 181 : Ligne 183 :
  systemd-nspawn --overlay=/tmp/ycharbi:/tmp/lesmorin:/toto -bxD /root/conteneurs/apache/
  systemd-nspawn --overlay=/tmp/ycharbi:/tmp/lesmorin:/toto -bxD /root/conteneurs/apache/


Le paramètre de configuration est <source lang="bash" inline>Overlay=/tmp/ycharbi:/tmp/lesmorin:/toto</source> (section <source lang="bash" inline>[Files]</source>).
Le paramètre de configuration est <syntaxhighlight lang="bash" inline>Overlay=/tmp/ycharbi:/tmp/lesmorin:/toto</syntaxhighlight> (section <syntaxhighlight lang="bash" inline>[Files]</syntaxhighlight>).


===Non privilégié===
===Non privilégié===
Un conteneur ''Nspawn'' peut-être exécuté dans un espace de noms utilisateur afin de cloisonner les privilèges du ''root'' invité (cela rend encore plus compliqué le piratage du système puisque en plus d'exploiter une faille pour sortir du conteneur, l'attaquant devra également user d'une élévation de privilèges pour nuire) via le paramètre <source lang="bash" inline>-U</source>.
Un conteneur ''Nspawn'' peut-être exécuté dans un espace de noms utilisateur afin de cloisonner les privilèges du ''root'' invité (cela rend encore plus compliqué le piratage du système puisque en plus d'exploiter une faille pour sortir du conteneur, l'attaquant devra également user d'une élévation de privilèges pour nuire) via le paramètre <syntaxhighlight lang="bash" inline>-U</syntaxhighlight>.


Tout cumulé, on en arrive à la commande suivante :
Tout cumulé, on en arrive à la commande suivante :
  systemd-nspawn -b --network-interface=apache_c -xUD /root/conteneurs/apache
  systemd-nspawn -b --network-interface=apache_c -xUD /root/conteneurs/apache


Le paramètre de configuration est <source lang="bash" inline>PrivateUsers=pick</source> (section <source lang="bash" inline>[Exec]</source>).
Le paramètre de configuration est <syntaxhighlight lang="bash" inline>PrivateUsers=pick</syntaxhighlight> (section <syntaxhighlight lang="bash" inline>[Exec]</syntaxhighlight>).


==Fichier de configuration==
==Fichier de configuration==
Ligne 200 : Ligne 202 :
Vous pouvez donc définir des configurations personnalisées pour chacun des conteneurs que vous exécuterez afin d'alléger leur commande de démarrage (le nom du fichier doit être identique au nom du conteneur). La syntaxe est documenté dans le [https://www.freedesktop.org/software/systemd/man/systemd.nspawn.html manuel dédié]. Ces fichiers sont bien entendus également utilisés par [[#Machinectl|Machinectl]]. Vous pouvez donc paramétrer vos conteneurs gérés par cet outil.
Vous pouvez donc définir des configurations personnalisées pour chacun des conteneurs que vous exécuterez afin d'alléger leur commande de démarrage (le nom du fichier doit être identique au nom du conteneur). La syntaxe est documenté dans le [https://www.freedesktop.org/software/systemd/man/systemd.nspawn.html manuel dédié]. Ces fichiers sont bien entendus également utilisés par [[#Machinectl|Machinectl]]. Vous pouvez donc paramétrer vos conteneurs gérés par cet outil.


Par exemple, un fichier de configuration correspondant à cette ligne de commande: <source lang="bash" inline>systemd-nspawn -b --network-interface=apache180_c --network-interface=apache181_c -D /root/conteneurs/apache</source> est le suivant (<source lang="bash" inline>/etc/systemd/nspawn/apache.nspawn</source>) :
Par exemple, un fichier de configuration correspondant à cette ligne de commande: <syntaxhighlight lang="bash" inline>systemd-nspawn -b --network-interface=apache180_c --network-interface=apache181_c -D /root/conteneurs/apache</syntaxhighlight> est le suivant (<syntaxhighlight lang="bash" inline>/etc/systemd/nspawn/apache.nspawn</syntaxhighlight>) :


<source lang="bash">
<syntaxhighlight lang="bash">
[Exec]
[Exec]
Boot=on
Boot=on
Ligne 209 : Ligne 211 :
Interface=apache180_c
Interface=apache180_c
Interface=apache181_c
Interface=apache181_c
</source>
</syntaxhighlight>


Il est à noté que les paramètres sont à mettre sous les bonnes sections comme dans un [[Astuces_-_systemd#Cr.C3.A9ation_du_service_Systemd|service Systemd]]. Faites-y attention lors de la lecture du manuel.
Il est à noté que les paramètres sont à mettre sous les bonnes sections comme dans un [[Astuces_-_systemd#Cr.C3.A9ation_du_service_Systemd|service Systemd]]. Faites-y attention lors de la lecture du manuel.


{{attention|Nous avons constaté un bogue dans le cas de l'utilisation d'une option de montage (le <source lang="bash" inline>Bind=</source> dans notre cas) avec l'option <source lang="bash" inline>-x</source> de <source lang="bash" inline>systemd-nspawn</source> (le montage ne se fait pas et aucune erreur ne se produit). Si vous voulez effectuer ce type de montage sur un conteneur éphémère, il faut préciser le paramètre dans le fichier de configuration comme ceci: <source lang="bash" inline>Ephemeral=on</source> sous la section <source lang="bash" inline>[Exec]</source>.}}
{{attention|Nous avons constaté un bogue dans le cas de l'utilisation d'une option de montage (le <syntaxhighlight lang="bash" inline>Bind=</syntaxhighlight> dans notre cas) avec l'option <syntaxhighlight lang="bash" inline>-x</syntaxhighlight> de <syntaxhighlight lang="bash" inline>systemd-nspawn</syntaxhighlight> (le montage ne se fait pas et aucune erreur ne se produit). Si vous voulez effectuer ce type de montage sur un conteneur éphémère, il faut préciser le paramètre dans le fichier de configuration comme ceci: <syntaxhighlight lang="bash" inline>Ephemeral=on</syntaxhighlight> sous la section <syntaxhighlight lang="bash" inline>[Exec]</syntaxhighlight>.}}


=Machinectl=
=Machinectl=
Cet outil ressemble plus à la gestion traditionnelle d'un ''LXC''. Il se base sur [[#Systemd-nspawn|Systemd-nspawn]] (c'est lui qui est appelé en arrière plan) et travail exclusivement dans le répertoire <source lang="bash" inline>/var/lib/machines</source> (là où ''Systemd-nspawn'' s'adaptait au paramètre passé).
Cet outil ressemble plus à la gestion traditionnelle d'un ''LXC''. Il se base sur [[#Systemd-nspawn|Systemd-nspawn]] (c'est lui qui est appelé en arrière plan) et travail exclusivement dans le répertoire <syntaxhighlight lang="bash" inline>/var/lib/machines</syntaxhighlight> (là où ''Systemd-nspawn'' s'adaptait au paramètre passé).


==Mise en œuvre==
==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> :
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 <syntaxhighlight lang="bash" inline>systemd-container</syntaxhighlight> :


  apt install --no-install-recommends debootstrap systemd-container debian-archive-keyring
  apt install --no-install-recommends debootstrap systemd-container debian-archive-keyring
Ligne 227 : Ligne 229 :
  machinectl shell sid1
  machinectl shell sid1


''Note: Vous pouvez sinon tout bêtement copier votre conteneur précédent: <source lang="bash" inline>cp -a /root/conteneurs/buster1 /var/lib/machines/</source>.''
''Note: Vous pouvez sinon tout bêtement copier votre conteneur précédent: <syntaxhighlight lang="bash" inline>cp -a /root/conteneurs/buster1 /var/lib/machines/</syntaxhighlight>.''


Lors de l'exécution d'un conteneur par l'outil, le modèle de service <source lang="bash" inline>/lib/systemd/system/systemd-nspawn@.service</source> est utilisé. Ce dernier passe un ensemble de paramètres à la commande <source lang="bash" inline>systemd-nspawn</source> (qui lance réellement le conteneur, ''machinectl'' n'étant qu'une interface de gestion), dont le <source lang="bash" inline>-U</source> (utilisateur non privilégié), qui peut se retrouver bloquant pour certaines tâches. Si vous voulez outrepasser cette option, il faut spécifier l'usage du mode privilégié dans le [[#Fichier_de_configuration|fichier de configuration]] propre au conteneur avec le paramètre <source lang="bash" inline>PrivateUsers=0</source> (section <source lang="bash" inline>[Exec]</source>).
Lors de l'exécution d'un conteneur par l'outil, le modèle de service <syntaxhighlight lang="bash" inline>/lib/systemd/system/systemd-nspawn@.service</syntaxhighlight> est utilisé. Ce dernier passe un ensemble de paramètres à la commande <syntaxhighlight lang="bash" inline>systemd-nspawn</syntaxhighlight> (qui lance réellement le conteneur, ''machinectl'' n'étant qu'une interface de gestion), dont le <syntaxhighlight lang="bash" inline>-U</syntaxhighlight> (utilisateur non privilégié), qui peut se retrouver bloquant pour certaines tâches. Si vous voulez outrepasser cette option, il faut spécifier l'usage du mode privilégié dans le [[#Fichier_de_configuration|fichier de configuration]] propre au conteneur avec le paramètre <syntaxhighlight lang="bash" inline>PrivateUsers=0</syntaxhighlight> (section <syntaxhighlight lang="bash" inline>[Exec]</syntaxhighlight>).


==Commandes utiles==
==Commandes utiles==
Ligne 238 : Ligne 240 :
! Argument !! Signification
! Argument !! Signification
|-
|-
| <source lang="bash" inline>machinectl</source> ou <source lang="bash" inline>machinectl list</source> || Liste les conteneurs actifs
| <syntaxhighlight lang="bash" inline>machinectl</syntaxhighlight> ou <syntaxhighlight lang="bash" inline>machinectl list</syntaxhighlight> || Liste les conteneurs actifs
|-
|-
| <source lang="bash" inline>machinectl list-images</source> || Liste les conteneurs sans distinctions
| <syntaxhighlight lang="bash" inline>machinectl list-images</syntaxhighlight> || 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)
| <syntaxhighlight lang="bash" inline>machinectl start sid1</syntaxhighlight> || 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''
| <syntaxhighlight lang="bash" inline>machinectl poweroff sid1</syntaxhighlight> ou <syntaxhighlight lang="bash" inline>machinectl stop sid1</syntaxhighlight> || É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)
| <syntaxhighlight lang="bash" inline>machinectl terminate sid1</syntaxhighlight> || 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)
| <syntaxhighlight lang="bash" inline>machinectl clone sid sid1</syntaxhighlight> || Copie le conteneur (un <syntaxhighlight lang="bash" inline>cp -a /var/lib/machines/conteneur_source /var/lib/machines/conteneur_destination</syntaxhighlight> 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é)
| <syntaxhighlight lang="bash" inline>machinectl remove sid1</syntaxhighlight> || Supprime le conteneur (un <syntaxhighlight lang="bash" inline>rm -rf /var/lib/machines/conteneur_source conteneur_destination</syntaxhighlight> 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
| <syntaxhighlight lang="bash" inline>machinectl clean --all</syntaxhighlight> || 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>)  
| <syntaxhighlight lang="bash" inline>machinectl login sid1</syntaxhighlight> || 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: <syntaxhighlight lang="bash" inline><ctrl> + ]</syntaxhighlight>)  
|-
|-
| <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>
| <syntaxhighlight lang="bash" inline>machinectl shell sid1</syntaxhighlight> || Se connecte automatiquement au conteneur sans demander de mot de passe (identique à un <syntaxhighlight lang="bash" inline>chroot</syntaxhighlight> ou un <syntaxhighlight lang="bash" inline>su - utilisateur</syntaxhighlight> depuis ''root''). Pour sortir, il faut faire un <syntaxhighlight lang="bash" inline>exit</syntaxhighlight> ou <syntaxhighlight lang="bash" inline><ctrl> + d</syntaxhighlight>
|-
|-
| <source lang="bash" inline>machinectl enable sid1</source> || Ajoute le conteneur au démarrage système. Cela créer un lien symbolique de ''/lib/systemd/system/systemd-nspawn@.service'' dans ''/etc/systemd/system/machines.target.wants/''
| <syntaxhighlight lang="bash" inline>machinectl enable sid1</syntaxhighlight> || Ajoute le conteneur au démarrage système. Cela créer un lien symbolique de ''/lib/systemd/system/systemd-nspawn@.service'' dans ''/etc/systemd/system/machines.target.wants/''
|-
|-
| <source lang="bash" inline>machinectl disable sid1</source> || Enlève le conteneur du démarrage système
| <syntaxhighlight lang="bash" inline>machinectl disable sid1</syntaxhighlight> || Enlève le conteneur du démarrage système
|-
|-
| <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
| <syntaxhighlight lang="bash" inline>machinectl copy-to sid1 ~/Documents/proc.jpeg /root/image.jpg</syntaxhighlight> || 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
| <syntaxhighlight lang="bash" inline>machinectl copy-from sid1 /root/xyz abc</syntaxhighlight> || 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)
| <syntaxhighlight lang="bash" inline>machinectl export-tar sid1 /tmp/sid1.tar.gz</syntaxhighlight> || 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.
| <syntaxhighlight lang="bash" inline>machinectl import-tar /tmp/sid1.tar.gz sid2</syntaxhighlight> || Importe un conteneur précédemment sauvegardé. En dehors des deux dernières commandes, ces opérations sont réalisables manuellement via les commandes standards.
|}
|}
==Utiliser fuse==
Dans un conteneur non privilégié, l'utilisation du module noyau fuse n'est pas autorisé.
Pour le [https://wiki.archlinux.org/title/Systemd-nspawn#Run_docker_in_systemd-nspawn permettre], il faut ajouter le paramètre suivant dans le fichier de configuration du conteneur (<syntaxhighlight lang="bash" inline>/etc/systemd/nspawn/monConteneur.nspawn</syntaxhighlight> pour l'exemple) :
<syntaxhighlight lang="ini">
[Files]
Bind=/dev/fuse
</syntaxhighlight>
Il convient ensuite d'affecter la propriété s'y afférent au service du conteneur avec la commande suivante :
systemctl set-property systemd-nspawn@monConteneur DeviceAllow='/dev/fuse rwm'
{{info|Ceci va jouter la ligne <syntaxhighlight lang="bash" inline>DeviceAllow=/dev/fuse rwm</syntaxhighlight> au fichier <syntaxhighlight lang="bash" inline>/etc/systemd/system.control/systemd-nspawn@monConteneur.service.d/50-DeviceAllow.conf</syntaxhighlight> qui est concaténé à la volée au service <syntaxhighlight lang="bash" inline>/etc/systemd/system/machines.target.wants/systemd-nspawn@monConteneur.service</syntaxhighlight> (fichier à ne pas éditer à la main - utiliser <syntaxhighlight lang="bash" inline>systemctl edit systemd-nspawn@monConteneur.service</syntaxhighlight> si une modification est à apporter, ce qui créera <syntaxhighlight lang="bash" inline>/etc/systemd/system/systemd-nspawn@monConteneur.service.d/override.conf</syntaxhighlight>).}}


=Sources=
=Sources=

Dernière version du 12 mai 2023 à 23:33

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 ou conteneuriser une production.

Il existe deux façons de procéder :

  1. Systemd-nspawn, réalise une exécution simple, manuelle 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.
  2. Machinectl, s'apparente plus à LXC (il est pour Nspawn ce qu'est Libvirt pour Qemu) en proposant, notamment, un démarrage automatique configurable des conteneurs avec le système ainsi qu'un attachement/détachement à leur console. 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

Installation des paquets

apt install --no-install-recommends debootstrap systemd-container debian-archive-keyring

Note: seul systemd-container est nécessaire au fonctionnement des conteneurs.

Création d'un répertoire d'accueil

mkdir -p ~/conteneurs && 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 --include=systemd-container permet d'installer ledit paquet dans le système invité (au passage, ce paquet doit être présent dans le conteneur pour pouvoir être utilisé avec la fonction login de Machinectl). Vous pouvez en préciser plusieurs en les séparent par des virgules.

ATTENTION

Si la commande vous renvoie un message du genre:
/usr/sbin/debootstrap: 1578: /usr/sbin/debootstrap: cannot create /tmp/conteneurs/modèle.buster/test-dev-null: Permission denied
E: Cannot install into target '/tmp/conteneurs/modèle.buster' mounted with noexec or nodev

c'est que le système de fichiers cible ne supporte pas l'exécution de binaires (ce serai le cas de certains d'entre eux dans un volume Luks non root). Là en l’occurrence c'est par ce que mon /tmp est un tmpfs (mais on va partir du principe qu'il s'agit d'un /home/toto). Pour corriger cela, il faut remonter le système de fichier avec les bons paramètres: mount -i -o remount,exec,dev /home/toto.

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).

Se connecter au conteneur sans le démarrer (identique à un chroot)

systemd-nspawn -D modèle.buster

Si vous rencontrez une impossibilité de vous connecter au shell de votre conteneur par la suite, 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 et supprimera l'historique Bash avant de quitter le conteneur.

passwd
history -c
<ctrl+d>

Copie du modèle

cp -a modèle.buster buster1

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 cela, il faudra se tourner vers Machinectl). Pour sortir, il faut soit é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: <ctrl> + ].

Paramétrage

Pour aller plus loin, il est possible de passer un ensemble de paramètres via un fichier de configuration propre au conteneur ainsi qu'à la ligne de démarrage précédente (les deux modes de configuration peuvent être combinés) afin d'affiner l'usage du conteneur. Je vous recommande la lecture des pages de manuel (très bien faites) cités en sources au bas de la page.

Réseau

Avec la commande précédente, le conteneur va se lancer avec l'ensemble des interfaces réseaux de l'hôte, ce qui peux s'avérer utiles dans les cas où l'on veut proposer un service à un ensemble de VLAN sans routage par exemple ou pour exécuter une application comme depuis l'hôte.

Cependant, si l'on veut que notre conteneur soit limité à un ou plusieurs réseaux, il existe une section dédiée dans le manuel. J'affectionne tout particulièrement l'usage de --network-interface qui permet de déplacer une interface veth dans l'espace de nom réseau du conteneur (ces interfaces doivent au préalable être créées). Ce paramètre peut être utilisé plusieurs fois afin de mettre notre système invité dans plusieurs VLAN par exemple:

# Allumage de l'interface servant les services des conteneurs (reliée à un commutateur matériel)
ip link set eth2 up

# Création du pont avec gestion du 802.1Q
ip link add br0 type bridge vlan_filtering 1
ip link set br0 up

# Ajout de l'interface physique au pont
ip link set eth2 master br0

# Désactivation du VLAN par défaut sur le pont afin de l'isoler
bridge vlan del dev br0 vid 1 self
bridge vlan del dev eth2 vid 1 master

### Création et configuration des interfaces VLAN ###
# Interface vlan 180
ip link add link br0 name vlan180 type vlan id 180
ip link set vlan180 up
ip address add 2001:db8:0:180::1/64 dev vlan180
bridge vlan add dev br0 vid 180 tagged self
bridge vlan add dev eth2 vid 180 tagged master

# Interface vlan 181
ip link add link br0 name vlan181 type vlan id 181
ip link set vlan181 up
ip address add 2001:db8:0:181::1/64 dev vlan181
bridge vlan add dev br0 vid 181 tagged self
bridge vlan add dev eth2 vid 181 tagged master
######

# Création du couple de VETH pour interfacer mon conteneur "apache" avec le VLAN 180
ip link add apache180_c type veth peer name apache180_h
ip link set apache180_h up
ip link set apache180_h master br0
bridge vlan del dev apache180_h vid 1 PVID untagged master
bridge vlan add dev apache180_h vid 180 pvid untagged master

# Création du couple de VETH pour interfacer mon conteneur "apache" avec le VLAN 181
ip link add apache181_c type veth peer name apache181_h
ip link set apache181_h up
ip link set apache181_h master br0
bridge vlan del dev apache181_h vid 1 PVID untagged master
bridge vlan add dev apache181_h vid 181 pvid untagged master

# Démarrage de mon conteneur apache
systemd-nspawn -b --network-interface=apache180_c --network-interface=apache181_c -D /root/conteneurs/apache

Le réseau dans mon conteneur est définit comme suit:

vim /root/conteneurs/apache/etc/network/interfaces
auto lo
iface lo inet loopback
        up /usr/local/bin/confint
vim /root/conteneurs/apache/usr/local/bin/confint
#!/bin/bash

# Configuration des interfaces
ip addr add fd00:0:0:180::a0/64 dev apache180_c
ip link set apache180_c up

ip addr add fd00:0:0:181::a0/64 dev apache181_c
ip link set apache181_c up
chmod u+x /root/conteneurs/apache/usr/local/bin/confint

Éphémérité

Il est également possible de lancer le conteneur en mode éphémère via un instantané (avec BTRFS ou XFS) ou via une copie liée reflinks (avec EXT4) en utilisant le paramètre -x. Ceci offre une liberté non négligeable pour vos tests vous puisque vous pouvez tout péter, une extinction supprimera l'instantané et votre conteneur n'aura pas été modifié d'un bit. Cerise sur le gâteau, un redémarrage du conteneur éphémère ne supprime pas cet instantané donc vous pouvez même tester des applications nécessitant un redémarrage contrairement aux Squashfs !

Encore plus fou, il est possible de conteneuriser son propre système alors qu'il est lui-même démarré !

systemd-nspawn -bxD /

Lorsque le conteneur est utilisé avec un fichier de configuration, la journalisation doit être désactivée pour pouvoir le démarrer en mode éphémère. Les paramètres de configuration sont :

LinkJournal=no
Ephemeral=on

À mettre dans la section [Exec].

Montage

Il est possible de monter des arborescences dans les conteneurs directement depuis la ligne de commande. Dans le cas d'un usage de ces notions dans un fichier de configuration, ces paramètres sont à placer dans la section [Files].

Les options sont combinables.

Montage lié

L'outil permet de copier le comportement d'un mount --bind via le paramètre --bind. En voici un exemple :

mkdir -p /tmp/toto/{titi,tata/{tutu,tyty}}
systemd-nspawn --bind=/tmp/toto:/mnt -bxD /root/conteneurs/apache/

Ceci aura pour effet de monter le contenu du répertoire /tmp/toto/ de l'hôte dans le répertoire /mnt/ de l'invité (en cas d'omission de ce dernier paramètre, le répertoire sera monté dans le même que l'hôte).

Le paramètre de configuration est Bind=/tmp/toto:/mnt (section [Files]).

ASTUCE

Il est également possible de passer un fichier (régulier, spécial, bloc...) à un conteneur via cette méthode.

Montage tmpfs

Il est possible de monter un tmpfs dans le conteneur afin de disposer d'un ramdisk. Après les :, les paramètres sont les même que pour un tmpfs traditionnel.

systemd-nspawn --tmpfs=/tmp/ramdisk:rw,size=2G -bxD /root/conteneurs/apache/

Le répertoire /tmp/ramdisk est monté dans l'invité en tmpfs en lecture/écriture et limité à 2Go.

Le paramètre de configuration est TemporaryFileSystem=/tmp/ramdisk:rw,size=2G (section [Files]).

Montage superposé

Un ou plusieurs montages superposés (overlay) peuvent être ajoutés. Le premier répertoire sert de base en lecture seule et le second enregistre les modifications tandis que le troisième sera le point de montage final (son omission présente la même arborescence que l'hôte).

mkdir -p /tmp/{ycharbi/{1,2,3/{3.1,3.2}},lesmorin}
systemd-nspawn --overlay=/tmp/ycharbi:/tmp/lesmorin:/toto -bxD /root/conteneurs/apache/

Le paramètre de configuration est Overlay=/tmp/ycharbi:/tmp/lesmorin:/toto (section [Files]).

Non privilégié

Un conteneur Nspawn peut-être exécuté dans un espace de noms utilisateur afin de cloisonner les privilèges du root invité (cela rend encore plus compliqué le piratage du système puisque en plus d'exploiter une faille pour sortir du conteneur, l'attaquant devra également user d'une élévation de privilèges pour nuire) via le paramètre -U.

Tout cumulé, on en arrive à la commande suivante :

systemd-nspawn -b --network-interface=apache_c -xUD /root/conteneurs/apache

Le paramètre de configuration est PrivateUsers=pick (section [Exec]).

Fichier de configuration

Pour chaque conteneurs démarrés, Systemd-nspawn va regarder le contenu des fichiers de configuration présents dans les répertoires suivants (qui n'existent pas forcément, il suffit de créer celui qui vous chante) :

  • /etc/systemd/nspawn/machine.nspawn
  • /run/systemd/nspawn/machine.nspawn
  • /var/lib/machines/machine.nspawn


Vous pouvez donc définir des configurations personnalisées pour chacun des conteneurs que vous exécuterez afin d'alléger leur commande de démarrage (le nom du fichier doit être identique au nom du conteneur). La syntaxe est documenté dans le manuel dédié. Ces fichiers sont bien entendus également utilisés par Machinectl. Vous pouvez donc paramétrer vos conteneurs gérés par cet outil.

Par exemple, un fichier de configuration correspondant à cette ligne de commande: systemd-nspawn -b --network-interface=apache180_c --network-interface=apache181_c -D /root/conteneurs/apache est le suivant (/etc/systemd/nspawn/apache.nspawn) :

[Exec]
Boot=on

[Network]
Interface=apache180_c
Interface=apache181_c

Il est à noté que les paramètres sont à mettre sous les bonnes sections comme dans un service Systemd. Faites-y attention lors de la lecture du manuel.

ATTENTION

Nous avons constaté un bogue dans le cas de l'utilisation d'une option de montage (le Bind= dans notre cas) avec l'option -x de systemd-nspawn (le montage ne se fait pas et aucune erreur ne se produit). Si vous voulez effectuer ce type de montage sur un conteneur éphémère, il faut préciser le paramètre dans le fichier de configuration comme ceci: Ephemeral=on sous la section [Exec].

Machinectl

Cet outil ressemble plus à la gestion traditionnelle d'un LXC. Il se base sur Systemd-nspawn (c'est lui qui est appelé en arrière plan) et travail exclusivement dans le répertoire /var/lib/machines (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 systemd-container :

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

Note: Vous pouvez sinon tout bêtement copier votre conteneur précédent: cp -a /root/conteneurs/buster1 /var/lib/machines/.

Lors de l'exécution d'un conteneur par l'outil, le modèle de service /lib/systemd/system/systemd-nspawn@.service est utilisé. Ce dernier passe un ensemble de paramètres à la commande systemd-nspawn (qui lance réellement le conteneur, machinectl n'étant qu'une interface de gestion), dont le -U (utilisateur non privilégié), qui peut se retrouver bloquant pour certaines tâches. Si vous voulez outrepasser cette option, il faut spécifier l'usage du mode privilégié dans le fichier de configuration propre au conteneur avec le paramètre PrivateUsers=0 (section [Exec]).

Commandes utiles

Voici les commandes utiles :

Argument Signification
machinectl ou machinectl list Liste les conteneurs actifs
machinectl list-images Liste les conteneurs sans distinctions
machinectl start sid1 Démarre le conteneur et rend la main (il se comporte comme un service)
machinectl poweroff sid1 ou machinectl stop sid1 Éteint le conteneur sid1 proprement, stop est un alias de poweroff
machinectl terminate sid1 Tue le conteneur (force l'arrêt)
machinectl clone sid sid1 Copie le conteneur (un cp -a /var/lib/machines/conteneur_source /var/lib/machines/conteneur_destination fait la même chose)
machinectl remove sid1 Supprime le conteneur (un rm -rf /var/lib/machines/conteneur_source conteneur_destination fait la même chose si tant est qu'il est bien arrêté)
machinectl clean --all Supprime tout les conteneurs
machinectl login sid1 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: <ctrl> + ])
machinectl shell sid1 Se connecte automatiquement au conteneur sans demander de mot de passe (identique à un chroot ou un su - utilisateur depuis root). Pour sortir, il faut faire un exit ou <ctrl> + d
machinectl enable sid1 Ajoute le conteneur au démarrage système. Cela créer un lien symbolique de /lib/systemd/system/systemd-nspawn@.service dans /etc/systemd/system/machines.target.wants/
machinectl disable sid1 Enlève le conteneur du démarrage système
machinectl copy-to sid1 ~/Documents/proc.jpeg /root/image.jpg 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
machinectl copy-from sid1 /root/xyz abc Même chose dans l'autre sens. Permet de récupérer un fichier/dossier
machinectl export-tar sid1 /tmp/sid1.tar.gz Réalise une sauvegarde du conteneur sous forme d'archive compressée (tar.gz)
machinectl import-tar /tmp/sid1.tar.gz sid2 Importe un conteneur précédemment sauvegardé. En dehors des deux dernières commandes, ces opérations sont réalisables manuellement via les commandes standards.

Utiliser fuse

Dans un conteneur non privilégié, l'utilisation du module noyau fuse n'est pas autorisé.

Pour le permettre, il faut ajouter le paramètre suivant dans le fichier de configuration du conteneur (/etc/systemd/nspawn/monConteneur.nspawn pour l'exemple) :

[Files]
Bind=/dev/fuse

Il convient ensuite d'affecter la propriété s'y afférent au service du conteneur avec la commande suivante :

systemctl set-property systemd-nspawn@monConteneur DeviceAllow='/dev/fuse rwm'

INFORMATION

Ceci va jouter la ligne DeviceAllow=/dev/fuse rwm au fichier /etc/systemd/system.control/systemd-nspawn@monConteneur.service.d/50-DeviceAllow.conf qui est concaténé à la volée au service /etc/systemd/system/machines.target.wants/systemd-nspawn@monConteneur.service (fichier à ne pas éditer à la main - utiliser systemctl edit systemd-nspawn@monConteneur.service si une modification est à apporter, ce qui créera /etc/systemd/system/systemd-nspawn@monConteneur.service.d/override.conf).

Sources