jak uruchomić usługę systemową przed rozpoczęciem pracy w sieci?

11

Próbuję skonfigurować nową usługę (pod Debian Jessie), która musi skonfigurować niektóre instalacje, w których przechowywana jest konfiguracja sieci, a zatem ta usługa musi zostać ukończona przed uruchomieniem usługi networking.service.

Próbowałem następujące:

[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

Za pomocą systemd-analyze plotWidzę, że moja usługa się uruchamia, ale networking.servicezaczyna się około 3 sekund wcześniej:

wprowadź opis zdjęcia tutaj

Najwyraźniej moja konfiguracja jest nieprawidłowa, ale trudno mi znaleźć problem ... Każda pomoc bardzo doceniona ..

Aktualizacja

I obecnie rozwiązany przez zmianę config usług zacząć przed local-fs.targetzamiast 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

Chciałbym jednak zrozumieć, dlaczego moja pierwsza konfiguracja nie działała zgodnie z oczekiwaniami ...?

Udo G.
źródło
Ze względu na sposób działania systemd, dosłowny porządek czasowy, w którym rzeczy działają, może nie być istotny. Czy po powrocie do sieci jest on zgodny z plikami w tym katalogu?
Tom Hunt
Nie jestem pewien, czy zrozumiałem twoje pytanie. W każdym razie /etc/network/interfacesma odniesienia do ip-upskryptów znajdujących się na innej partycji. Ta partycja jest montowana za pomocą skomplikowanego skryptu, /opt/intermodul-mounts/start.shktóry należy uruchomić przed skonfigurowaniem sieci. Obecnie ip-upskrypty faktycznie się nie uruchamiają, ponieważ nie są dostępne w czasie uruchamiania. Uruchamianie service networking restartpotem przywołuje wszystkich interfejsów poprawnie.
Udo G
Możliwy duplikat: superuser.com/questions/1005742/…
Josip Rodin

Odpowiedzi:

8

network-pre.target to cel, którego można użyć do zamówienia usług przed skonfigurowaniem dowolnego interfejsu sieciowego. Jego głównym celem jest używanie z usługami zapory ogniowej, które chcą ustanowić zaporę ogniową przed uruchomieniem jakiegokolwiek interfejsu sieciowego. Jest to jednostka pasywna: nie można jej uruchomić bezpośrednio i nie jest ona wciągana przez usługę zarządzania siecią, ale przez usługę, która chce ją uruchomić.

Chcesz użyć, network-pre.targetjeśli chcesz coś skonfigurować przed uruchomieniem sieci

Usługi, które chcą być uruchomione przed skonfigurowaniem sieci, powinny umieścić Before = network-pre.target, a także ustawić Wants = network-pre.target, aby ją pobrać.

Powinieneś umieścić je w [Unit]sekcji:

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

Odniesienie

Edward Torvalds
źródło
1
Hej @edwardtorvalds, robiłem dokładnie to w przypadku konfiguracji sieci, ale wydaje się, że urządzenie nigdy nie działa. Odpowiedź systemctl is-enabled <unit>brzmi zawsze static. Oczywiście nie mogę tego włączyć, ponieważ nie ma WantedBy=. W końcu czego chce? Jest to coś, co wymaga pewnej konfiguracji, zanim sieć się załaduje.
rychło
możesz spróbować poszukiwany przez = remote-fs.target lub mount-fs.target.
Edward Torvalds,
2
Dzięki. Skończyło się robi Before=network-pre.targeti Wants=network-pre.targeta dla [Install]zrobiliśmy WantedBy=network.target. Ostatnia sekcja zmusiła go do pracy w sieci, poprzednia uporządkowała. Był to jednak ból
rychło
skoro na pewno masz znacznie lepszą głowę niż ja, czy możesz spojrzeć na inne q, które mam? unix.stackexchange.com/questions/277783/... Wciąż próbuję wymyślić, jak to zrobić.
rychło
Jestem zdezorientowany, ponieważ nie mam doświadczenia z zaszyfrowaną partycją, jeśli możesz po prostu mnie, zrób to
Edward Torvalds
3

Tak jak w Debian Jessie, pakiet netfilter-persistent (umożliwiający ładowanie reguł iptables przed uruchomieniem sieci) ma pakiet netfilter-persistent.service, który wygląda następująco:

# 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
użytkownik2024640
źródło
Dlaczego jest w konflikcie z shutdown.target!
Alexis Wilke
1

Błąd jest prosty i jedną z głównych rzeczy, które zawsze mylę: miksujesz Beforei RequiredBy. To nie idzie w parze. Inni mają rację co do celu.

Zmora
źródło
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

Wykonanie czegoś w ten sposób zapewni, że to urządzenie uruchomi się przed siecią, ale po większości innych ważnych ustawień.

spkane
źródło