Un problème bien connu dans les distros systemd (Arch Linux, OpenSUSE, Fedora).
Systemd remplace sysvinit et offre un grand avantage par rapport à ce dernier. Dans sysvinit, lorsque vous demandez à un service de démarrer, il hérite du contexte d'exécution de la personne qui invoque le script, ce qui inclut les variables d'environnement, les ulimits, et ainsi de suite. Systemd améliore cela au contraire en notifiant un démon, qui va démarrer le service dans un environnement bien défini, sain, constant, où bien sûr les performances des services sont beaucoup plus faciles à prédire, puisque l'environnement est toujours le même.
Cela implique que, lorsque j'appelle systemctl depuis le chroot, le fait que je sois dans le chroot n'a pas d'importance, l'environnement qui sera hérité est toujours celui du PID 1, et non mon environnement actuel. Mais il y a pire : comme les sockets de communication sont placés dans /run/systemd, un processus dans un chroot ne pourra même pas parler au système init !
Alors, comment faire pour chrooter dans les distros systemd ?
-
Si tout ce que vous voulez, c'est avoir un conteneur Linux, cette page Wiki Arch vous explique comment mettre en place un conteneur Linux en moins de 30 secondes, grâce à l'application systemd-nspawn
.
-
Si au contraire vous souhaitez vraiment un environnement chroot, cette page Web magnifique et claire comme de l'eau de roche vous fournira deux solutions pratiques (la seconde est une version modifiée de celle proposée au point 1).