На зависимости конфигурации сети systemd
Это очень легко повлияет на порядок юнитов systemd. С другой стороны, вы должны быть осторожны с тем, что гарантирует законченный блок.
Настройте свой сервис
В современных системах заказ после network.target
гарантирует только то, что сетевой сервис запущен, а не то, что есть какая-то фактическая конфигурация. Вы должны сделать заказ после network-online.target
и потянуть его, чтобы добиться этого.
[Unit]
Wants=network-online.target
After=network-online.target
Для совместимости со старыми системами вам, возможно, придется заказывать и после network.target.
[Unit]
Wants=network-online.target
After=network.target network-online.target
Это для файла модуля вашего сервиса и для systemd.
Реализация в текущих версиях программного обеспечения
Теперь вам нужно убедиться, что он network-online.target
работает как положено (или что вы, по крайней мере, можете его использовать network.target
).
Текущая версия NetworkManager предлагает то, NetworkManager-wait-online.service
что получает network-online.target
и, следовательно, ваш сервис. Эта специальная служба гарантирует, что ваша служба будет ожидать, пока все подключения, настроенные для автоматического запуска, успешно завершатся, завершатся неудачно или истечет время ожидания.
Текущая версия systemd-networkd блокирует вашу службу, пока все устройства не будут настроены в соответствии с запросом. Это проще в том, что в настоящее время он поддерживает только те конфигурации, которые применяются во время загрузки (более конкретно, время запуска `systemd-networkd.service).
Для полноты картины /etc/init.d/network
сервис в Fedora, интерпретируемый текущими версиями systemd, блокирует network.target
и, таким образом, косвенно блокирует network-online.target
и ваш сервис. Это пример реализации на основе сценариев.
Если ваша реализация, будь то на основе демонов или на основе сценариев, ведет себя как одна из вышеперечисленных служб управления сетью, она будет задерживать запуск вашей службы до тех пор, пока конфигурация сети не будет успешно завершена, не удастся по уважительной причине или не истечет время ожидания по истечении разумного времени. кадр для завершения.
Вы можете проверить, работает ли netctl таким же образом, и эта информация была бы ценным дополнением к этому ответу.
Реализации в старых версиях программного обеспечения
Я не думаю, что вы увидите достаточно старую версию systemd, где это не сработает. Но вы можете проверить, что, по крайней мере, network-online.target
существует, и что он заказан после network.target
.
Ранее NetworkManager гарантировал, что будет применено хотя бы одно соединение. И даже для того, чтобы это работало, вы должны были включить NetworkManager-wait-online.service
явно. Это давно исправлено в Fedora, но только недавно было применено в апстриме.
systemctl enable NetworkManager-wait-online.service
Замечания о реализации network.target и network-online.target
Вы не должны когда - нибудь понадобится , чтобы сделать ваше программное обеспечение зависит от NetworkManager.service
или NetworkManager-wait-online.service
ни каких - либо других конкретных услуг. Вместо этого все сервисы управления сетью должны заказывать себя раньше network.target
и, по желанию network-online.target
.
Простой сервис управления сетью, основанный на сценариях, должен завершить настройку сети перед выходом из системы и упорядочить ее до network.target
и, следовательно, косвенно network-online.target
.
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Служба управления сетью на основе демона также должна сначала упорядочить себя, network.target
даже если она не очень полезна.
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
Служба, которая ожидает завершения работы демона, должна оформлять заказ после определенной службы и до нее network-online.target
. Его следует использовать Requisite
в службе демона, чтобы он сразу же завершился сбоем, если соответствующая служба управления сетью не используется.
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Пакет должен установить символическую ссылку на ожидающую службу в wants
каталоге, network-online.target
чтобы его доставили службы, которые хотят дождаться настроенной сети.
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
Сопутствующая документация
Финальные заметки
Я надеюсь, что я не только помог ответить на ваш вопрос в то время, когда вы его задавали, но также способствовал улучшению ситуации в дистрибутивах upstream и Linux, так что теперь я могу дать лучший ответ, чем это было возможно во время написания оригинального ,