Czy istnieje sposób, aby zobaczyć drzewo wykonania systemd?

63

Mam na myśli następujące pytanie: czy istnieje sposób na zrzucenie uporządkowanej listy (jak pstree robi dla procesów), aby zobaczyć, jak systemd wykonał dostarczony zestaw jednostek, tj. Drzewo po rozwiązaniu zależności i kolejkowaniu zadań do wykonania ? Wiem, że możesz to zrobić, analizując dane stanu systemowego, ale czy istnieje szybki sposób, aby zobaczyć takie drzewo? Bardzo by to pomogło w badaniu awarii (np. Jeśli zauważysz, że proces rozruchu utknął na jakiejś jednostce, będziesz w stanie wskazać przybliżoną lokalizację do głębszego badania.

galaktyka
źródło
Stworzyłem narzędzie do wizualizacji dla systemd. Możesz sprawdzić i wypróbować narzędzie w github.com/ywiyogo/systemd-visual
Yongkie

Odpowiedzi:

71

systemd-analyzejest twoim przyjacielem. Na przykład systemd-analyze critical-chainwyniki blokują drzewo demonów. Mój na przykład:

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 na przykład w zasadzie trzyma cały rozruch.

Jeśli chcesz mieć bardziej szczegółowy widok, możesz renderować cały łańcuch wykonania w pliku svg. systemd-analyze plot > something.svgwysyła cały łańcuch (ponad 120 modułów) jako paski postępu do pliku svg wysokiej rozdzielczości, który pokazuje stany, które są zablokowane i inne problemy.

Wreszcie masz systemd-analyze dotnarzędzie, które generuje plik kropkowy, który generuje całą hierarchię: systemd-analyze dot | dot -Tpng -o stuff.png za pomocą narzędzia kropkowego możesz wyprowadzać go również jako pliki ps i svg.

Wszystkie powyższe narzędzia są wbudowane w narzędzie analizy systemowej, które jest domyślnie dostarczane z systememd przynajmniej w archlinuxie. Wydaje mi się, że istnieją też projekty stron trzecich.

IBr
źródło
Dziękuję za twoją odpowiedź, jednak nie odnosi się ona do pytań i po prostu powtarza części mojego pytania (wspomniałem, że znam sposób, jak to zrobić, analizując dane o stanie systemu). Stąd pytanie brzmi, jak uzyskać drzewo pstree sekwencji rozruchowej po rozwiązaniu wszystkich zależności (np. Po uruchomieniu). Łańcuch krytyczny jest prawie nim (pomimo tego, że jest to oddolne drzewo), ale nie zawiera listy wszystkich rozpoczętych jednostek. Co jest zadawane w pytaniu: drzewo, które zawiera listę każdej pojedynczej jednostki, która została wykonana do pewnego momentu (np. Uderzenie w multi-user.target).
galaktyka
4
systemd-analyze plot > something.svgjest pełna trzy wykonanie z celami (jest najbliżej tego, czego chcesz). kropka analizowana systemowo jest pełnym wykresem zależności (jest najbardziej poprawną reprezentacją). Czy to nie to, czego chcesz? W fabule po prostu znajdź cel i zobacz, czego on też potrzebuje. Te same zależności są dokładnie wymienionymi wykresami, jeśli to znacznie uruchomi jakiś zestaw narzędzi do analizy wykresów i wybierz punkt wykresu, dla którego chcesz zobaczyć zależności (narzędzie kropki ma więcej ustawień). Zobacz stronę podręcznika : freedesktop.org/software/systemd/man/systemd-analyze.html - zamówienie i podobne
IBr
1
Od strony man: działki to wszystkie zależności jakiejkolwiek jednostki, której nazwa zaczyna się od: „avahi-demona.” $ systemd-analyze dot 'avahi-daemon.*' | dot -Tsvg > avahi.svg $ eog avahi.svgTo działki zależności pomiędzy wszystkimi znanymi jednostkami docelowymi:systemd-analyze dot --to-pattern='*.target' --from-pattern='*.target' | dot -Tsvg > targets.svg $ eog targets.svg
IBR
1
IBr, ale niestety nie można tego użyć w konsoli tekstowej. Naprawdę doceniam czas, który poświęciłeś na odpowiedź (i jest poprawne, jeśli chcesz uzyskać dane do analizy), ale nie odnosi się to do pierwotnego pytania, więc mogę je zaakceptować. Przepraszam.
galaktyka
1
Ok, nie ma problemu. Sam uwielbiam narzędzia wiersza poleceń :)
IBr
13

