En dependencias de configuración de red systemd
Es muy fácil afectar el orden de las unidades de systemd. Por otro lado, debe tener cuidado con lo que garantiza una unidad completa.
Configura tu servicio
En los sistemas actuales, ordenar después network.target
solo garantiza que se ha iniciado el servicio de red, no que haya alguna configuración real. Necesita ordenar después network-online.target
y tirar de él para lograrlo.
[Unit]
Wants=network-online.target
After=network-online.target
Para la compatibilidad con sistemas más antiguos, es posible que también deba realizar un pedido después de network.target.
[Unit]
Wants=network-online.target
After=network.target network-online.target
Eso es para el archivo de la unidad de su servicio y para systemd.
Implementación en versiones actuales de software
Ahora debe asegurarse de que network-online.target
funciona como se esperaba (o que al menos puede usar network.target
).
La versión actual de NetworkManager ofrece lo NetworkManager-wait-online.service
que obtiene network-online.target
y, por lo tanto, su servicio. Este servicio especial garantiza que su servicio esperará hasta que todas las conexiones configuradas para iniciarse se realicen correctamente, fallen o finalicen automáticamente.
La versión actual de systemd-networkd bloquea su servicio hasta que todos los dispositivos estén configurados según lo solicitado. Es más fácil porque actualmente solo admite configuraciones que se aplican en el momento del arranque (más específicamente el tiempo de inicio de `systemd-networkd.service).
En aras de la integridad, el /etc/init.d/network
servicio en Fedora, tal como lo interpretan las versiones actuales de systemd, bloquea network.target
y por lo tanto indirectamente bloquea network-online.target
y su servicio. Es un ejemplo de una implementación basada en script.
Si su implementación, ya sea basada en daemon o basada en script, se comporta como uno de los servicios de administración de red anteriores, retrasará el inicio de su servicio hasta que la configuración de la red se complete con éxito, falle por una buena razón o se agote el tiempo después de un tiempo razonable marco para completar.
Es posible que desee verificar si netctl funciona de la misma manera y esa información sería una valiosa adición a esta respuesta.
Implementaciones en versiones anteriores de software
No creo que vea una versión suficientemente antigua de systemd donde esto no funcione bien. Pero puede comprobar que al menos network-online.target
existe y que se ordena después network.target
.
Anteriormente, NetworkManager solo garantizaba que se aplicaría al menos una conexión. E incluso para que eso funcione, tendrías que habilitarlo NetworkManager-wait-online.service
explícitamente. Esto se ha solucionado durante mucho tiempo en Fedora, pero solo se aplicó recientemente en sentido ascendente.
systemctl enable NetworkManager-wait-online.service
Notas sobre las implementaciones de network.target y network-online.target
Usted no debe necesitar para hacer su software de depender NetworkManager.service
o NetworkManager-wait-online.service
ni otros servicios específicos. En cambio, todos los servicios de administración de red deben ordenarse antes network.target
y opcionalmente network-online.target
.
Un servicio de administración de red basado en un script simple debe finalizar la configuración de la red antes de salir y debe ordenarse antes network.target
y, por lo tanto, indirectamente antes network-online.target
.
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Un servicio de administración de red basado en daemon también debe solicitarse antes network.target
aunque no sea muy útil.
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
Un servicio que espera a que finalice el demonio debe solicitarse después del servicio específico y antes network-online.target
. Debería usarse Requisite
en el servicio daemon para que falle inmediatamente si no se usa el servicio de administración de red respectivo.
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
El paquete debe instalar un enlace simbólico al servicio de espera en el wants
directorio para network-online.target
que sea atraído por los servicios que desean esperar la red configurada.
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
Documentación relacionada
Notas finales
Espero que no solo haya ayudado a responder su pregunta en el momento en que la hizo, sino que también haya contribuido a mejorar la situación en las distribuciones ascendentes y Linux, para que ahora pueda dar una mejor respuesta de la que era posible al momento de escribir la original. .
no-auto-default
, soloauto
. ¿Tienes alguna pregunta específica? En mi opinión, la página de manual de nm-online establece claramente que con-s
ella espera a que se intenten todas las conexiones automáticas, es decir, conectadas o fallidas./etc/init.d/network
o similar, pero eso no funciona universalmente.Puede usar
After
en la[Unit]
sección para definir un servicio que debe iniciarse antes de que comience su servicio. Por ejemplo, si está utilizando NetworkManager, puede hacer que su servicio se inicie después de que se inicie NetworkManager.fuente
BindsTo
No es tan apropiado aquí, ya que el servicio es un evento único y no un servicio persistente (a menos que también incluya unaExecStop
función para disparar cuando la red deja de funcionar).BindsTo
BindsTo
embargo, podría agregar algo para reemplazar , por ejemploRequires
, si solo desea que el servicio se ejecute si lo hace NetworkManager.After
en realidad no hace eso, solo significa que si NM también se está ejecutando, ejecute esto después. Si NM no se ejecutará, el servicio se ejecutará en un punto arbitrario.After=foo
será no hacer que lafoo
unidad se inicia si no se ha iniciado, será solamente decirle systemd cómo ordenar las unidades si están iniciados al mismo tiempo . Usar ambosAfter=foo
, así comoWants=foo
oRequires=foo
tendrá el efecto de atraerfoo
si no se inicia, y también hacer que systemd ordene las unidades correctamente.Si su servicio proporciona un servidor, que puede esperar pasivamente a que alguien se conecte a él, use esto:
Su servicio debe vincularse en la interfaz comodín. Si usa la activación de socket (recomendado), o si es solo local, puede ignorar los destinos de red por completo.
Si su servicio actúa como un cliente, o es de igual a igual, esto es más apropiado:
Antes de systemd 213 , network-online.target necesita la solución mencionada por Pavel (debe habilitar manualmente un servicio que esperará a que la red esté activa). A partir de systemd 213 esto se hace por defecto.
systemd-networkd-wait-online
esperará a que se configure al menos una dirección (ya sea enrutable o local de enlace) en una interfaz que no sea de bucle invertido.Configurar systemd-networkd, NetworkManager o equivalente es una tarea independiente. DHCP (para IPv4) y NDP (para IPv6) tienden a funcionar de forma inmediata, pero debe configurarlos para que su definición precisa de "la red esté activa" es lo que desencadena
network-online.target
.Documentación:
fuente
Eso tendrá el efecto opuesto de lo que quieres. De
man systemd.unit
:En base a esto, podemos ver que la opción de unidad adecuada es "Desea" o "Requiere"; basado en la descripción de estos, "Requiere" probablemente sea correcto, con la adición de "Después" para garantizar no solo que el servicio de red se ejecute, sino que se ejecute antes de esta unidad.
Ninguna de las opciones de la unidad, AFAIK, puede incluir la estipulación de que un requisito inicial debe haberse completado o alcanzado un cierto punto (la creación de redes es probablemente un servicio demonio), solo que se inicia primero. Con esto en mente, es posible que desee hacer su secuencia de comandos
Type=forking
y lanzar un retraso saludable (por ejemplo, 30 segundos), o algún tipo de ciclo de salida al éxito que incluya un retraso, para asegurarse de que primero tenga un contrato de arrendamiento de DHCP.fuente
After
junto conRequires
"para garantizar que no solo se ejecute el servicio de red, sino que se ejecute antes que esta unidad".After
trabaja juntoWants
o deRequires
esa manera. Por otro lado, los retrasos explícitos son un mal hábito en las herramientas basadas en la dependencia, especialmente cuando hay una forma explícita de esperar hasta que la red esté configurada según la documentación del sistema, por lo que debo insistir en el voto negativo.Use
After
en la[Unit]
sección para especificar qué debe comenzar antes de su propio servicio. (Esta gran parte de la respuesta anterior es correcta).Para iniciar su servicio después de que la red esté activa, use el objetivo de red, que debe aplicarse si usa NetworkManager, el sistema conf.d / netctl en Arch o algún otro servicio que systemd conozca.
Una breve mirada confirmará que todos los demás servicios en su sistema que dependen de la conectividad de red contienen esta directiva.
También es portátil para cualquier distribución que use systemd. Su archivo de unidad será el mismo para Arch, Fedora, RHEL 7, futuras versiones de Debian ...
Los servicios que inician una conexión de red, como los scripts de Arch o los suyos, deben especificarlo en sus propios archivos de unidad.
fuente
Wants
parte porque tiene efectos secundarios en otros paquetes. Mira mi respuesta, por favor.Wants
elnetwork.target
es una buena idea aquí.Quería agregar un punto a este artículo. Actualmente (verano de 2015) en RHEL7 / CentOS 7, network-online.target está configurado incorrectamente antes de que la red IPv6 esté activa, por lo que los demonios que tienen
en su definición de servicio que también se vincula explícitamente a las direcciones IPv6, probablemente se iniciará antes de que IPv6 esté en funcionamiento, lo que provocará un error.
fuente
/etc/init.d/network
. Si tiene el mismo problema incluso con NM, entonces sería una buena razón para presentar una solicitud de función. No he consultado con RHEL / CentOS, puedo ayudarlo con los detalles si está interesado.funciona para mi.
fuente
networkd
proporciona su propio servicio / wait-online /. Entrar y ordenar despuésnetwork-online.target
es la manera correcta de ir con cualquier servicio que lo respalde.