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