53 votes

Démarrer un service systemd à l'intérieur d'un chroot à partir d'un rootfs non basé sur systemd

Avec init scripts (ou avec openrc), j'ai toujours pu lancer des services à partir d'une racine d'installation différente.
mais quand je cours chroot /somepath/to_root /usr/bin/systemctl start someservice J'ai obtenu :

Running in chroot, ignoring request.

Existe-t-il un moyen de forcer systemd à lancer le service ?

更新しています。
J'ai oublié de dire que mon système hôte exécute des scripts init ou openrc, mais jamais systemd, et que j'utilise chroot pour dépanner des systèmes Unix qui ne peuvent même pas lancer un scripts minimal.

41voto

MariusMatutiae Points 45233

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 ?

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

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

10voto

Nick Chadwick Points 551

Plusieurs années plus tard, je dois admettre qu'il n'y a qu'une seule solution à la plupart des problèmes pratiques de Systemd. Parce que l'erreur est Systemd lui-même

J'en ai vraiment marre de Systemd car j'ai eu des problèmes que je n'avais jamais rencontrés avec des choses comme Upstart ou Openrc :

  • L'application d'un noyau nécessitant le support des cgroups (au lieu d'être facultatif mais activé par défaut dans un fichier de configuration) même pour les systèmes embarqués ne disposant que de 24 Mo de mémoire vive et pas de mémoire inscriptible.
    Les partisans de cette solution soutiennent que le fait de ne pas pouvoir l'utiliser dans un tel cas est un comportement souhaitable puisqu'il n'a pas été conçu pour cela, la réalité est que les autres systèmes init ne s'en soucient pas non plus alors que dans systemd cette fonctionnalité ne fait pas l'objet d'un projet séparé ce qui met en évidence une fois de plus les conséquences de ne pas suivre les règles du jeu. baiser .
  • Malgré la revendication de modularité, à l'exécution, l'enfer des dépendances en fait un solide objet divin : vous voulez démarrer sur un seul rootfs reiser4 ? Ce n'est pas possible car de nombreux programmes nécessitent systemd-udevd qui exige systemd-init qui exige que le systemd-boot qui ne peut pas être installé en même temps que le paquet grub2 ni ne peut lire les images du noyau d'une partition reiser4.
  • Vous souhaitez vous connecter à l'internet par le biais d'un accès commuté Bluetooth ? Si cela ne fonctionne pas avec votre téléphone Samsung java me, vous ne pouvez pas exécuter les scripts et les logiciels de ligne de commande qui fonctionnaient auparavant manuellement à cause de networkd .
  • Bien que je reconnaisse que le plus gros problème se pose si vous construisez et maintenez votre propre distribution Linux : le module d'initialisation systemd lui-même a tellement de dépendances que vous ne pouvez pas proposer de choisir un autre système d'initialisation par le biais de différents paquets d'installation.
  • L'utilisation par défaut de Google dns pour systemd si aucun résolveur n'est défini en termes de confidentialité .
  • L'impossibilité de lancer un processus de non service en arrière-plan et de se déconnecter, car il n'y a pas de moyen simple de le faire dans un logiciel de gestion de l'information. nouveau champ d'application de systemd .
  • Bonne chance pour visualiser les logs si vous ne pouvez pas chrooter dans votre système ou si vous avez mis à jour depuis libdb4.8. (alors qu'au moins, dans le pire des cas, Microsoft a ses fichiers journaux au format xml) .

La seule solution :

Systemd est inutilement complexe pour résoudre des problèmes : comme alsa au lieu de ossv4. Donc si vous avez quelque chose qui utilise systemd, effacez toutes les données :

dd if=/dev/urandom of=/dev/dm0 bs=1M

et installer quelque chose qui ne l'utilise pas du tout tout en résolvant les problèmes de SysV Init comme Gentoo avec Openrc .
En ce qui concerne ma question, systemd fait les choses comme le registre de Windows® : si une partie de celui-ci se dérègle, c'est fini.

9voto

johnP Points 121

systemd n'ignore que les "services", je me contente donc d'exécuter les commandes du démon manuellement.

Ainsi, au lieu de

service sshd start

Utilizo

/usr/sbin/sshd -D &

3voto

James Mertz Points 390

Non. Les services sont exécutés par systemd (pid 1), et non par systemctl directement (qui n'envoie qu'une requête de démarrage), et puisque systemd tourne en dehors du chroot, le service le fera aussi.

Bien qu'il soit techniquement possible d'implémenter cela (en faisant en sorte que systemctl transmette sa racine à systemd), il est peu probable que cela se produise puisqu'il existe déjà un outil pour créer des conteneurs complets ( systemd-nspawn /somepath/to_root ). Vous pouvez toujours contacter le liste de diffusion mais

2voto

reddot Points 388

J'ai rencontré ce problème une fois en essayant d'ouvrir le réseau en mode secours en utilisant la configuration réseau à partir de chroot. Finalement, cela a fonctionné pour moi :

service --skip-redirect <service> restart

ou :

SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X