Może nadal nie w pełni odpowiedzieć na twoje pytanie, ale spróbuj z --fuzzopcją

systemd-analyze critical-chain --fuzz 1h

Uwaga Można także określić jednostkę s , aby zobaczyć ich krytyczną łańcuch , więc nie jesteś ograniczony do multi-user.target

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

Mam nadzieję że to pomoże

Ludovic Ronsin
źródło
12

Nie jestem pewien, czy właściwie rozumiem pytanie, ale dostępne są wizualizacje drzewa za pomocą następujących poleceń:

sudo systemctl status

I również :

sudo systemctl list-dependencies 

Mam nadzieję że to pomoże :)

Ponadto może być przydatne do innych celów zbudowanie drzewa folderów dowiązań systemowych systemctl:

tree /etc/systemd/system

Naprawdę przydało się wykrycie starych / błędnych jednostek, które spowalniały uruchamianie mojego systemu, a następnie ich wyłączenie za pomocą systemctl disablepolecenia.

EDYTOWAĆ

To powiedziawszy, naprawdę zgadzam się z PO, że tę podstawową funkcjonalność należy zapewnić za pomocą narzędzi wiersza poleceń, a nie narzędzia graficznego ... Co jeśli nie możesz uruchomić X-a? Jak sobie radzisz z plikiem SVG?

Właściwie istnieje sposób. Jeśli nie możesz użyć scp(narzędzia ssh) do pobrania pliku na innym komputerze, fbimoże ci to pomóc :)

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

Pracowałem w moich TTY. Po prostu nawiguj wewnątrz obrazu za pomocą strzałek. Dostępne są opcje powiększania fbi -h.

Znów mam nadzieję, że to pomoże. Jest dostępny w repozytoriach Archlinux i Ubuntu.

EDYCJA 2:

fbinie działa na ssh. Możesz wykonać przekazywanie X w ten sposób ssh -Y user@server, ale potrzebujesz serwera X działającego na serwerze zdalnym.

Najlepszym wyborem jest użycie sshfs. Działa WIELKO w przestrzeni użytkownika, na przykład nautilus. Jest trochę konfiguracji do zrobienia, patrz:

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
źródło
Pytanie dotyczy drzewa wykonania dla wszystkich aktywowanych jednostek, przez które system przeszedł po rozwiązaniu zależności. Więc ta odpowiedź jest chybiona.
galaktyka
Być może twoje pytanie jest dobrze dopasowane do żądania funkcji? Pewnie, że to pomoże. W każdym razie zamieściłem tę odpowiedź po tym, jak natknąłem się na twoje pytanie, ponieważ w pewnym sensie przypominało to inne pytanie, na które potrzebowałem informacji, i czułem, że brakowało niektórych podstawowych przykładów (takich jak te, których próbowałeś i nie działały - to naprawdę pomógł wyjaśnić), szczególnie dla osób takich jak ja, walczących po utracie init Systemu V i ich przydatnego pliku rc.conf. Przepraszam, moja odpowiedź nie pasowała. Nie warto jednak głosować negatywnie.
Joel.O
Edytowane z obejściem problemu. Mam nadzieję, że to znowu pomoże.
Joel.O
Nie mogłem używać fbi przez ssh na moim serwerze. Ale sshfsdziała jeszcze lepiej. Zobacz EDYCJA 2.
Joel.O