Служба стартует до готовности сети: network.target вместо network-online.target
Цель network.target пассивная: её достижение означает лишь, что управление сетью запущено, а не что адрес получен. Дождаться настроенной сети позволяет другая цель — network-online.target, и она устроена наоборот: её подтягивает тот, кому сеть нужна, а вместе с ней подтягивается служба ожидания. Плата за это — время загрузки, поэтому ожидание уместно там, где программа сама не умеет пережить отсутствие сети.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
В описании указан только порядок относительно network.target
Пассивная цель достигается почти сразу и ничего не обещает: адреса ещё нет, маршрута тоже. Программа, привязывающаяся к конкретному адресу, в этот момент получает отказ.
-
Цель указана, а служба ожидания выключена
Целью готовой сети занимается служба ожидания того, кто управляет сетью. Если она не включена, цель достигается мгновенно и ожидание превращается в видимость.
-
Ожидание упирается в предел времени и задерживает загрузку
Ожидание по умолчанию ждёт все известные ему линки и не меньше двух минут. Один лишний интерфейс без настроек — и загрузка удлиняется на эти две минуты, а состояние системы становится ухудшенным.
-
Сеть готова, а имена ещё не разрешаются
Готовность сети ничего не говорит о работе разрешения имён: для него есть отдельная точка встречи, nss-lookup.target, и её полагается указывать в порядке, но не подтягивать.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Есть ли у службы ожидание сети и чем оно задано — подтягиванием или только порядком.
systemctl show ИМЯ.service -p Wants -p After -p RequiresВключена ли служба ожидания: без неё цель готовой сети ничего не ждёт.
systemctl is-enabled systemd-networkd-wait-online.service NetworkManager-wait-online.serviceСколько времени загрузка простояла в ожидании сети.
systemd-analyze blame | grep -i wait-onlineДождалась служба ожидания сети или вышла по пределу времени.
journalctl -b -u systemd-networkd-wait-online --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Пассивная цель достигается почти сразу и ничего не обещает: адреса ещё нет, маршрута тоже. Программа, привязывающаяся к конкретному адресу, в этот момент получает отказ.
- Как проверить
-
Посмотрите зависимости службы.
systemctl show ИМЯ.service -p After -p Wants -p Requires | tr ' ' '\n' | grep -i network
- Как исправить
-
Добавьте в переопределении и подтягивание, и порядок относительно цели готовой сети: одного порядка мало, без
Wants=цель никто не поднимет.[Unit] Wants=network-online.target After=network-online.target
- Почему происходит
- Целью готовой сети занимается служба ожидания того, кто управляет сетью. Если она не включена, цель достигается мгновенно и ожидание превращается в видимость.
- Как проверить
-
Посмотрите, включена ли служба ожидания у вашего управляющего сетью.
systemctl is-enabled systemd-networkd-wait-online.service NetworkManager-wait-online.service 2>&1
- Как исправить
- Включите ту службу ожидания, которая соответствует управляющему сетью на этой машине. Включать обе разом не надо: неработающая добавит к загрузке своё время ожидания впустую.
- Почему происходит
- Ожидание по умолчанию ждёт все известные ему линки и не меньше двух минут. Один лишний интерфейс без настроек — и загрузка удлиняется на эти две минуты, а состояние системы становится ухудшенным.
- Как проверить
-
Посмотрите, сколько загрузка ждала сеть и чем кончилось ожидание.
systemd-analyze blame 2>/dev/null | grep -i wait-online journalctl -b -u systemd-networkd-wait-online --no-pager | tail -5
- Как исправить
-
Ограничьте ожидание нужным интерфейсом параметром
--interface=в переопределении службы ожидания или уберите лишний линк из управления. Просто выключить ожидание — значит вернуть исходную беду.
- Почему происходит
- Готовность сети ничего не говорит о работе разрешения имён: для него есть отдельная точка встречи, nss-lookup.target, и её полагается указывать в порядке, но не подтягивать.
- Как проверить
-
Посмотрите, на чём именно спотыкается программа при запуске.
journalctl -b -u ИМЯ.service --no-pager | head -20 systemctl show ИМЯ.service -p After | tr ' ' '\n' | grep -i nss
- Как исправить
- Добавьте порядок относительно точки встречи разрешения имён и научите программу повторять попытку: разрешение имён может отвалиться и после загрузки, а зависимостями это не лечится.
Пример вывода
Служба привязывается к адресу, которого ещё нет; ожидание сети вышло по пределу времени. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd[1]: Starting myapp.service - My application...
myapp[911]: bind 203.0.113.10:8080: Cannot assign requested address
systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE
systemd-networkd-wait-online[688]: Timeout occurred while waiting for network connectivity.
systemd[1]: systemd-networkd-wait-online.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: Failed to start systemd-networkd-wait-online.service - Wait for Network to be Configured.
Связанные ошибки
- Цель не достигнута: служба ждёт target, который не наступает Служба не запускается, потому что не достигнута цель из After= или Requires=. Разбор целей multi-user, network-online, graphical.
- Служба не запускается вместе с зависимостью After= без Wants= не запускает зависимость. Разбор частой путаницы между порядком и необходимостью.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Система загрузилась в состоянии degraded systemctl is-system-running возвращает degraded: часть служб не запустилась. Как найти их и что делать.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Found ordering cycle: циклическая зависимость при загрузке systemd нашёл цикл в порядке запуска и разорвал его, отбросив одну зависимость. Как найти цикл и правильно расставить After и Requires.
- Temporary failure in name resolution в журнале службы Служба не может разрешить имя: не готова сеть, нет сервера имён, мешает изоляция. Разбор при загрузке и в работе.
Источники
-
systemd.special(7)
network.target — пассивная цель, network-online.target подтягивается потребителем и тянет за собой службу ожидания; nss-lookup.target — точка встречи для разрешения имён. -
systemd-networkd-wait-online.service(8)
Ожидание ждёт все управляемые линки и хотя бы один в состоянии «online»; предел времени по умолчанию 120 секунд. -
Проверено на этой машине: systemd 255 (255.4-1ubuntu8.17), Ubuntu 24.04
На этой машине включена systemd-networkd-wait-online.service; строка «Timeout occurred while waiting for network connectivity.» взята из самого исполняемого файла ожидания, а предел в 120 секунд — из его man-страницы.