[WakeOnLan] Résolu : allumer serveur au démarrage d'un PC

Reconnaissance et configuration du matériel / kernel linux
Répondre
toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

[WakeOnLan] Résolu : allumer serveur au démarrage d'un PC

Message par toma222 » sam. 02 août 2008, 12:05

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.
Dernière modification par toma222 le dim. 03 août 2008, 18:06, modifié 1 fois.

Avatar de l’utilisateur
Vinvin
yeomen
Messages : 290
Inscription : ven. 14 déc. 2007, 14:37
Localisation : Rennes

Re: [WakeOnLan] allumer serveur au démarrage d'un PC

Message par Vinvin » sam. 02 août 2008, 14:58

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

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 ? :D

Une idée : ralentir le démarrage de ton PC.
  1. Ton PC démarre.
  2. Ton PC demande au serveur de démarrer.
  3. 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.
  4. Enfin, ton PC finit de démarrer. À ce moment-là, ton serveur est déjà pleinement opérationnel.

toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

Message par toma222 » sam. 02 août 2008, 17:12

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 ?

maxi_jac
Daikyu
Messages : 94
Inscription : dim. 15 juin 2008, 17:43

Message par maxi_jac » sam. 02 août 2008, 18:09

Ca dépend de "l'accessibilité" de ton serveur mais pourquoi pas faire l'inverse ?
C'est le serveur qui enverrait le signal de WOL au client ?


++ B.

toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

Message par toma222 » sam. 02 août 2008, 20:43

Je n'avais pas pensé à cette possibilité. Pour le moment le serveur est proche du PC donc ça serait possible. Je vais y réfléchir, merci.

Avatar de l’utilisateur
Vinvin
yeomen
Messages : 290
Inscription : ven. 14 déc. 2007, 14:37
Localisation : Rennes

Message par Vinvin » sam. 02 août 2008, 23:46

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.
1 - Attribue une IP fixe à ton PC, afin de faire booter le serveur (ce que tu fais actuellement)
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 ?

Avatar de l’utilisateur
Vinvin
yeomen
Messages : 290
Inscription : ven. 14 déc. 2007, 14:37
Localisation : Rennes

Message par Vinvin » dim. 03 août 2008, 02:35

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.

toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

Message par toma222 » dim. 03 août 2008, 11:34

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.

toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

Message par toma222 » dim. 03 août 2008, 15:03

Voici le script que j'ai mis en place en m'appuyant sur celui de Vinvin :

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

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".
Pour avoir une ligne type :

Code : Tout sélectionner

Attente de démarrage du Serveur.......................
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.

maxi_jac
Daikyu
Messages : 94
Inscription : dim. 15 juin 2008, 17:43

Message par maxi_jac » dim. 03 août 2008, 15:53

Salut,

Code : Tout sélectionner

echo -n '.'
++ B.

Avatar de l’utilisateur
Vinvin
yeomen
Messages : 290
Inscription : ven. 14 déc. 2007, 14:37
Localisation : Rennes

Message par Vinvin » dim. 03 août 2008, 16:15

Bonne idée d'utiliser nmap au lieu du ping ! :)

Première remarque :

Code : Tout sélectionner

nmap $IP_Serveur | grep netbios
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 :

Code : Tout sélectionner

nmap $IP_Serveur -p numéro_du_port
(À 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 :

Code : Tout sélectionner

nmap $IP_Serveur -p numéro_du_port_de_samba,numéro_du_port_du_DHCP
Pour la mise en place d'un timeout, je ne pourrais pas t'aider. :pleure:

toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

Message par toma222 » dim. 03 août 2008, 17:06

@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 :

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
Mais j'ai des erreurs dans la syntaxe de ma boucle while. Comment faire un while avec double condition ? Merci.

toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

Message par toma222 » dim. 03 août 2008, 18:05

Finalement je pense m'en être sorti avec le code suivant :

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
Ce n'est sans doute pas le plus propre mais ça fera l'affaire.
Merci à tous pour le coup de main.

Avatar de l’utilisateur
cycyx
yeomen
Messages : 222
Inscription : dim. 02 mars 2008, 19:53

Message par cycyx » mar. 05 août 2008, 19:07

Remarque à deux sous :

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

toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

Message par toma222 » mer. 06 août 2008, 18:59

Merci,

Pour le moment mon script tourne nickel donc je n'y touche pas :wink: .

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.

Avatar de l’utilisateur
Vinvin
yeomen
Messages : 290
Inscription : ven. 14 déc. 2007, 14:37
Localisation : Rennes

Message par Vinvin » mer. 06 août 2008, 20:37

toma222 a écrit :Il faut que je peaufine mes règles iptables
Yé ! :P
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.

toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

Message par toma222 » mer. 06 août 2008, 20:45

J'avais utilisé ce tuto pour mes règles sur mon NSLU2, c'est vrai qu'il est très bien fait. Mais j'ai voulu peaufiner un peu et maintenant j'ai quelques soucis. Je posterais mes règles actuelles pour conseils auprès des experts dès que possible.

toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

Message par toma222 » lun. 11 août 2008, 19:11

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

Avatar de l’utilisateur
chipster
Maître du Kyudo
Messages : 2063
Inscription : ven. 11 août 2006, 22:25
Localisation : Saint-Étienne (42)
Contact :

Message par chipster » mar. 12 août 2008, 09:26

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 :

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
Voilà
Amusez vous bien

toma222
Daikyu
Messages : 97
Inscription : dim. 11 févr. 2007, 13:06

Message par toma222 » mar. 12 août 2008, 21:16

Oui, je suis d'accord, la méthode que j'utilise est loin d'être propre. Mais bon d'un autre côté ce script tourne au boot donc les cycles cpu...
Mais bon, si j'ai un peu de temps j'essayerais d'améliorer ça en me basant sur ton algo.

Répondre