Від системних залежностей від конфігурації мережі
Це дуже легко вплинути на замовлення одиниць системи. З іншого боку, вам слід бути обережними, що гарантує завершений блок.
Налаштуйте свою послугу
У поточних системах замовлення після 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/
Супутня документація
Підсумкові ноти
Я сподіваюся, що я не лише допоміг відповісти на ваше запитання в той момент, коли ви його задали, але також сприяв поліпшенню ситуації в дистрибутиві верхніх потоків і Linux, так що тепер я можу дати кращу відповідь, ніж це було можливо під час написання оригіналу .