Files
dedinit.ru/content/posts/20260913 - systemd1 hang systemctl reboot force/index.md
T

178 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
date: '2026-09-13T15:55:00+03:00'
lastmod: '2026-09-13T15:55:00+03:00'
draft: false
title: 'Завис systemd1: почему без перезагрузки не обойтись'
slug: 'systemd1-hang-systemctl-reboot-force'
description: 'systemd1 висит: systemctl молчит, bus-активация org.freedesktop.systemd1 таймаутит, docker жив, а PID 1 превратился в один поток. Разбор: почему daemon-reexec не помог, почему Яндекс-Диск был лишь триггером и как перезагрузка с --force --force разрулила ситуацию.'
categories:
- 'DevOps'
- 'Linux'
tags:
- 'systemd'
- 'systemctl'
- 'dbus'
- 'fuse'
- 'davfs2'
- 'reboot'
- 'admin'
keywords:
- 'systemd1'
- 'org.freedesktop.systemd1'
- 'Failed to activate service'
- 'service_start_timeout'
- 'daemon-reexec'
- 'systemctl reboot'
- '--force --force'
- 'FUSE'
- 'davfs2'
- 'yandex disk'
cover:
image: "hero.svg"
alt: "Завис systemd1 — systemctl молчит, лечится перезагрузкой"
---
# Завис 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-running` → `degraded` (отвечает мгновенно — шина жива);
- `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: при пульсе «один поток» перезагрузка всё равно неизбежна.