[WakeOnLan] Résolu : allumer serveur au démarrage d'un PC
[WakeOnLan] Résolu : allumer serveur au démarrage d'un PC
Bonjour,
Je suis actuellement en train de me monter un serveur en remplacement de mon NSLU2. Ce serveur a plusieurs fonctions :
- Passerelle wifi vers ethernet.
- Firewall.
- Serveur de fichiers (Samba et/ou NFS).
- Serveur DHCP.
- Serveur d'impression (Cups).
- Serveur NTP.
- et bien d'autres à venir.
Etant donné qu'il est plus bruyant et consomme plus d'énergie, je souhaiterais l'arrêter automatiquement le soir (ça je devrais y arriver avec un petit script) et qu'il s'allume automatiquement le matin lorsque j'allume mon PC.
J'utilise donc le WakeOnLan. Après l'avoir configuré et testé manuellement, ça marche très bien.
Seulement voilà, pour que la commande wakeonlan soit exécutée au boot du PC, j'avais pensé utiliser le POST_UP dans la configuration de netcfg. Problème, le serveur servant de serveur DHCP, impossible de récupérer une adresse avant le boot du serveur (logique).
Je me dis tant pis, je vais le passer en IP fixe. Là pas de soucis, mais mes partages Samba ne peuvent pas se monter vu que le serveur n'a pas fini son boot au moment du montage des netfs.
L'idée serait donc que le serveur soit démarré le plus tôt possible afin qu'il puisse servir le DHCP (à mon avis ce n'est pas possible) et présenter les partages réseaux.
Donc si quelqu'un a une solution à me proposer pour régler ce soucis je l'en remercie.
Je suis actuellement en train de me monter un serveur en remplacement de mon NSLU2. Ce serveur a plusieurs fonctions :
- Passerelle wifi vers ethernet.
- Firewall.
- Serveur de fichiers (Samba et/ou NFS).
- Serveur DHCP.
- Serveur d'impression (Cups).
- Serveur NTP.
- et bien d'autres à venir.
Etant donné qu'il est plus bruyant et consomme plus d'énergie, je souhaiterais l'arrêter automatiquement le soir (ça je devrais y arriver avec un petit script) et qu'il s'allume automatiquement le matin lorsque j'allume mon PC.
J'utilise donc le WakeOnLan. Après l'avoir configuré et testé manuellement, ça marche très bien.
Seulement voilà, pour que la commande wakeonlan soit exécutée au boot du PC, j'avais pensé utiliser le POST_UP dans la configuration de netcfg. Problème, le serveur servant de serveur DHCP, impossible de récupérer une adresse avant le boot du serveur (logique).
Je me dis tant pis, je vais le passer en IP fixe. Là pas de soucis, mais mes partages Samba ne peuvent pas se monter vu que le serveur n'a pas fini son boot au moment du montage des netfs.
L'idée serait donc que le serveur soit démarré le plus tôt possible afin qu'il puisse servir le DHCP (à mon avis ce n'est pas possible) et présenter les partages réseaux.
Donc si quelqu'un a une solution à me proposer pour régler ce soucis je l'en remercie.
Dernière modification par toma222 le dim. 03 août 2008, 18:06, modifié 1 fois.
Re: [WakeOnLan] allumer serveur au démarrage d'un PC
Bonjour.toma222 a écrit :mais mes partages Samba ne peuvent pas se monter vu que le serveur n'a pas fini son boot au moment du montage des netfs.
L'idée serait donc que le serveur soit démarré le plus tôt possible afin qu'il puisse servir le DHCP (à mon avis ce n'est pas possible) et présenter les partages réseaux.
Si j'ai bien saisis ton problème, tu as 2 ordinateurs : ton PC et un serveur. Le serveur démarre trop lentement pour que tes partages réseaux soient actifs lorsque ton PC les demande.
J'ai bon ?
Une idée : ralentir le démarrage de ton PC.
- Ton PC démarre.
- Ton PC demande au serveur de démarrer.
- Un script « sleep 3m » bloque le démarrage de ton PC, ce qui laisse le temps au serveur de booter et de mettre en place les services réseaux.
- Enfin, ton PC finit de démarrer. À ce moment-là, ton serveur est déjà pleinement opérationnel.
Ok, j'avais bien pensé à passer par un sleep. Le serveur boot rapidement (sauf en cas de fsck), donc un sleep 30s suffirait je pense.
Mais il y a peut-être mieux à faire, par exemple un script qui teste que le serveur est prêt, avec timeout au cas où. Par contre comment savoir quand il est prêt ? Il faudrait pouvoir détecter que le service samba est lancé par exemple.
Par contre, pour le DHCP je ne voit pas de solution, il faut que l'interface soit up pour lancer le WakeOnLan.
A moins que vous ne voyez d'autres alternatives ?
Mais il y a peut-être mieux à faire, par exemple un script qui teste que le serveur est prêt, avec timeout au cas où. Par contre comment savoir quand il est prêt ? Il faudrait pouvoir détecter que le service samba est lancé par exemple.
Par contre, pour le DHCP je ne voit pas de solution, il faut que l'interface soit up pour lancer le WakeOnLan.
A moins que vous ne voyez d'autres alternatives ?
1 - Attribue une IP fixe à ton PC, afin de faire booter le serveur (ce que tu fais actuellement)toma222 a écrit :Par contre, pour le DHCP je ne voit pas de solution, il faut que l'interface soit up pour lancer le WakeOnLan.
2 - Une fois que le serveur est opérationnel, désactive l'interface réseau de ton PC, et réactive-là avec une configuration DHCP.
Il reste le problème suivant : quel test pour savoir si le serveur est opérationnel ?
Pour tester la présence d'un ordinateur sur le réseau :
Code : Tout sélectionner
#!/bin/bash
IP_ORDINATEUR=192.168.1.18
while !(ping -c1 -W1 $IP_ORDINATEUR > /dev/null)
do
echo "L'ordinateur $IP_ORDINATEUR est inaccessible."
done
echo "L'ordinateur $IP_ORDINATEUR est enfin accessible.
Dernière modification par Vinvin le dim. 03 août 2008, 14:19, modifié 1 fois.
Merci Vinvin, ça me semble être une solution intéressante. L'idée de booter avec une IP fixe puis de passer en DHCP me semble très bonne.
Donc ça sera :
- boot en IP fixe.
- script d'attente que le serveur soit prêt. J'ajouterais un timeout pour ne pas tomber dans une boucle infinie et j'ajouterais quelques secondes pour être sûr que les services du serveur soient démarrés.
- arrêt relance de l'interface en DHCP.
- ouverture des partages Samba.
Plus qu'à mettre cela en place et à tester.
Donc ça sera :
- boot en IP fixe.
- script d'attente que le serveur soit prêt. J'ajouterais un timeout pour ne pas tomber dans une boucle infinie et j'ajouterais quelques secondes pour être sûr que les services du serveur soient démarrés.
- arrêt relance de l'interface en DHCP.
- ouverture des partages Samba.
Plus qu'à mettre cela en place et à tester.
Voici le script que j'ai mis en place en m'appuyant sur celui de Vinvin :
J'utilise nmap au lieu du ping pour détecter que le service Samba est lancé sur le serveur.
Ce script est lancé par un POST_UP dans un profil netcfg2 ethernet-static (IP fixe). Je l'ai testé et ça fonctionne parfaitement.
Il me manque plus qu'à trouver un système de timeout pour ne pas bloquer le boot du PC dans le cas où le serveur ne booterait pas pour une raison ou une autre.
Pour faire plus propre j'aurais voulu faire une chose du genre :
Pour avoir une ligne type :
Problème, j'ai des retours à la ligne automatique à chaque echo. Il y a t'il un moyen de l'éviter ?
Si vous avez des pistes d'améliorations pour ce script je vous en remercie.
Code : Tout sélectionner
wakeonlan $MAC_Serveur
while !(nmap $IP_Serveur | grep netbios > /dev/null)
do
echo "Le serveur n'est pas prêt."
done
echo "Le serveur est prêt".
/etc/rc.d/net-profiles stop
netcfg2 ethernet-dhcp
Ce script est lancé par un POST_UP dans un profil netcfg2 ethernet-static (IP fixe). Je l'ai testé et ça fonctionne parfaitement.
Il me manque plus qu'à trouver un système de timeout pour ne pas bloquer le boot du PC dans le cas où le serveur ne booterait pas pour une raison ou une autre.
Pour faire plus propre j'aurais voulu faire une chose du genre :
Code : Tout sélectionner
echo "Attente de démarrage du Serveur"
while !(nmap $IP_Serveur | grep netbios > /dev/null)
do
echo "."
done
echo "Le serveur est prêt".
Code : Tout sélectionner
Attente de démarrage du Serveur.......................
Si vous avez des pistes d'améliorations pour ce script je vous en remercie.
Salut,
++ B.
Code : Tout sélectionner
echo -n '.'
Bonne idée d'utiliser nmap au lieu du ping !
Première remarque :Plutôt que de scanner tous les ports du serveur, ne scanne que le port de samba, cela sera moins long.
Je crois que c'est quelque chose comme ça :(À vérifier)
Seconde remarque :
Tu vérifies que le service Samba est bien lancé. OK.
Toutefois, avant de désactiver ton interface puis de la réactiver en configuration DHCP, tu peux effectuer une seconde vérification : le service DHCP est-il bien lancé sur le serveur ?
Un truc du genre :
Pour la mise en place d'un timeout, je ne pourrais pas t'aider.
Première remarque :
Code : Tout sélectionner
nmap $IP_Serveur | grep netbios
Je crois que c'est quelque chose comme ça :
Code : Tout sélectionner
nmap $IP_Serveur -p numéro_du_port
Seconde remarque :
Tu vérifies que le service Samba est bien lancé. OK.
Toutefois, avant de désactiver ton interface puis de la réactiver en configuration DHCP, tu peux effectuer une seconde vérification : le service DHCP est-il bien lancé sur le serveur ?
Un truc du genre :
Code : Tout sélectionner
nmap $IP_Serveur -p numéro_du_port_de_samba,numéro_du_port_du_DHCP
@maxi_jac : merci, c'est exactement ce que je cherchais.
@Vinvin : c'est vrai je n'ai pas besoin de scanner tous les ports. Pour le DHCP, le problème c'est que je ne vois pas de ports ouverts qui y correspondent. J'ai peut-être été un peu restrictif avec ma configuration iptables mais ça me semble bizarre. Pour le moment ça passe, le DHCP doit-être lancé avant Samba sur mon serveur.
Sinon pour le timeout j'essaies quelque chose de la forme :
Mais j'ai des erreurs dans la syntaxe de ma boucle while. Comment faire un while avec double condition ? Merci.
@Vinvin : c'est vrai je n'ai pas besoin de scanner tous les ports. Pour le DHCP, le problème c'est que je ne vois pas de ports ouverts qui y correspondent. J'ai peut-être été un peu restrictif avec ma configuration iptables mais ça me semble bizarre. Pour le moment ça passe, le DHCP doit-être lancé avant Samba sur mon serveur.
Sinon pour le timeout j'essaies quelque chose de la forme :
Code : Tout sélectionner
wakeonlan $MAC_Serveur
echo -n "Attente de démarrage du Serveur"
while !(nmap $IP_Serveur -p139 | grep open > /dev/null) && ($i -lt 10)
do
echo -n "."
i=$(($i+1))
done
if [ $i -gt 10 ]
then
echo ""
echo "Le serveur n'est pas joignable."
echo "On reste en IP fixe."
else
echo ""
echo "Le serveur est prêt."
echo "On passe en DHCP."
/etc/rc.d/net-profiles stop
netcfg2 ethernet-dhcp
fi
Finalement je pense m'en être sorti avec le code suivant :
Ce n'est sans doute pas le plus propre mais ça fera l'affaire.
Merci à tous pour le coup de main.
Code : Tout sélectionner
timeout=60
i=0
wakeonlan $MAC_Serveur
echo -n "Attente de démarrage du Serveur"
while !(nmap $IP_Serveur -p139 | grep open > /dev/null)
do
echo -n "."
i=$(($i+1))
if [ $i -ge $timeout ]
then
break
fi
done
if [ $i -ge $timeout ]
then
echo ""
echo "Le serveur n'est pas joignable."
echo "On reste en IP fixe."
else
echo ""
echo "Le serveur est prêt."
echo "On passe en DHCP."
/etc/rc.d/net-profiles stop
netcfg2 ethernet-dhcp
fi
Merci à tous pour le coup de main.
Remarque à deux sous :
?
Sinon, tu peux aussi utiliser "netcat (ou nc)" pour faire ton scan.
Et pour le DHCP, essaye le port 67 en UDP (si je ne m'abuse...).
Code : Tout sélectionner
for i in $(seq 1 10); do
ta boucle qui va bien avec un "exit" en cas de réussite
sleep 1
done
passage "on reste en IP fixe"...
Sinon, tu peux aussi utiliser "netcat (ou nc)" pour faire ton scan.
Et pour le DHCP, essaye le port 67 en UDP (si je ne m'abuse...).
Laptop1 : Clevo W110ER, core i5-3210M, 8Gb RAM, Intel® Ivybridge Mobile (GT2)/NVIDIA GT 650M, x86_64
Laptop2 : Sony Vaio SR41M, Core 2 Duo T6400, 4Gb RAM, ATI Radeon HD 4750, x86_64
Laptop2 : Sony Vaio SR41M, Core 2 Duo T6400, 4Gb RAM, ATI Radeon HD 4750, x86_64
Merci,
Pour le moment mon script tourne nickel donc je n'y touche pas .
Pour le DHCP c'est bien ce que je pensais mais je ne le vois pas ouvert avec nmap. Bizarre parce que je reçois bien une adresse.
Il faut que je peaufine mes règles iptables, ça vient peut être de là, je créérais un topic pour demander un coup de main aux spécialistes iptables.
Pour le moment mon script tourne nickel donc je n'y touche pas .
Pour le DHCP c'est bien ce que je pensais mais je ne le vois pas ouvert avec nmap. Bizarre parce que je reçois bien une adresse.
Il faut que je peaufine mes règles iptables, ça vient peut être de là, je créérais un topic pour demander un coup de main aux spécialistes iptables.
Yé !toma222 a écrit :Il faut que je peaufine mes règles iptables
Avec le temps que j'ai mis à construire mes règles iptables, j'espère pouvoir te donner un coup de main.
L'article d'Olivier Allard-Jacquin est une excellente initiation à Iptables/Netfilter.
Suite aux conseils de Vinvin, j'ai modifié le script pour détecter le démarrage du serveur DHCP au lieu de Samba. En fait il se lance après Samba, mais vu qu'il y a un timeout ça passait. Voici le nouveau script qui marche impec :
Code : Tout sélectionner
timeout=360
i=0
wakeonlan $MAC_Serveur
echo -n "Attente de démarrage du Serveur"
while !(nmap $IP_Serveur -p67 -sU | grep open > /dev/null)
do
echo -n "."
i=$(($i+1))
if [ $i -ge $timeout ]
then
break
fi
done
if [ $i -ge $timeout ]
then
echo ""
echo "Le serveur n'est pas joignable."
echo "On reste en IP fixe."
else
echo ""
echo "Le serveur est prêt."
echo "On passe en DHCP."
/etc/rc.d/net-profiles stop
netcfg2 ethernet-dhcp
fi
- chipster
- Maître du Kyudo
- Messages : 2063
- Inscription : ven. 11 août 2006, 22:25
- Localisation : Saint-Étienne (42)
- Contact :
Perso la gestion du temps est vraiment bourrin car vous mangez des cycles CPU comme des malades ^^
Bon, je tiens à préciser que je ne programme pas en bash mais si ça peut vous donnez des idées d'améliorations, en programmation de jeu, on procède comme ceci :
Voilà
Amusez vous bien
Bon, je tiens à préciser que je ne programme pas en bash mais si ça peut vous donnez des idées d'améliorations, en programmation de jeu, on procède comme ceci :
Code : Tout sélectionner
début de la boucle
on regarde si le serveur a démarré ou non;
si c'est le cas on continue le démarrage;
autrement on récupère le temps système;
on rajoute 1 ou 2 ou 3 ... seconde(s) (selon les gouts et les couleurs) au temps système.
on revient au début de la boucle pour regarder si le temps est supérieur ou égal au temps total (temps récupéré + ajout)
Si c'est le cas, on passe dans la boucle
autrement on saute la boucle
Amusez vous bien