Цель (target) — юнит без своей программы: веха «система дошла до такого состояния».
С multi-user.target ты встречался в уроке о состояниях служб: это обычное рабочее состояние сервера, и enable подключает к нему службы по строке WantedBy= из секции [Install]. До какой цели идёт загрузка, печатает systemctl get-default, а что к цели подключено — systemctl list-dependencies:
Внутри загрузки есть и цели-вехи: sysinit.target и basic.target из critical-chain, network.target — сеть настроена, network-online.target — сеть готова к соединениям. Службе, которой нужна сеть, пишут Wants= и After=network-online.target, — так сделано у nginx на этой машине. Эта цель и держала загрузку в начале урока: служба ожидания сети systemd-networkd-wait-online ждёт, пока сеть поднимется, — на серверах до двух минут. У учебной машины сети нет, поэтому в образе ожидание выключено, а подготовка опыта включила его с пределом 10 секунд. Ждал и твой терминал: приглашение появилось только после ожидания сети.
В юните службы есть After=network-online.target, а Wants= нет, и никакой другой юнит эту цель не тянет. Что будет при загрузке?
-
After=только упорядочивает юниты, которые и так запускаются. Цель никто не запустил — ждать нечего. -
After=— не зависимость: если цели нет в загрузке, это запуск не отменяет. Отменить его мог бы толькоRequires=.
After= действует, только когда оба юнита запускаются. Цель network-online.target в загрузку тянет чей-то Wants= — поэтому служба, которой нужна сеть, пишет оба: Wants= и After=.
Ошибку в юните лучше найти до перезагрузки: systemd-analyze verify <юнит> проверяет файл и печатает, что systemd в нём не поймёт, — например, Unknown key name 'Afer' на строку с опечаткой. Такую строку systemd при загрузке молча пропустит, и порядок из неё не сработает.
Главное в шаге
-
Цель — веха загрузки; загрузка идёт до цели из
systemctl get-default, на сервере — multi-user.target. -
Служба, которой нужна сеть, ждёт network-online.target строками
Wants=иAfter=. -
systemd-analyze verifyнаходит ошибки юнита до того, как они всплывут при загрузке.