Завис systemd1: почему без перезагрузки не обойтись

TL;DR: systemd1 (D-Bus-сервис org.freedesktop.systemd1, через который работает systemctl) завис. systemctl молчит, активация сервиса упирается в 25-секундный таймаут, а процесс systemd (PID 1) остаётся с одним-единственным потоком — мёртвый менеджер, который не обслуживает шину. daemon-reexec не помогает. Перезагрузка — единственный выход, и systemctl --force --force reboot справляется даже когда обычный reboot падает с Connection timed out.

Как это выглядело

Всё началось с того, что у меня завис FUSE-модуль с Яндекс-Диском (/mnt/yandex-disk, davfs2). Пока я разбирался, я заметил, что команды systemctl перестали отвечать вообще.

Когда я попробовал перезагрузиться обычным способом:

$ sudo systemctl reboot

Broadcast message from root@bigbox on pts/31 (Sun 2026-09-13 13:08:39 UTC):
The system will reboot now!

Call to Reboot failed: Connection timed out
Failed to start reboot.target: Connection timed out
See system logs and 'systemctl status reboot.target' for details.
It is possible to perform action directly, see discussion of --force --force in man:systemctl(1).

Беда в том, что systemctl reboot сам идёт через systemd1. Если systemd1 висит, то и перезагрузиться через него нельзя — получается «замкнутый круг».

При этом интересная деталь: docker ps и docker info работали нормально, контейнеры — живые, мои агенты продолжали работать. Падал только сам systemd-интерфейс.

Что показала диагностика

1. systemd1 не активируется на D-Bus.

$ busctl | grep systemd1
org.freedesktop.systemd1   -   -   -   (activatable)   -   -   -

(activatable) значит, что сервис зарегистрирован, но не запущен. При попытке его запустить:

$ systemctl is-system-running
[tаймаут через 25 секунд]

$ journalctl | grep systemd1
dbus-daemon[1859]: Failed to activate service 'org.freedesktop.systemd1':
timed out (service_start_timeout=25000ms)

2. PID 1 — systemd — жив, но как будто мёртв внутри.

$ ps -o pid,nlwp,stat,etime -p 1
  1   1  Ss  3-06:26:57

Ключевое — nlwp = 1. Нормальный systemd держит десятки потоков (они обслуживают шину, юниты, таймеры…). Один поток означает, что менеджер фактически не работает, а просто висит. Именно поэтому daemon-reexec не реагирует толком — перезапускать некому.

3. Docker тут ни при чём.

  • dockerd жил, docker ps отвечал мгновенно;
  • все контейнеры — Up, с restart-политиками unless-stopped / always;
  • даже systemctl restart docker упал бы в тот же таймаут systemd1, потому что этот вызов тоже идёт через шину.

4. Даже перезагрузка через systemctl не сработала: Call to Reboot failed: Connection timed out.

Почему FUSE-Яндекс-Диск виноват лишь отчасти

Я сначала грешил на зависший davfs2: он висел, и systemd вполне мог залипнуть, пытаясь обратиться к .mount-юниту, который упирается в молчащую FUSE-точку. Это правдоподобный триггер. Но уже к моменту диагностики я перемонтировал Яндекс-Диск заново, и он заработал — а systemd1 так и остался висящим.

Проверка это подтвердила:

  • ls /mnt/yandex-disk/ отвечает мгновенно;
  • D-state (непрерываемые) процессы отсутствуют;
  • демон davfs2 жив.

То есть: точка Yandex больше не блокирует ничего, а systemd1 всё равно не оживает. Вывод — проблема уже в самом systemd, а не в FUSE. FUSE был спусковым крючком, но чинить нужно было не монтирование.

Что мы перепробовали перед ребутом

Попытка 1: systemctl daemon-reexec — перезапуск systemd «на месте», самая мягкая реанимация.

$ sudo systemctl daemon-reexec
# вернуло 0

Вернуло успех, но шину не оживило. Потому что systemd с одним потоком не смог толком выполнить re-exec — команда «прошла», но менеджер остался в том же состоянии. Проверка после:

$ busctl | grep systemd1
org.freedesktop.systemd1   -   -   -   (activatable)   ...
$ systemctl is-system-running
[tаймаут]

Ничего не изменилось.

Попытка 2: обычный reboot. Упал с Connection timed out (см. выше). По понятной причине: reboot через systemctl — это тоже запрос к systemd1.

Попытка 3: systemctl --force --force reboot — двойной форсированный перезапуск. Именно он сработал:

$ sudo systemctl --force --force reboot
Rebooting.

Как это работает: зачем два –force

systemctl reboot без флагов просит systemd корректно завершить все юниты. Если systemd1 виснет, запрос не проходит. Два --force — это «мне плевать на зависшие службы, перезагружайся»:

  • первый --force — пропустить остановку юнитов (не ждать, пока всё аккуратно завершится),
  • второй --force (для reboot) — выполнить системный вызов перезагрузки напрямую, в обход systemd как менеджера.

То есть это фактически «аварийная» перезагрузка через системный механизм ядра (reboot(2)), минуя зависший менеджер. Риск — грязное завершение: незаписанные данные могут потеряться, но при зависшей шине это часто единственный вариант.

После перезагрузки

Система поднялась за ~11 минут:

  • systemctl is-system-runningdegraded (отвечает мгновенно — шина жива);
  • org.freedesktop.systemd1 на busctl теперь активирован (PID systemd, :1.5), а не (activatable);
  • docker и containerd — active;
  • все 27 контейнеров поднялись сами (restart-политики unless-stopped/always сработали): gitea, netbox, grafana, prometheus, loki, gotosocial, garage, ollama, open-webui, searxng и остальные;
  • /mnt/yandex-disk смонтирован и отвечает; /opt/hermes/obsidian-vault (s3fs) тоже на месте.

Единственный failed-юнит — mdmonitor.service (мониторинг MD-массивов). Падает с mdadm: No mail address or alert command - not monitoring — это не поломка, а отсутствие настроенного алерта. На рабочие массивы не влияет, можно замаскировать.

Выводы

  1. Если systemctl молчит, а docker работает — значит, дело в шине, а не в docker. Проверяй busctl | grep systemd1 и nlwp у PID 1.
  2. daemon-reexec не всегда реанимирует — если у systemd остался один поток, перезапускать себя фактически некому.
  3. Обычный systemctl reboot тоже идёт через systemd1 — при висящей шине он не сработает. Нужен --force --force.
  4. FUSE-зависание может быть триггером, но не обязательно причиной. Если точка перемонтирована и отвечает, а systemd1 всё равно молчит — лечится только перезагрузкой.
  5. Restart-политики контейнеров себя отрабатывают: unless-stopped/always подняли всё после ребута, ничего не пришлось поднимать руками.

Полный разбор с командами, как это диагностировать, — в WALKTHROUGH проекта.


Теги: #systemd #systemctl #dbus #fuse #davfs2 #reboot #администрирование #грабли

Если у вас systemctl молчит, а контейнеры живут — проверьте busctl | grep systemd1 и ps -o nlwp -p 1. И не тратьте время на daemon-reexec: при пульсе «один поток» перезагрузка всё равно неизбежна.