¿Debian systemd network-online.target no funciona?

24

Estoy tratando de crear un servicio systemd en Debian Jessie. Lo necesito para comenzar después de que network-online.targetse alcanza.

El problema son los network-online.targetincendios al mismo tiempo network.targety en ese momento mis interfaces no están configuradas todavía, solo comencé la consulta DHCP.

Parece que este problema es específico de Debian porque usa la configuración de red heredada.

¿Cómo evitar este problema o cómo hacer que network-online.targetfuncione?

10robinho
fuente
¿Cuál es el resultado de systemctl list-dependencies network-online.target? Además, tenga en cuenta que network-online.targetpuede no necesariamente significar que hay acceso a Internet. Vea esta página para más información.
saiarcot895
La salida del comando es: network-online.target ● └─systemd-networkd-wait-online.service ya he leído esa página, entiendo el concepto básico allí, pero aún así es muy extraño no tener un punto definido donde puedan comenzar los servicios críticos de la red. Al menos podría esperar la asignación adecuada de DHCP.
10robinho
Esto significa que network-online.targetdepende solo del systemd-networkd-wait-online.servicedicho de que está listo. No depende de que NetworkManager diga que está listo, ni compruebe que ifuptodos los enlaces se hayan activado correctamente (si usa ese método para configurar su red). Ubuntu, por otro lado, depende de ifupNetworkManager, pero no para systemd-networkd-wait-online..
saiarcot895
¿Cómo está configurando su red /etc/network/interfaces, .networkarchivos systemd o NetworkManager?
saiarcot895
Tienes razón network-online.targety network.targetse activan justo después ifup. Yo uso debian default, así que /etc/network/interfacescon la dirección dhcp. Parece que networkd podría ser una mejor solución, pero no es fácil de implementar.
10robinho

Respuestas:

18

Como está utilizando /etc/network/interfaces, necesitará un servicio systemd para monitorear el estado de cada interfaz. Verifique si tiene /lib/systemd/system/ifup-wait-all-auto.service(instalado por el ifupdownpaquete en Ubuntu 15.04). Si no, cree /etc/systemd/system/ifup-wait-all-auto.servicey pegue lo siguiente:

[Unit]
Description=Wait for all "auto" /etc/network/interfaces to be up for network-online.target
Documentation=man:interfaces(5) man:ifup(8)
DefaultDependencies=no
After=local-fs.target
Before=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=2min
ExecStart=/bin/sh -ec '\
  for i in $(ifquery --list --exclude lo --allow auto); do INTERFACES="$INTERFACES$i "; done; \
  [ -n "$INTERFACES" ] || exit 0; \
  while ! ifquery --state $INTERFACES >/dev/null; do sleep 1; done; \
  for i in $INTERFACES; do while [ -e /run/network/ifup-$i.pid ]; do sleep 0.2; done; done'

[Install]
WantedBy=network-online.target

Este es el archivo de servicio presente en un sistema Ubuntu 15.04, pero con la [Install]sección agregada para facilitar un poco las cosas. Espero que el comportamiento de ifupUbuntu 15.04 sea el mismo que el de ifupDebian Jessie. De lo contrario, será necesaria alguna modificación (particularmente con la última línea).

Entonces, corre sudo systemctl enable ifup-wait-all-auto.service. Después de reiniciar su computadora, debería ver que network-online.targetse alcanza después de abrir las interfaces (al menos).

saiarcot895
fuente
Gracias por el esfuerzo, déjenme probarlo ahora y les daré su opinión
10robinho
Terminé ejecutando una versión ligeramente modificada ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'. Depende hostnamede verificar si se ha asignado la dirección IP.
luka5z
No intentes girarlo doctor. no es porque esté usando / etc / network / interfaces. Es porque systemd es muy descuidado y el trabajo se descarga a todos los usuarios en lugar de resolver el problema donde se creó.
Florian Heigl
1
fwiw, ifup-wait-all-auto.servicese ha descartado en la ifupdownversión 0.8.5ubuntu1: "Descartar ifup-wait-all-auto.service. Esto se ha implementado de manera más elegante haciendo
network-online.target wants
0

¡Atención! Lo descubrí en un Raspbian Jessie: elimina TODAS las líneas comentadas en / etc / interfaces de red y ¡funcionará! Parece ser un error de análisis =) En mi caso específico, lo dejé comentado iface eth0 inet dhcpy lo olvidé hace eones, pero después de actualizar a Raspbian Jessie y reconstruir un núcleo, tuve un comportamiento muy extraño: usé DHCP y me negué a hacerlo. realice un ajuste desde / etc / network / interfaces. Así que lo eliminé de cualquier comentario, solo líneas de trabajo, reinicio, ¡y funciona! NO SE NECESITA PATCHING / EDICIÓN DE SCRIPT!

Alexey Vesnin
fuente
Interesante, necesito probar esto. Aunque no tiene mucho sentido :)
10robinho
2
¿Tienes alguna referencia sobre esto? Me gustaría leer los informes de errores y ver el código de error.
ɈsәɹoɈ
No, no he abierto un ticket de error. Para reproducirlo, simplemente agregue algunos comentarios en su /etc/network/interfacesarchivo; se activará si todavía está allí.
Alexey Vesnin
0

De acuerdo con https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/, la forma recomendada de iniciar un servicio DESPUÉS de la conexión de redes es nivelar es usar " network-online.target " en el archivo .service :

 "After=network-online.target"
 "Wants=network-online.target"

Sin embargo, después de usar " network-online.target " y mi servicio fallaba porque la red no estaba completamente nivelada, descubrí que hay un error ( https://github.com/coreos/bugs/issues/1966 ) con él: no se garantiza que ser 100% infalible

De hecho, cuando se utilizan herramientas de configuración de redes dinámicas como " NetworkManager " como en este caso, el estado de las redes nunca puede ser 100% preciso o predecible. Aparentemente, desde el enlace que describe el error, " network-online.target " puede comportarse de manera inconsistente dependiendo de las diferentes aplicaciones con las que se utiliza.

Solución alternativa :
debe analizar el orden de inicio de los servicios y utilizar uno que comience más tarde que " network-online.target ":

 systemd-analyze plot > /home/pi/graph.svg

Este es un proceso iterativo que cambia los objetivos de forma incremental a servicios posteriores y posteriores hasta que encuentre el que garantice que la red esté nivelada y su servicio se inicie sin errores. En mi propio caso, incluso tuve que poner sleep 10en mi script el servicio SystemD llamado.

F1Linux
fuente
0

Una vez encontré una respuesta en Github que la resolvió intentando continuamente hacer ping a un servidor. Solo cuando llega el ping, el servicio continúa:

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=<your command>

Lo reemplacé google.comcon mi propio servidor porque mi script principal necesitaba conectarse a mi servidor.

Sam
fuente