Есть ли способ увидеть дерево выполнения systemd?

63

Под вопросом я имею в виду: есть ли способ вывести упорядоченный список (как это делает pstree для процессов), чтобы увидеть, как systemd выполнил предоставленный набор модулей, то есть дерево после того, как зависимости были разрешены, и задания были поставлены в очередь для выполнения ? Я знаю, что вы можете сделать это, проанализировав данные о состоянии systemd, но есть ли быстрый способ увидеть такое дерево? Это очень поможет при расследовании сбоев (например, если вы увидите, что процесс загрузки застрял на каком-либо устройстве, вы сможете точно определить приблизительное местоположение для вашего более глубокого расследования.

галактика
источник
Я создал инструмент визуализации для systemd. Вы можете проверить и попробовать этот инструмент на github.com/ywiyogo/systemd-visual
Yongkie

Ответы:

71

systemd-analyzeтвой друг. Например systemd-analyze critical-chainвыводит блокирующее дерево демонов. Мой например:

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
                          └─systemd-fsck@dev-sda6.service @8.472s +696ms
                            └─dev-sda6.device @8.471s

NetworkManager в примере, в основном, содержит всю загрузку.

Если вы хотите иметь более подробное представление, вы можете отобразить всю цепочку выполнения в файле SVG. systemd-analyze plot > something.svgвыводит всю цепочку (более 120 модулей) в виде индикаторов прогресса в файл SVG с высоким разрешением, который показывает состояния, которые заблокированы, и другие проблемы.

Наконец, у вас есть systemd-analyze dotинструмент, который выводит файл точек, который выводит всю иерархию: systemd-analyze dot | dot -Tpng -o stuff.png с помощью инструмента точек вы можете выводить его как файлы ps и svg.

Все вышеперечисленные инструменты встроены в инструмент systemd-analysis, который поставляется по умолчанию с systemd по крайней мере в archlinux. Я думаю, что есть сторонние проекты, которые тоже занимаются этим.

IBr
источник
Спасибо за ваш ответ, однако он не затрагивает вопросы, а лишь повторяет части моего вопроса (я упомянул, что знаю, как это сделать, анализируя данные состояния systemd). Следовательно, вопрос заключается в том, как получить pstree-подобное дерево последовательности загрузки после того, как все зависимости решены (например, после загрузки). Критическая цепочка почти такая же (несмотря на то, что это дерево снизу вверх), но не перечисляет все запущенные юниты. Что задано в вопросе: дерево, в котором перечислены все отдельные модули, которые были выполнены до некоторой точки (например, попадание в multi-user.target).
галактика
4
systemd-analyze plot > something.svgполон три выполнения с целями (это самое близкое, что вы хотите). Точка systemd-analysis является полным графиком зависимостей (это наиболее правильное представление). Разве это не то, что вы хотите? В сюжете просто найдите цель и посмотрите, для чего она тоже нужна. Те же зависимости точно отображаются в графе, если он сильно запустит какой-то набор инструментов анализа графика и выберет точку графика, для которой вы хотите увидеть зависимости (у инструмента точка больше настроек). См.
Справочную
1
Со страницы руководства: отображает все зависимости любого подразделения, имя которого начинается с «avahi-daemon». Отображает $ systemd-analyze dot 'avahi-daemon.*' | dot -Tsvg > avahi.svg $ eog avahi.svgзависимости между всеми известными целевыми systemd-analyze dot --to-pattern='*.target' --from-pattern='*.target' | dot -Tsvg > targets.svg $ eog targets.svg
элементами
1
IBr, но это не работает в текстовой консоли, к сожалению. Я действительно ценю время, которое вы потратили на ответ (и это правильно, если вы хотите получить какие-то данные для анализа), но это не касается исходного вопроса, поэтому я могу принять его. Сожалею.
галактика
1
Хорошо, нет проблем. Я сам люблю инструменты командной строки :)
IBr
13

--fuzzВозможно, еще не полностью отвечая на ваш вопрос, но попробуйте с опцией

systemd-analyze critical-chain --fuzz 1h

Обратите внимание, что вы также можете указать юниты s, чтобы увидеть их критическую цепочку , так что вы не ограничены multi-user.target

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

Надеюсь это поможет

Людовик Ронсин
источник
12

Не уверен, что я правильно понял вопрос, но есть древовидные визуализации, доступные с помощью следующих команд:

sudo systemctl status

А также :

sudo systemctl list-dependencies 

Надеюсь это поможет :)

Кроме того, для других целей может быть полезно построить дерево папок символьных ссылок systemctl:

tree /etc/systemd/system

На самом деле было действительно полезно выяснить старые / глючные модули, которые замедляли запуск моей системы, чтобы впоследствии отключить их с помощью systemctl disableкоманды.

РЕДАКТИРОВАТЬ

Тем не менее, я действительно согласен с ОП, что эту базовую функциональность следует предоставлять с помощью инструментов командной строки, а не графического инструмента ... Что если вы не можете запустить X? Как тогда вы справляетесь со своим SVG-файлом?

На самом деле, есть способ. Если вы не можете использовать scp(ssh tool) для загрузки вашего файла на другой компьютер, это fbiможет вам помочь :)

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

Работал в моих TTY. Просто перемещайтесь внутри картинки со стрелками. Есть варианты масштабирования, чтобы список сделать fbi -h.

Я снова надеюсь, что это поможет. Он доступен в репозиториях Archlinux и Ubuntu.

РЕДАКТИРОВАТЬ 2:

fbiне работает над ssh. Вы можете сделать переадресацию X таким образом ssh -Y user@server, но вам нужен X-сервер, работающий на вашем удаленном сервере.

Лучше всего здесь использовать sshfs. Он отлично работает в пользовательском пространстве, например, с помощью nautilus. Есть небольшая конфигурация, смотрите:

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 user@remotemachine.com:/home/user /mnt/yourmountingdir/ -o allow_other #Asks for host trusting and password
sudo fusermount -u /mnt/yourmountingdir/ #To disconnect and unmount
Joel.O
источник
Вопрос о дереве выполнения для всех активированных модулей, через которые прошел systemd после разрешения зависимостей. Так что этот ответ - мисс.
галактика
Возможно, ваш вопрос хорошо подходит для запроса функции? Конечно, это поможет. Во всяком случае, я опубликовал этот ответ после того, как наткнулся на ваш вопрос, потому что он как-то напоминал другой вопрос, на который мне нужна была некоторая информация, и я чувствовал, что не хватает некоторых базовых примеров (например, вещей, которые вы пробовали и не работали - это действительно помогли уточнить), особенно для таких как я, борющихся после потери System V init и их удобного файла rc.conf. Извините, мой ответ не подходит. Не стоит понижать голосование все же.
Joel.O
Отредактировано с обходом вашей проблемы. Надеюсь, это поможет снова.
Joel.O
Я не смог использовать fbi over ssh на моем сервере. Но sshfsработает еще лучше. См. РЕДАКТИРОВАТЬ 2.
Joel.O