Y a-t-il un moyen de voir l'arbre d'exécution de systemd?

63

Ce que je veux dire sous la question est: est-il possible de vider la liste ordonnée (comme pstree pour les processus) pour voir comment systemd a exécuté l'ensemble d'unités fourni, c'est-à-dire l'arbre après la résolution des dépendances et la mise en file d'attente des travaux pour l'exécution ? Je sais que vous pouvez le faire en analysant les données d'état de systemd, mais existe-t-il un moyen rapide de voir un tel arbre? Cela aiderait beaucoup dans une enquête sur un échec (par exemple, si vous voyez que le processus de démarrage est bloqué sur une unité, vous serez en mesure de localiser l'emplacement approximatif de votre enquête plus approfondie.

galaxie
la source
J'ai créé un outil de visualisation pour systemd. Vous pouvez vérifier et essayer l'outil dans github.com/ywiyogo/systemd-visual
Yongkie

Réponses:

71

systemd-analyzeest votre ami. Par exemple, systemd-analyze critical-chainaffiche l'arbre de blocage des démons. Le mien par exemple:

graphical.target @20.211s
└─multi-user.target @20.211s
  └─nginx.service @19.348s +862ms
    └─network.target @19.347s
      └─NetworkManager.service @10.315s +9.031s
        └─basic.target @10.312s
          └─timers.target @10.311s
            └─systemd-tmpfiles-clean.timer @10.311s
              └─sysinit.target @10.295s
                └─systemd-update-utmp.service @10.167s +127ms
                  └─systemd-tmpfiles-setup.service @10.124s +41ms
                    └─local-fs.target @10.097s
                      └─home-entd-Downloads.mount @10.093s +2ms
                        └─home.mount @9.326s +672ms
                          └─[email protected] @8.472s +696ms
                            └─dev-sda6.device @8.471s

NetworkManager, par exemple, contient essentiellement le démarrage complet.

Si vous voulez avoir une vue plus détaillée, vous pouvez rendre la chaîne d'exécution entière dans un fichier svg. systemd-analyze plot > something.svgaffiche la chaîne entière (plus de 120 modules) sous forme de barres de progression dans un fichier svg haute résolution, qui indique les états, les blocages et d'autres problèmes.

Enfin, vous avez un systemd-analyze dotoutil qui sort un fichier point qui sort une hiérarchie entière: systemd-analyze dot | dot -Tpng -o stuff.png avec l’outil point, vous pouvez aussi le sortir sous forme de fichier ps et svg.

Tous les outils ci-dessus sont intégrés à l'outil systemd-analysis qui est fourni par défaut avec systemd au moins dans archlinux. Je pense qu’il existe également des projets de tierces parties.

IBr
la source
Merci pour votre réponse, mais cela ne répond pas aux questions et ne fait que réitérer certaines parties de ma question (j'ai mentionné que je connaissais un moyen de le faire en analysant les données d'état de systemd). La question est donc de savoir comment obtenir une arborescence de la séquence de démarrage ressemblant à pstree après la résolution de toutes les dépendances (par exemple, post-démarrage). La chaîne critique est presque la même (malgré le fait qu'il s'agisse d'une arborescence ascendante) mais ne répertorie pas toutes les unités démarrées. Ce qui est demandé dans la question: un arbre qui répertorie chaque unité exécutée jusqu’à un moment donné (par exemple, frapper le fichier multi-utilisateurs.target).
galaxie
4
systemd-analyze plot > something.svgest plein trois d'exécution avec des cibles (il est plus proche de ce que vous voulez). systemd-analyse est un graphe complet des dépendances (c'est la représentation la plus correcte). Ne sont-ce pas ce que vous voulez? Dans l'intrigue, il suffit de trouver la cible et de voir ce qu'il faut aussi faire fonctionner. Les mêmes dépendances sont exactement listées graph, si vous voulez créer une boîte à outils d’analyse graphique et sélectionner le point du graphe pour lequel vous voulez voir les dépendances (l’outil Point a plus de paramètres). Voir la page de manuel: freedesktop.org/software/systemd/man/systemd-analyze.html - order and similar
IBr
1
Extrait de la page de manuel: Ceci trace toutes les dépendances de toute unité dont le nom commence par "avahi-daemon.": $ systemd-analyze dot 'avahi-daemon.*' | dot -Tsvg > avahi.svg $ eog avahi.svgCeci trace les dépendances entre toutes les unités cibles connues:systemd-analyze dot --to-pattern='*.target' --from-pattern='*.target' | dot -Tsvg > targets.svg $ eog targets.svg
IBr
1
IBr, mais cela est malheureusement inutilisable dans la console texte. J'apprécie vraiment le temps que vous avez consacré à la réponse (et c'est correct si vous souhaitez obtenir des données à analyser), mais cela ne répond pas à la question initiale, je peux donc l'accepter. Pardon.
galaxie
1
OK pas de problème. J'adore les outils de ligne de commande moi-même :)
IBr
13

