¿Cómo iniciar un servicio systemd antes de que comience la red?

11

Estoy tratando de configurar un nuevo servicio (bajo Debian Jessie) que necesita configurar algunos montajes donde se almacena la configuración de red y, por lo tanto, este servicio debe completarse antes de que se inicie networking.service.

Intenté lo siguiente:

[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

Utilizando systemd-analyze plotpuedo ver que mi servicio comienza, pero networking.servicecomienza unos 3 segundos antes:

ingrese la descripción de la imagen aquí

Aparentemente mi configuración está mal, pero me está costando encontrar el problema ... Cualquier ayuda es muy apreciada ...

Actualizar

Actualmente lo resolví cambiando la configuración del servicio para comenzar antes en local-fs.targetlugar de 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

Aún así, me gustaría entender por qué mi primera configuración no funcionó como se esperaba ...

Udo G
fuente
Debido a la forma en que funciona systemd, el orden temporal literal en el que se ejecutan las cosas puede no ser significativo. Cuando surge la red, ¿está de acuerdo con los archivos de ese directorio?
Tom Hunt
No estoy seguro de haber entendido tu pregunta. De todos modos, /etc/network/interfacestiene referencias a ip-upscripts que residen en otra partición. Esa partición está montada por un script complejo /opt/intermodul-mounts/start.shque debe ejecutarse antes de configurar la red. Actualmente, los ip-upscripts no se inician efectivamente porque no son accesibles en el momento del arranque. La ejecución service networking restartposterior muestra todas las interfaces correctamente.
Udo G
Posible duplicado: superuser.com/questions/1005742/…
Josip Rodin

Respuestas:

8

network-pre.target es un objetivo que puede usarse para solicitar servicios antes de configurar cualquier interfaz de red. Su propósito principal es el uso con servicios de firewall que desean establecer un firewall antes de que se active cualquier interfaz de red. Es una unidad pasiva: no puede iniciarla directamente y el servicio de administración de red no la activa, sino el servicio que desea ejecutar antes.

Desea usar network-pre.targetsi desea configurar algo antes de que comience la red

Los servicios que desean ejecutarse antes de configurar la red deben colocar Before = network-pre.target y también establecer wants = network-pre.target para que se active.

Debes ponerlos en la [Unit]sección:

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

Referencia

Edward Torvalds
fuente
1
Hola @edwardtorvalds, estaba haciendo exactamente esto para la configuración de la configuración de red, pero parece que la unidad nunca se ejecuta. La respuesta a systemctl is-enabled <unit>es siempre static. Por supuesto, no puedo habilitarlo porque no hay WantedBy=. Después de todo, ¿para qué lo quiere? Esto es algo que hace alguna configuración antes de que la red se cargue.
deitch
puede intentar querer by = remote-fs.target o mount-fs.target.
Edward Torvalds
2
Gracias. Terminé haciendo Before=network-pre.targety Wants=network-pre.targetcomo para el [Install]que hice WantedBy=network.target. La última sección obligó a que la red lo requiriera, la primera lo ordenó. Sin embargo, fue un dolor
deitch
dado que definitivamente tienes tu cabeza alrededor del sistema mucho mejor que yo, ¿puedes mirar el otro q tengo? unix.stackexchange.com/questions/277783/… Todavía estoy tratando de descubrir cómo hacerlo.
deitch
Estoy confundido porque no tengo experiencia con la partición encriptada, si simplemente puede hacerlo, por favor hágalo
Edward Torvalds
3

Como se hizo en Debian Jessie, el paquete netfilter-persistent (que permite cargar las reglas de iptables antes de que la red esté activa) tiene un netfilter-persistent.service que se parece a:

# 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
usuario2024640
fuente
¿Por qué está en conflicto con el shutdown.target?
Alexis Wilke
1

El error es simple y una de las cosas principales que siempre mezclo: mezclas Beforey RequiredBy. Eso no va de la mano. Los otros tienen razón sobre el objetivo.

Perdición
fuente
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

Hacer algo a lo largo de estas líneas asegurará que esta unidad se haya ejecutado antes que la red, pero después de que se haya producido la mayoría de las otras configuraciones importantes.

spkane
fuente