NetworkManager.service не запускается при быстрой загрузке, journalctl показывает много циклов упорядочивания systemd во время загрузки.

Вопрос или проблема

Я только что установил Ubuntu 24.04 на диск Intel Optane p4801x. Я пытаюсь выяснить, как быстро он загружается с этого диска. Действительно, он загружается очень быстро. Но юнит NetworkManager часто не запускается. Он включен, но неактивен, и в journalctl -b 0 -u NetworkManager.service ничего нет. То есть юнит никогда не запускался во время загрузки. Когда я запускаю его сам после загрузки, он запускается нормально:

systemctl start NetworkManager

В логах показано, что networkd-dispatcher был отключен для разрыва цикла зависимостей:

$ journalctl -b 0 | grep network
Oct 20 14:21:15 evergreens kernel: drop_monitor: Initializing network drop monitor service
Oct 20 14:21:15 evergreens systemd[1]: multi-user.target: Found ordering cycle on networkd-dispatcher.service/start
Oct 20 14:21:15 evergreens systemd[1]: multi-user.target: Job networkd-dispatcher.service/start deleted to break ordering cycle starting with multi-user.target/start
Oct 20 14:21:15 evergreens systemd[1]: Reached target network.target - Network.
Oct 20 14:21:15 evergreens systemd[1]: Reached target network-online.target - Network is Online.
...

Я подозреваю, что это также вызвало отсутствие запуска NetworkManager.

Systemd не показывает никаких проблем ни в одном из юнитов:

$ sudo systemd-analyze verify networkd-dispatcher.service
$ sudo systemd-analyze verify NetworkManager.service
$

Но лог на самом деле показывает гораздо больше циклов зависимостей, и это проявляется в verify multi-user.target:

$ journalctl -b 0 | grep "break.*cycle"
...
$ sudo systemd-analyze verify multi-user.target
...

Например, сеть:

$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo
multi-user.target: Found dependency on network.target/start
ubuntu-advantage.service: Found ordering cycle on network.target/start
ubuntu-advantage.service: Job network.target/start deleted to break ordering cycle starting with ubuntu-advantage.service/start
multi-user.target: Found ordering cycle on networkd-dispatcher.service/start
multi-user.target: Job networkd-dispatcher.service/start deleted to break ordering cycle starting with multi-user.target/start
multi-user.target: Found ordering cycle on NetworkManager.service/start
multi-user.target: Job NetworkManager.service/start deleted to break ordering cycle starting with multi-user.target/start

Но, похоже, что sudo systemd-analyze verify multi-user.target выдает разные вещи почти каждый раз, когда я его запускаю? Это возможно? Иногда он выдает гораздо больше, иногда только один юнит.

Я пытался отобразить зависимости multi-user.target, следуя ответу на Unix Stackexchange:

$ sudo systemd-analyze verify multi-user.target 2>&1 |\
  perl -lne 'print $1 if m{Found.*?on\s+([^/]+)}' |\
  xargs --no-run-if-empty systemd-analyze dot | dot -Tsvg > cycle.svg

Я не увидел цикл там. Также график большой и трудно читаемый. Я пытался “приблизиться” к некоторым юнитам, но не вижу там цикла:

$ echo multi-user.target networkd-dispatcher.service basic.target |\
  xargs --no-run-if-empty systemd-analyze dot |\
  dot -Tsvg > cycle.svg

Поскольку systemd-analyze verify выдает разные вещи почти каждый раз, когда он запускается, эти графики, вероятно, не заслуживают доверия.

Смотря на отдельные юниты, я не нахожу проблемы. Зависимости NetworkManager кажутся в порядке:

$ cat /usr/lib/systemd/system/NetworkManager.service
[Unit]
Description=Network Manager
Documentation=man:NetworkManager(8)
Wants=network.target
After=network-pre.target dbus.service
Before=network.target
BindsTo=dbus.service
...

[Install]
WantedBy=multi-user.target
Also=NetworkManager-dispatcher.service

У меня была похожая проблема при загрузке с обычного NVMe-диска от Corsair. И никогда не было такой проблемы, когда загрузка с NVMe Corsair была необычно медленной из-за одного конкретного юнита. (Монтирование HDD-диска в /etc/fstab – его больше нет в fstab, так что он не замедляет загрузку.)

То есть я думаю, что эта проблема возникает только тогда, когда последовательность загрузки быстрая. Хотя я не понимаю, почему это так. Почему проблема в графе зависимостей проявляется только при быстрой загрузке?

Может кто-то подсказать, как отслеживать циклы зависимостей?

Что происходит с systemd-analyze verify multi-user.target, который печатает разные вещи каждый раз? Это известное поведение? Как он проходит по графу зависимостей, является ли это каким-то образом случайным? Могло бы это быть связано с причиной, по которой systemd удаляет юниты во время загрузки, но те же юниты нормально работают позже?

