На зависимости конфигурации сети 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, так что теперь я могу дать лучший ответ, чем это было возможно во время написания оригинального ,
no-auto-default
толькоauto
. У вас есть конкретный вопрос? По моему мнению, man-страница nm-online четко заявляет, что при этом-s
она ожидает всех попыток автоматического подключения, то есть подключения или сбоя./etc/init.d/network
или подобное, но это не работает универсально.Вы можете использовать
After
в[Unit]
разделе, чтобы определить службу, которая должна быть запущена до запуска вашей службы. Например, если вы используете NetworkManager, вы можете запустить службу после запуска NetworkManager.источник
BindsTo
здесь не очень уместно, так как сервис является одноразовым событием, а не постоянным сервисом (если только он не включает в себяExecStop
функцию, которая срабатывает при прекращении работы сети).BindsTo
BindsTo
, например,Requires
если хотите, чтобы служба работала только в том случае, если это делает NetworkManager.After
на самом деле не делает этого - это просто означает, что если NM также работает, то запустите это позже. Если NM не будет запущен, служба будет запущена в произвольной точке.After=foo
будет не вызыватьfoo
блок , чтобы начать , если он еще не запущен, он будет только сказать Systemd , как заказать единицы , если они оба начали одновременно . Использование обоих,After=foo
а такжеWants=foo
илиRequires=foo
будет иметь эффект подтягивания,foo
если оно не запущено, а также правильное упорядочение юнитов.Если ваша служба предоставляет сервер, который может пассивно ждать, пока кто-то подключится к нему, используйте это:
Ваш сервис должен связываться с подстановочным интерфейсом. Если он использует активацию сокета (рекомендуется), или если он только локальный, вы можете полностью игнорировать сетевые цели.
Если ваша служба действует как клиент или одноранговая, это более уместно:
До появления systemd 213 network-online.target требуется обходной путь, о котором упоминал Павел (вам нужно вручную включить службу, которая будет ожидать подключения к сети). Начиная с systemd 213 это делается по умолчанию.
systemd-networkd-wait-online
будет ожидать, что хотя бы один адрес (либо маршрутизируемый, либо локальный для канала) будет настроен на интерфейсе без обратной связи.Настройка systemd-networkd, NetworkManager или его эквивалента является независимой задачей. DHCP (для IPv4) и NDP (для IPv6), как правило, работают «из коробки», но вы должны настроить их так, чтобы ваше точное определение «сеть работала» - это то, что вызывает
network-online.target
.Документация:
источник
Это будет иметь эффект, противоположный тому, что вы хотите. От
man systemd.unit
:Исходя из этого, мы можем видеть, что правильной единицей измерения является «Хочет» или «Требуется»; исходя из их описания, «Требуется», вероятно, является правильным, с добавлением «После», чтобы обеспечить не только запуск сетевой службы, но и ее запуск перед этим устройством.
Ни одна из опций модуля, AFAIK, не может включать условие о том, что запущенный завершающий компонент должен быть завершен или достиг определенной точки (сетевое взаимодействие, вероятно, является сервисом демона), только то, что он запускается первым. Имея это в виду, вы можете захотеть сделать свой сценарий
Type=forking
и добавить работоспособную задержку (скажем, 30 секунд), или какой-то цикл выхода при успехе, включая задержку, чтобы убедиться, что у вас сначала есть аренда DHCP.источник
After
в связи сRequires
«чтобы не только запустить сетевой сервис, но и запустить его перед этим устройством».After
работает вместе с темWants
илиRequires
иным образом. С другой стороны, явные задержки являются плохой привычкой в инструментах, основанных на зависимостях, особенно когда есть явный способ ждать, пока сеть не будет настроена, как указано в документации systemd, поэтому я должен настаивать на понижении.Используйте
After
в[Unit]
разделе, чтобы указать, что должно быть запущено перед вашим собственным сервисом. (Это большая часть предыдущего ответа верна.)Чтобы запустить службу после подключения к сети, используйте цель сети, которая должна применяться независимо от того, используете ли вы NetworkManager, систему conf.d / netctl в Arch или какую-либо другую службу, известную systemd.
Краткий обзор подтвердит, что каждая другая служба в вашей системе, которая зависит от сетевого подключения, содержит эту директиву.
Он также переносим на любой дистрибутив, который использует systemd. Ваш файл модуля будет одинаковым для Arch, Fedora, RHEL 7, будущих версий Debian ...
Службы, которые запускают сетевое соединение, такие как сценарии Arch или ваши собственные, должны указывать это в своих собственных файлах модулей.
источник
Wants
часть, потому что она имеет побочные эффекты на других пакетах. Посмотрите на мой ответ, пожалуйста.Wants
наnetwork.target
это хорошая идея здесь.Я хотел добавить пункт к этой статье. В настоящее время (лето 2015 г.) в RHEL7 / CentOS 7, network-online.target неправильно установлен до запуска сети IPv6, поэтому демоны, которые имеют
в их определении службы, которое также явно связывается с адресами IPv6, вероятно, будет запущено до того, как IPv6 будет запущен, что приведет к их отказу.
источник
/etc/init.d/network
. Если вы столкнетесь с той же проблемой даже с NM, то это будет хорошим поводом для подачи запроса на функцию. Я не проверял с RHEL / CentOS, я могу помочь вам с деталями, если вам интересно.работает для меня.
источник
networkd
предоставляет свой собственный / ожидание онлайн / сервис. Выдвижение и заказ послеnetwork-online.target
- это правильный путь для любого сервиса, который поддерживает это.