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. .