systemd-udevd: timeout killing worker и медленная загрузка
Служба обработки устройств запускает правила для каждого устройства. Если правило висит — например обращается к сети или к недоступному диску, — рабочий процесс убивается по таймауту, а загрузка задерживается.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Правило обращается к недоступному ресурсу
Собственные правила, вызывающие внешние программы, могут ждать сеть или диск. Обработка устройства при этом висит.
-
Проблемное устройство отвечает медленно
Умирающий диск или неисправный контроллер задерживают опрос. Таймаут срабатывает на каждом устройстве.
-
Ожидание устройства при загрузке
Служба ожидания устройств ждёт завершения обработки. При таймаутах это добавляет к загрузке минуты.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщения службы обработки устройств.
journalctl -u systemd-udevd -b --no-pager | tail -30Вклад в общее время загрузки.
systemd-analyze blame | head -10Сведения об устройствах, известных системе.
udevadm info --export-db 2>/dev/null | head -20Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Собственные правила, вызывающие внешние программы, могут ждать сеть или диск. Обработка устройства при этом висит.
- Как проверить
-
Посмотрите сообщения службы и свои правила.
journalctl -u systemd-udevd -b --no-pager | grep -iE "timeout|killing" | tail ls -l /etc/udev/rules.d/
- Как исправить
- Уберите из правил обращения к внешним ресурсам: правило должно работать мгновенно. Долгие действия выносят в службу, запускаемую правилом.
- Почему происходит
- Умирающий диск или неисправный контроллер задерживают опрос. Таймаут срабатывает на каждом устройстве.
- Как проверить
-
Посмотрите записи ядра об устройствах.
journalctl -k -b --no-pager | grep -iE "ata[0-9]|nvme|timeout" | tail -20
- Как исправить
- Проверьте состояние устройств и замените неисправное: программные настройки тут не помогут.
- Почему происходит
- Служба ожидания устройств ждёт завершения обработки. При таймаутах это добавляет к загрузке минуты.
- Как проверить
-
Посмотрите время запуска связанных служб.
systemd-analyze blame | grep -iE "udev|settle" | head
- Как исправить
- Уберите из загрузки ожидание завершения обработки, если оно не нужно: эта служба считается устаревшей и обычно не требуется.
Пример вывода
Рабочий процесс обработки устройства убит по таймауту. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd-udevd[420]: sda: Worker [431] processing SEQNUM=4211 is taking a long time
systemd-udevd[420]: sda: Worker [431] processing SEQNUM=4211 killed
systemd[1]: systemd-udev-settle.service: start operation timed out. Terminating.
Связанные ошибки
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Служба ждёт устройство: device-unit не появляется Зависимость от .device не выполняется: устройства нет, оно не размечено, или ядро не сообщило о нём.
- Input/output error в журнале службы Ошибка ввода-вывода: проблемы носителя, отвалившийся сетевой ресурс, повреждённая файловая система. Что проверять срочно.
- Интерфейс не переименовался: имя занято другим устройством Сеть не поднимается после загрузки: правило переименования не применилось, интерфейс сохранил временное имя.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Failed with result 'exec-condition' и condition failed Состояния exec-condition и condition failed: запуск не состоялся, потому что условие не выполнено. Это не сбой, а задуманное поведение.
- Found ordering cycle: циклическая зависимость при загрузке systemd нашёл цикл в порядке запуска и разорвал его, отбросив одну зависимость. Как найти цикл и правильно расставить After и Requires.
Источники
-
systemd-udevd.service(8)
Служба обработки устройств и её таймауты. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено правилом udev с обращением к недоступной сети.