Вопрос или проблема
Я только что установил 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
показывает множество циклов упорядочивания. Рассмотрим, как можно решить эту проблему и разобраться в причинном механизме.
Анализ проблемы
-
Отсутствие логов в журналах: Вы указали, что при запуске
journalctl -b 0 -u NetworkManager.service
не отображается никаких записей. Это свидетельствует о том, что служба действительно не запускалась во время загрузки, вероятно, из-за циклов упорядочивания. -
Циклы упорядочивания: Ваша диагностика с
journalctl
показывает, что несколько единиц, включаяnetworkd-dispatcher.service
иNetworkManager.service
, имеют проблемы с зависимостями. Система удаляет задания, чтобы разорвать циклы, и из-за этого службы не могут быть запущены. -
Разные результаты
systemd-analyze verify
: Вы заметили, что командаsystemd-analyze verify multi-user.target
возвращает разное количество циклов при каждом запуске. Это может быть связано с тем, что состояние зависимостей может измениться в зависимости от того, какие службы были активированы или не активированы во время последующих запусков. -
Проблема с произвольными монтированиями: Как вы указали, вы обнаружили, что проблема с циклом упорядочивания может быть вызвана кастомной единицей монтирования (mount unit). Эта единица, судя по вашему описанию, пытается прикрепить файловую систему после достижения
multi-user.target
, что может вызывать конфликты с другими службами.
Решение проблемы
Чтобы устранить циклы упорядочивания и обеспечить успешный запуск службы NetworkManager, рекомендуется:
-
Деактивировать проблемную единицу монтирования: Если вы заметили, что монтирование ведет к проблемам, дизактивируйте соответствующую единицу:
sudo systemctl disable media-user-b.mount
-
Использовать Automount: Вместо кастомного монтирования, создайте автоматическую единицу (automount), которая позволит избежать конфликтов:
[Unit] Description=Automount backup disks [Automount] Where=/media/<user>/b [Install] WantedBy=multi-user.target
После создания этого файла, активируйте его:
sudo systemctl enable <имя_файла>.automount
-
Проверка и анализ: После внесения указанных изменений, выполните повторный запуск
systemd-analyze verify multi-user.target
и посмотрите, устранены ли циклы. Убедитесь, что NetworkManager запускается автоматически.
Заключение
Исправление проблем с циклом упорядочивания в systemd
требует внимательного анализа зависимостей каждой службы, задействованной в процессе загрузки системы. Используя автоматическое монтирование, как указано выше, вы сможете уменьшить вероятность возникновения конфликтов и обеспечить более стабильный запуск необходимых служб, включая NetworkManager. Если возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.