Я подробнее изучил systemd-analyze verify. Он действительно печатает случайное количество циклов зависимостей каждый раз, когда я его запускаю! (Соответствующий вопрос на Unix Exchange.) И оказалось, что какой-то пользовательский mount юнит как-то его вызывает. Я только что заметил, что этот mount юнит появляется в каждом блоке “Найден цикл зависимостей”, так:

$ systemd-analyze verify multi-user.target
...
sysinit.target: Found ordering cycle on local-fs.target/start
sysinit.target: Found dependency on <<<media-user-b.mount>>>/start
sysinit.target: Found dependency on multi-user.target/start
sysinit.target: Found dependency on thermald.service/start
sysinit.target: Found dependency on sysinit.target/start
sysinit.target: Job local-fs.target/start deleted to break ordering cycle starting with sysinit.target/start

Когда юнит mount отключен, systemd-analyze verify не находит циклов зависимостей, и загрузка проходит корректно.

Таким образом, сбой загрузки, вероятно, вызван случайно возникающими циклами зависимостей, которые заставляют systemd случайным образом удалять некоторые из юнитов, включая NetworkManager.

Я не вижу, почему этот юнит вызывает циклы. Особенно почему это происходит случайно. Это простой монтирование, которое подключает несколько резервных HDD-дисков после multi-user.target, вот так:

[Unit]
Description=Mount BTRFS backup b filesystem
After=multi-user.target

[Mount]
What=/dev/disk/by-label/backups_b
Where=/media/<user>/b
Type=btrfs
Options=defaults

LazyUnmount=yes

[Install]
WantedBy=multi-user.target

Итак, следуя совету с реддита, я отключил этот mount юнит и добавил & включил юнит automount, который вызывает монтирование:

[Unit]
Description=Automount backup disks

[Automount]
Where=/media/<user>/b

[Install]
WantedBy=multi-user.target

Ответ или решение

Проблема с запуском NetworkManager и циклы упорядочивания в systemd

Установка Ubuntu 24.04 на NVMe-накопитель Intel Optane p4801x действительно обеспечивает быстрое время загрузки системы. Однако, как вы отметили, при этом возникают проблемы со службой NetworkManager, которая иногда не запускается автоматически при загрузке, и журнал journalctl показывает множество циклов упорядочивания. Рассмотрим, как можно решить эту проблему и разобраться в причинном механизме.

Анализ проблемы

  1. Отсутствие логов в журналах: Вы указали, что при запуске journalctl -b 0 -u NetworkManager.service не отображается никаких записей. Это свидетельствует о том, что служба действительно не запускалась во время загрузки, вероятно, из-за циклов упорядочивания.

  2. Циклы упорядочивания: Ваша диагностика с journalctl показывает, что несколько единиц, включая networkd-dispatcher.service и NetworkManager.service, имеют проблемы с зависимостями. Система удаляет задания, чтобы разорвать циклы, и из-за этого службы не могут быть запущены.

  3. Разные результаты systemd-analyze verify: Вы заметили, что команда systemd-analyze verify multi-user.target возвращает разное количество циклов при каждом запуске. Это может быть связано с тем, что состояние зависимостей может измениться в зависимости от того, какие службы были активированы или не активированы во время последующих запусков.

  4. Проблема с произвольными монтированиями: Как вы указали, вы обнаружили, что проблема с циклом упорядочивания может быть вызвана кастомной единицей монтирования (mount unit). Эта единица, судя по вашему описанию, пытается прикрепить файловую систему после достижения multi-user.target, что может вызывать конфликты с другими службами.

Решение проблемы

Чтобы устранить циклы упорядочивания и обеспечить успешный запуск службы NetworkManager, рекомендуется:

  1. Деактивировать проблемную единицу монтирования: Если вы заметили, что монтирование ведет к проблемам, дизактивируйте соответствующую единицу:

    sudo systemctl disable media-user-b.mount
  2. Использовать Automount: Вместо кастомного монтирования, создайте автоматическую единицу (automount), которая позволит избежать конфликтов:

    [Unit]
    Description=Automount backup disks
    
    [Automount]
    Where=/media/<user>/b
    
    [Install]
    WantedBy=multi-user.target

    После создания этого файла, активируйте его:

    sudo systemctl enable <имя_файла>.automount
  3. Проверка и анализ: После внесения указанных изменений, выполните повторный запуск systemd-analyze verify multi-user.target и посмотрите, устранены ли циклы. Убедитесь, что NetworkManager запускается автоматически.

Заключение

Исправление проблем с циклом упорядочивания в systemd требует внимательного анализа зависимостей каждой службы, задействованной в процессе загрузки системы. Используя автоматическое монтирование, как указано выше, вы сможете уменьшить вероятность возникновения конфликтов и обеспечить более стабильный запуск необходимых служб, включая NetworkManager. Если возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...