Comment puis-je démarrer le serveur DHCP3 plus tard, afin qu'il attend qu'une interface de pont s'initialise avant de se charger?

8

J'ai un serveur Ubuntu 10.04 actuellement configuré avec dhcp3-server ainsi qu'une interface pontée (br0) pour une utilisation avec des machines virtuelles. Le problème que j'ai, c'est que lorsque le serveur redémarre, dhcp3-server ne parvient pas à se charger en raison du délai supplémentaire provoqué par l'affichage de l'interface pontée.

Essentiellement, br0 n'a pas d'adresse IP à utiliser avec DHCP3-Server jusqu'à la fin du cycle de démarrage, bien après que le serveur DHCP3 ait tenté de se charger.

Une fois que le serveur a démarré, je peux exécuter '/etc/init.d/dhcp3-server start' sans aucun problème.

Existe-t-il un moyen de: - Forcer dhcp3-server à attendre que l'interface soit chargée avant de tenter de charger? - Démarrer dhcp3-server après que tout le reste a été chargé?

user2009
la source

Réponses:

9

Une solution consiste à dire au serveur DHCP de ne pas démarrer automatiquement, puis d'ajouter les deux lignes suivantes à votre /etc/network/interfacesfichier pour la définition de votre pont

post-up /etc/init.d/dhcp3-server start
pre-down /etc/init.d/dhcp3-server stop

Donc ça finira par ressembler à ça

iface br0 inet static
    bridge_ports eth0 eth1
    address 192.168.1.2
    broadcast 192.168.1.255
    netmask 255.255.255.0
    gateway 192.168.1.1
    post-up /etc/init.d/dhcp3-server start
    pre-down /etc/init.d/dhcp3-server stop

De cette façon, la gestion du réseau (ifup / ifdown, NOT network-manager) démarrera le serveur DHCP après avoir mis en place le pont, et l'arrêtera avant de retirer le pont.

LassePoulsen
la source
J'ai testé les deux réponses et cette solution post-up / pre-down est beaucoup plus propre et facile à mettre à niveau. Merci des tas de bonnes suggestions! J'ai cherché haut et bas une solution simple comme celle-ci
user2009
Mon plaisir;) c'est toujours super d'être apprécié.
LassePoulsen
2

Vous pouvez modifier le /etc/init.d/dhcp3-serverscript de démarrage pour attendre qu'une adresse IP soit disponible sur br0. Par exemple: (Attention: code non testé!)

# wait 5 secs between br0-ready tests
wait_time_between_probes=5
# maximum number of attempts (i.e., timeout)
max_attempts=10

log_progress_msg "Waiting for br0 to get an IP address"
for n in $(seq 1 $max_attempts); do
  if /sbin/ifconfig br0 | egrep -q "inet addr:" ; then
    # IP address ready on br0, exit loop
    break
  else
    sleep $wait_time_between_probes
  fi
done
if [ "$n" = "$max_attempts" ]; then
    log_warning_msg "Maximum number of attempts reached, but br0 has no IP address yet" 
    log_warning_msg "Continuing anyway but DHCP3 server might not start correctly"
fi 

L'extrait doit entrer dans le script de démarrage, dans la case ... start)partie, avant le démarrage du démon DHCP3. Bien sûr, vous devez régler le temps d'attente et le nombre de tentatives pour correspondre à votre environnement (combien de temps faut-il au maximum à br0 pour obtenir l'adresse IP?)

Riccardo Murri
la source
C'est définitivement sur la bonne voie. J'ai placé cela immédiatement après "case" $ 1 "au début)" dans "/etc/init.d/dhcp3-server" mais la condition "/ sbin / ifconfig br0 | fgrep -q" addr: "" semble réussir même sans l'interface de pont en ligne. Taper "/ sbin / ifconfig br0 | fgrep -q" addr: "" dans le terminal ne donne aucune sortie.
user2009
De plus, bien que triviaux, les deux «log_warning_msg» à la fin du script s'afficheront indépendamment du succès et de l'échec. seraient-ils mieux à l'intérieur du journal avec une instruction de style if (max_attempts = n) pour afficher correctement ces messages en cas d'échec?
user2009
L'interface de pont normale prend également 5 à 10 secondes supplémentaires après le chargement des interfaces pour s'établir, juste assez longtemps pour que le serveur dhcp3 échoue.
user2009
@ user2009 Concernant la grep -qligne: 1. Je pense que la correspondance échoue car le pont acquiert une adresse IPv6 dès qu'il est activé. Si vous êtes uniquement intéressé par l'adresse IPv4, remplacez simplement la grepligne par grep -q 'inet addr:'(déjà fait ci-dessus); sinon, une expression régulière plus complexe doit être trouvée, qui correspond à toutes les adresses IP finales possibles de votre pont. 2. L' -qoption supprime la sortie (tout comme > /dev/null)
Riccardo Murri
@ user2009 merci pour le commentaire log_warning_msg; Je pense que je l'ai corrigé selon votre suggestion
Riccardo Murri