Peut encore ne pas répondre complètement à votre question mais essayez avec --fuzzoption

systemd-analyze critical-chain --fuzz 1h

Notez que vous pouvez également spécifier l' unité de voir leur chaîne critique , de sorte que vous n'êtes pas limité à la multi-user.target

systemd-analyze critical-chain network.target local-fs.target

J'espère que cela t'aides

Ludovic Ronsin
la source
12

Je ne suis pas sûr de bien comprendre la question, mais il existe des visualisations d'arborescence avec les commandes suivantes:

sudo systemctl status

Et aussi :

sudo systemctl list-dependencies 

J'espère que cela t'aides :)

En outre, il pourrait être utile à d’autres fins de construire une arborescence des dossiers des liens symboliques systemctl:

tree /etc/systemd/system

En fait, il était vraiment utile de détecter les anciennes / unités boguées qui ralentissaient le démarrage de mon système, puis de les désactiver à l’aide de la systemctl disablecommande.

MODIFIER

Cela dit, je suis vraiment d’accord avec le PO pour dire que cette fonctionnalité de base devrait être fournie via des outils en ligne de commande, et non un outil graphique ... Et si vous ne pouvez pas démarrer X? Comment gérez-vous votre fichier svg alors?

En fait, il y a un moyen. Si vous ne pouvez pas utiliser scp(outil ssh) pour récupérer votre fichier sur un autre ordinateur, cela fbipourrait vous aider :)

sudo systemd-analyze plot > /home/user/startup.svg
fbi /home/user/startup.svg

A travaillé dans mes ATS. Il suffit de naviguer à l'intérieur de l'image avec des flèches. Il y a des options de zoom, pour lister faire fbi -h.

Encore j'espère que cela aide. Il est disponible dans les dépôts Archlinux et Ubuntu.

EDIT 2:

fbine fonctionne pas sur ssh. Vous pouvez effectuer un transfert X de cette manière ssh -Y user@server, mais vous avez besoin d’un serveur X fonctionnant sur votre serveur distant.

Le meilleur pari ici est d'utiliser sshfs. Cela fonctionne très bien dans l'espace utilisateur, par exemple avec Nautilus. Il y a une petite configuration à faire, voir:

sudo vim /etc/fuse.conf #type a, uncomment the user_allow_other line and ESC :wq
sudo mkdir /mnt/yourmountingdir
sudo chown user:user /mnt/yourmountingdir
sshfs [email protected]:/home/user /mnt/yourmountingdir/ -o allow_other #Asks for host trusting and password
sudo fusermount -u /mnt/yourmountingdir/ #To disconnect and unmount
Joel.O
la source
La question concerne l’arbre d’exécution de toutes les unités activées que systemd a traversées après la résolution de la dépendance. Donc, cette réponse est un échec.
Galaxie
Peut-être que votre question est bien adaptée à une demande de fonctionnalité? Bien sûr, cela aiderait. Quoi qu’il en soit, j’ai posté cette réponse après avoir trébuché sur votre question car elle ressemblait à une autre question sur laquelle j’avais besoin d’informations, et j’ai eu le sentiment qu’il manquait quelques exemples élémentaires (comme ce que vous avez essayé et qui n’a pas fonctionné). aidé à clarifier), en particulier pour les personnes comme moi qui luttent après avoir perdu System v init et leur fichier pratique rc.conf. Désolé ma réponse ne correspondait pas. Ne vaut pas un downvote cependant.
Joel.O
Édité avec une solution de contournement à votre problème. J'espère que ça aide encore.
Joel.O
Je ne pouvais pas utiliser FBI sur SSH sur mon serveur. Mais sshfsfonctionne encore mieux. Voir EDIT 2.
Joel.O