як запустити системну послугу до запуску мережі?


11

Я намагаюся створити нову службу (під Debian Jessie), яка потребує встановлення деяких вершин, де зберігається конфігурація мережі, і тому ця послуга повинна завершитися перед запуском мережі.

Я спробував таке:

[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
#Before=network-pre.target
Before=networking.service

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=networking.service

Використовуючи, systemd-analyze plotя бачу, що моя служба запускається, але networking.serviceпочинається приблизно на 3 секунди раніше:

введіть тут опис зображення

Мабуть, моя конфігурація неправильна, але мені важко знайти проблему ... Будь-яка допомога дуже вдячна ..

Оновлення

Наразі я вирішив це, змінивши конфігурацію служби для запуску раніше, local-fs.targetа не networking.service:

[Unit]
DefaultDependencies=no
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
Before=local-fs.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=local-fs.target

І все-таки я хотів би зрозуміти, чому моя перша конфігурація не працювала так, як очікувалося ...?


У зв'язку з тим, як працює systemd, буквальний часовий порядок, в якому працюють речі, може бути не суттєвим. Коли з’являється мережа, чи успішно вона відповідає файлам у цьому каталозі?
Том Хант

Я не впевнений, що зрозумів ваше запитання. У будь-якому випадку /etc/network/interfacesмає посилання на ip-upскрипти, які перебувають в іншому розділі. Цей розділ змонтований складним сценарієм, /opt/intermodul-mounts/start.shякий необхідно запустити до налаштування мережі. В даний час ip-upсценарії фактично не запускаються, оскільки вони не доступні під час завантаження. Запуск service networking restartпісля цього приводить коректно всі інтерфейси.
Udo G

Можливий дублікат: superuser.com/questions/1005742/…
Йосип Родін

Відповіді:


8

network-pre.target - це ціль, яка може використовуватися для замовлення послуг до налаштування будь-якого мережевого інтерфейсу. Його основна мета - використання з сервісами брандмауера, які хочуть встановити брандмауер до того, як буде запущений будь-який мережевий інтерфейс. Це пасивний блок: ви не можете його запустити безпосередньо, і його не залучає служба управління мережею, а служба, яка хоче запустити перед цим.

Ви хочете використовувати, network-pre.targetякщо ви хочете щось налаштувати до запуску мережі

Служби, які хочуть запуститись до налаштування мережі, повинні розмістити команду Before = network-pre.target, а також встановити Wants = network-pre.target для її залучення.

Ви повинні помістити їх під [Unit]розділ:

Before=network-pre.target
Wants=network-pre.target

Довідково


1
Привіт, @edwardtorvalds, я робив саме це для деяких налаштувань мережевих конфігурацій, але пристрій, здається, ніколи не працює. Відповідь systemctl is-enabled <unit>завжди є static. Звичайно, я не можу це ввімкнути, тому що немає WantedBy=. Зрештою, чого він хоче? Це те, що робить деяке налаштування перед тим, як мережа повинна завантажитися.
deitch

ви можете спробувати потрібне за допомогою = remote-fs.target або mount-fs.target.
Едвард Торвальдс

2
Спасибі. Я закінчив тим , що робив Before=network-pre.targetі так Wants=network-pre.targetі для [Install]нас зробили WantedBy=network.target. Останній розділ змусив його вимагати мереж, перший привів в порядок. Був біль, однак
deitch

так як у вас, безумовно, ваша голова навколо systemd набагато краще, ніж у мене, чи можете ви подивитись на інший у мене q? unix.stackexchange.com/questions/277783/… Я все ще намагаюся зрозуміти, як це зробити.
deitch

Я розгублений, бо не маю досвіду роботи із зашифрованим розділом, якщо ви просто можете мені зробити це, будь ласка,
Едвард Торвальдс,

3

Як це було зроблено в Debian Jessie, пакет стійких до netfilter (що дозволяє завантажувати правила iptables перед тим, як мережа працює) має netfilter-persistent.service, який виглядає так:

# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
# based on the netfilter-persistent package
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no

Before=network-pre.target
Wants=network-pre.target

Wants=systemd-modules-load.service local-fs.target
After=systemd-modules-load.service local-fs.target

Conflicts=shutdown.target
Before=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/netfilter-persistent start
ExecStop=/usr/sbin/netfilter-persistent stop

[Install]
WantedBy=multi-user.target

Чому це в конфлікті з shutdown.target?!
Алексіс Вілке

1

Помилка проста і одна з головних речей, яку я завжди змішую: Ви змішуєте Beforeта RequiredBy. Це не йде разом. Інші вірно стосуються цілі.


0
[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=basic.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=basic.target

Здійснюючи щось за цими напрямками, переконайтесь, що цей пристрій працює перед мережею, але після того, як відбулася більшість інших важливих налаштувань.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.