Page 1 sur 1

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

Publié : sam. 02 août 2008, 12:05
par toma222
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.

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

Publié : sam. 02 août 2008, 14:58
par Vinvin
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.

Publié : sam. 02 août 2008, 17:12
par toma222
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 ?

Publié : sam. 02 août 2008, 18:09
par maxi_jac
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.

Publié : sam. 02 août 2008, 20:43
par toma222
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.

Publié : sam. 02 août 2008, 23:46
par Vinvin
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 ?

Publié : dim. 03 août 2008, 02:35
par Vinvin
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.

Publié : dim. 03 août 2008, 11:34
par toma222
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.

Publié : dim. 03 août 2008, 15:03
par toma222
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.

Publié : dim. 03 août 2008, 15:53
par maxi_jac
Salut,

Code : Tout sélectionner

echo -n '.'
++ B.

Publié : dim. 03 août 2008, 16:15
par Vinvin
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:

Publié : dim. 03 août 2008, 17:06
par toma222
@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.

Publié : dim. 03 août 2008, 18:05
par toma222
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.

Publié : mar. 05 août 2008, 19:07
par cycyx
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...).

Publié : mer. 06 août 2008, 18:59
par toma222
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.

Publié : mer. 06 août 2008, 20:37
par Vinvin
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.

Publié : mer. 06 août 2008, 20:45
par toma222
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.

Publié : lun. 11 août 2008, 19:11
par toma222
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

Publié : mar. 12 août 2008, 09:26
par chipster
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

Publié : mar. 12 août 2008, 21:16
par toma222
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.