Page 1 sur 2
[Montage réseau] Script attente de réseau pour systemd
Publié : mer. 13 févr. 2013, 01:14
par benjarobin
Bonjour,
Comme de nombreuses personnes possèdent des soucis avec les montages réseaux, et comme je n’apprécie pas trop l'utilisation de
x-systemd.automount
j'ai essayé de corriger ce point en m'inspirant de
NetworkManager-wait-online.service
J'ouvre ce sujet pour discuter de mon implémentation, pour permettre de suggérer des améliorations et pourquoi pas le mettre dans le Wiki et si oui quel serait le meilleur endroit ?
Donc voici les 2 fichiers nécessaires :
/usr/bin/network-wait-online.sh
Code : Tout sélectionner
#!/bin/bash
ADDR_PING=$1
TIMEOUT=$2
TIMEWAIT=$(( TIMEOUT * 5 ))
resping=3
for timeleft in $(eval "echo {$TIMEWAIT..0}")
do
timeleft=$(( timeleft / 5 ))
/usr/bin/ping -c1 -W$timeleft $ADDR_PING
resping=$?
if [ $resping -eq 2 ] ; then
sleep 0.2
else
break
fi
done
exit $resping
/etc/systemd/system/network-wait-online.service
Code : Tout sélectionner
[Unit]
Description=Network Wait Online
After=dhcpcd@eth0.service
Wants=network.target
Before=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/network-wait-online.sh 192.168.0.254 10
[Install]
WantedBy=network.target
Le service à été conçu pour être exécuté après mon service réseau qui est
dhcpcd@eth0.service
, mais il peut être remplacé par n'importe quel autre service réseau (Wicd, netcfg, ...)
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : mer. 13 févr. 2013, 02:06
par Tetsumaki
Plutôt pratique comme script, il pourrait être sympa de le faire fonctionner pour tous types de services réseau et tous types d'interfaces et pourquoi pas le mettre sur AUR ?
J'ai testé avec cette modification et ça fonctionne pour mon interface dhcpcd@enp0s25, avant :
Par :
Code : Tout sélectionner
After=dhcpcd.service dhcpcd@.service netcfg.service netcfg@.service
Il pourrait aussi être pratique d'initier le service de cette façon :
De cette façon pas besoin de modifier network-wait-online.service au cas par cas, on peut choisir qui pinger, que ce soit 8.8.8.8 / 192.168.1.254 / google.fr etc...
Je trouve les timers trop court aussi.
Pour pinger Internet c'est plus long et ça peut servir de vouloir attendre un accès au net pour les services comme ntpd par exemple.
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : mer. 13 févr. 2013, 08:56
par tuxce
J'allais écrire que pour les dhcpcd*, il me paraît plus simple de modifier le service qu'on utiliserait éventuellement pour le faire attendre une ip quand j'ai vu qu'en fait le dhcpcd@.service fait déjà cela, il ne rend la main que quand il a une adresse IP.
Pour dhcpcd.service, on peut le modifier pour ne pas lui passer le -b
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : mer. 13 févr. 2013, 09:40
par Tetsumaki
J'ai testé en faisant quelques modifications et ça marche aussi :
/usr/lib/systemd/system/network-wait-online@.service :
Code : Tout sélectionner
[Unit]
Description=Network Wait Online
After=dhcpcd.service dhcpcd@.service netcfg.service netcfg@.service
Wants=network.target
Before=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/network-wait-online.sh %I
[Install]
WantedBy=multi-user.target
/usr/bin/network-wait-online.sh :
Code : Tout sélectionner
#!/bin/bash
for i in `seq 1 20`
do
if eval "ping -c1 -W1 $1"; then
sleep 2
break
else
sleep 1
fi
done
exit
Activation du service :
systemctl status network-wait-online@8.8.4.4 :
Code : Tout sélectionner
network-wait-online@8.8.4.4.service - Network Wait Online
Loaded: loaded (/usr/lib/systemd/system/network-wait-online@.service; enabled)
Active: inactive (dead) since mer. 2013-02-13 09:44:46 CET; 1min 9s ago
Process: 323 ExecStart=/usr/bin/network-wait-online.sh %I (code=exited, status=0/SUCCESS)
févr. 13 09:44:40 tetsu-arch network-wait-online.sh[323]: connect: Network is unreachable
févr. 13 09:44:41 tetsu-arch network-wait-online.sh[323]: connect: Network is unreachable
févr. 13 09:44:42 tetsu-arch network-wait-online.sh[323]: connect: Network is unreachable
févr. 13 09:44:43 tetsu-arch network-wait-online.sh[323]: connect: Network is unreachable
févr. 13 09:44:44 tetsu-arch network-wait-online.sh[323]: PING 8.8.4.4 (8.8.4.4) 56(84) bytes of data.
févr. 13 09:44:44 tetsu-arch network-wait-online.sh[323]: 64 bytes from 8.8.4.4: icmp_seq=1 ttl=47 time=29.5 ms
févr. 13 09:44:44 tetsu-arch network-wait-online.sh[323]: --- 8.8.4.4 ping statistics ---
févr. 13 09:44:44 tetsu-arch network-wait-online.sh[323]: 1 packets transmitted, 1 received, 0% packet loss, time 0ms
févr. 13 09:44:44 tetsu-arch network-wait-online.sh[323]: rtt min/avg/max/mdev = 29.599/29.599/29.599/0.000 ms
févr. 13 09:44:46 tetsu-arch systemd[1]: Started Network Wait Online.
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : mer. 13 févr. 2013, 09:51
par benjarobin
@Tetsumaki Merci pour les suggestions, en effet on peut l'améliorer via passage de paramètre, mais sinon les timings sont déjà très long et celui-ci est un paramètre, personnellement je l'ai fixé à 10 secondes.
Une petite explication de mon script :
- On lance un ping avec 10 secondes de timeout
- S'il retourne 2 car aucune IP n'est encore fixé, on attend 0.2 seconde
- On lance un ping avec 10 secondes de timeout
- ...
- On lance un ping avec 9 secondes de timeout
- ...
- Si le ping retourne autre chose que 2, soit le ping a réussi soit il y a échoué après le timeout
- On retourne le code d’erreur pour en informer systemd
@Tetsumaki Ton script est pire que le mien, de plus pourquoi ajouter un sleep 2 ? Certes mon sleep 0.2 est un peu bourrin mais au moins on a une meilleur réactivité, après on peut très bien ajuster le code pour avoir un pas un peu moins brutale
@Tuxce J'utilise dhcpcd@.service et le service lancé après qui a comme dépendance network.target n'a pas immédiatement accès au réseau en IPv4 uniquement en IPv6...
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : mer. 13 févr. 2013, 09:59
par Tetsumaki
@benjarobin je suis d'accord il est crade mon network-wait-online.sh je voulais simplifier pour mes tests.
Je continue les tests.
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : mer. 13 févr. 2013, 10:34
par FoolEcho
Sur /usr/bin/network-wait-online.sh:
benjarobin a écrit :Code : Tout sélectionner
/usr/bin/ping -c1 -W$timeleft $ADDR_PING
resping=$?
if [ $resping -eq 2 ] ; then
sleep 0.2
else
break
fi
Je suppose que tu as testé mais je demande quand même: le sleep, même minime, est nécessaire ? (
) C'est-à-dire sortir sur un code autre que 2 et continuer la boucle sinon n'est pas suffisant ou la latence entre les 2 pings n'est pas suffisante sans le sleep ?
Sinon je ne peux pas tester, pas de montage réseau
... mais ce qui a été dit avant comme le passage des paramètres est mieux.
benjarobin a écrit :pourquoi pas le mettre dans le Wiki et si oui quel serait le meilleur endroit ?
C'est une colle vu qu'il n'y a pas de pages vraiment dédiées à ça...
On pourrait rajouter quelque chose sur la page de Systemd (équivalent à l'automount du wiki en) mais je pense qu'un script "officieux" n'y a pas trop sa place et la page est déjà bien chargée...
Du coup, je verrai bien ça sur la page Services dans une autre section qui pourrait regrouper tous les services de ce type comme on peut en trouver sur le wiki (en):
https://wiki.archlinux.org/index.php/Systemd/Services (et du coup en rapatrier éventuellement quelques uns ou au moins lier leur page).
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : mer. 13 févr. 2013, 11:55
par benjarobin
@FoolEcho Ping retourne comme code d'erreur 2 si le réseau n'est pas accessible et dans ce cas bien que l'on est définit un timeout via l'option "-W" ping retourne immédiatement. Donc en gros on essaye/on vérifie toute les 0.2 secondes que l'on est du réseau, et une fois que l'on en a, on fait un ping avec le timeout passé en paramètre
Si on ne met pas de sleep, on a 100% d'usage CPU car le ping retourne de suite
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : mer. 13 févr. 2013, 21:30
par benjarobin
Suite à vos nombreuses remarques que j'ai pu analyser cette fois ci à tête reposée, je propose une nouvelle version en ayant essayé de prendre en compte toute vos améliorations
/etc/systemd/system/network-wait-online@.service
Code : Tout sélectionner
[Unit]
Description=Network Wait Online
After=dhcpcd.service dhcpcd@.service netcfg.service netcfg@.service
Wants=network.target
Before=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/network-wait-online.sh %I
[Install]
WantedBy=network.target
/usr/bin/network-wait-online.sh
Code : Tout sélectionner
#!/bin/bash
ADDR_PING=$1
TIMEOUT=$2
[ -z "$ADDR_PING" ] && exit 5
[ -z "$TIMEOUT" ] && TIMEOUT=30
timeEnd=$(( $(date +%s) + TIMEOUT ))
timeLeft=$TIMEOUT
resPing=4
while [ $timeLeft -gt 0 ] ; do
/usr/bin/ping -c1 -W1 $ADDR_PING
resPing=$?
if [ $resPing -eq 0 ] ; then
break
else
sleep 0.3
timeLeft=$(( timeEnd - $(date +%s) ))
fi
done
exit $resPing
Ou alors cette version qui n'utilise pas de ping, mais qui à l’inconvénient de fournir toujours un résultat s'il y a une gateway valide de définit et que l'on possède 2 cartes réseaux : Une externe et une interne, l'IP de l'externe ayant été positionnée avant celle de l'interne... Cela devient difficile de faire du générique, je crains que ce soit plus simple de fournir des exemples et les personnes pourront s'en inspirer
Code : Tout sélectionner
#!/bin/bash
ADDR_ROUTE=$1
TIMEOUT=$2
[ -z "$ADDR_ROUTE" ] && exit 5
[ -z "$TIMEOUT" ] && TIMEOUT=30
nbStepLeft=$(( TIMEOUT * 5 ))
while [ $nbStepLeft -gt 0 ] ; do
/usr/sbin/ip route get $ADDR_ROUTE && exit 0
sleep 0.2
nbStepLeft=$(( nbStepLeft - 1 ))
done
exit 1
Merci encore... J'attends les critiques de pied ferme
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : jeu. 14 févr. 2013, 11:26
par Tetsumaki
Je vais tester ça de suite.
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : jeu. 14 févr. 2013, 11:59
par Tetsumaki
Ça fonctionne super bien.
J'ai supprimé :
dans mon /etc/fstab et aucune erreur au boot.
Pour mes tests j'ai désactivé le lancement automatique de gdm pour bien voir le déroulement.
Je l'ai activé de cette façon :
Je me suis fais un paquet pour l'installer proprement sur mon serveur, ça te dérange si je le publie sur AUR ou pas ?
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : jeu. 14 févr. 2013, 12:17
par benjarobin
Je préfère le gérer moi même, je suis l'auteur et donc son mainteneur, ce sera plus pratique... Le but de se sujet est d'avoir des retours avant une éventuelle publication sur AUR, Wiki...
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : jeu. 14 févr. 2013, 12:27
par Tetsumaki
Aucun problème benjarobin, c'est tout à ton honneur ne t'inquiètes pas.
Quoi qu'il arrive j'ai mis le paquet pour mes tests ici provisoirement
http://tetsumaki.free.fr/network-wait-online/
Je ne permettrais pas de le mettre sur AUR.
Il pourrait être sympa de faire encore une modification sans doute.
Avant :
Code : Tout sélectionner
After=dhcpcd.service dhcpcd@.service netcfg.service netcfg@.service
Après :
Code : Tout sélectionner
After=dhcpcd.service dhcpcd@.service netcfg.service netcfg@.service NetworkManager.service wicd.service
Je sais qu'il existe NetworkManager-wait-online.service pour NetworkManager mais je me suis dis que ça ne coûtait rien d'ajouter NetworkManager.service et wicd.service.
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : jeu. 14 févr. 2013, 13:26
par benjarobin
Je me posais aussi cette question, doit-on ajouter tous les gestionnaires réseaux, par défaut je ne pense pas que mettre NetworkManager soit une bonne idée, car NetworkManager à un comportement très particulier et différent des autres, en effet je compter ajouter wicd à la liste
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : jeu. 14 févr. 2013, 20:17
par Tetsumaki
Oui tu dois avoir raison concernant networkmanager et ne pas le mettre est une bonne idée.
J'ai installé mon paquet sur le serveur et sur le pc et ça marche au poil.
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : ven. 15 févr. 2013, 19:00
par Tetsumaki
Ça avance benjarobin ?
Pour ma part je trouve ça nickel comme il est actuellement, adopté sur mes 2 machines, j'ai testé pas mal de reboot et aucune erreur avec smbd ou autres.
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : ven. 15 févr. 2013, 20:08
par benjarobin
Je m'en occuperai ce Week-end, rien ne presse non ?
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : ven. 15 févr. 2013, 20:09
par Tetsumaki
Non pas du tout.
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : sam. 16 févr. 2013, 16:57
par benjarobin
Re: [Montage réseau] Script attente de réseau pour systemd
Publié : sam. 16 févr. 2013, 22:01
par Tetsumaki
Salut, il y a une erreur dans ton PKGBUILD et je me suis permis 2-3 modifications.
1. Manque les guillemets, du coup erreur à la création du package si je me trouve dans un répertoire avec des espaces.
J'ai eu cette erreur en me trouvant dans "/home/tetsumaki/test 123/" :
Code : Tout sélectionner
==> ERREUR : Vous n'avez pas les permissions nécessaires (accès en écriture) pour enregistrer les paquets dans /home/tetsumaki/test.
Abandon...
2. Je pense qu'il pourrait être sympa d'ajouter systemd en dépendance, en théorie on l'a forcément mais sur une vieille install, non.
3. C'est pas très propre d'utiliser mkdir dans un PKGBUILD, il est préférable d'utiliser install -D, de plus ça raccourci le code et c'est plus lisible.
Exemple :
Code : Tout sélectionner
package() {
install -Dm755 "${srcdir}/network-wait-online.sh" "${pkgdir}/usr/bin/network-wait-online"
install -Dm644 "${srcdir}/network-wait-online@.service" "${pkgdir}/usr/lib/systemd/system/network-wait-online@.service"
}
Je me suis permis de mettre le paquet ainsi que le paquet source modifié ici :
http://tetsumaki.free.fr/network-wait-online/
Pour comparer :
Ton PKGBUILD :
https://aur.archlinux.org/packages/ne/n ... e/PKGBUILD
Mon PKGBUILD :
http://tetsumaki.free.fr/network-wait-online/PKGBUILD
Je me suis mis en contributor, libre à toi d'accepter, en tout cas ton script me tiens à coeur réellement ça m'honorerait, sérieusement je me vois mal ne pas l'utiliser, ça évite vraiment pas mal d'erreur au boot avec mes services réseaux (smbd, ntpd, ...)
Je pense aussi qu'il serait sympa d'ajouter un network-wait-online.install avec une fonction post_instal() expliquant en anglais que pour activer le service il faut tapper systemctl enable network-wait-install@maValeur, maValeur correspondant à la une ip publique/privé ou un dns exemple 8.8.4.4 ou google.fr par exemple.
PS : j'ai voté pour ton paquet, t'as même pas voté pour ton propre paquet!