Wie kann ich den DHCP3-Server später starten, damit er vor dem Laden auf die Initialisierung einer Bridge-Schnittstelle wartet?

8

Ich habe Ubuntu 10.04 Server derzeit mit DHCP3-Server sowie eine Bridged-Schnittstelle (br0) für die Verwendung mit virtuellen Maschinen eingerichtet. Das Problem, das ich habe, ist, dass beim Neustart des Servers der dhcp3-Server aufgrund der zusätzlichen Verzögerung, die durch das Aufrufen der überbrückten Schnittstelle verursacht wird, nicht geladen werden kann.

Im Wesentlichen hat br0 erst spät im Startzyklus eine IP-Adresse für die Verwendung mit DHCP3-Server, lange nachdem DHCP3-Server versucht hat, zu laden.

Sobald der Server gestartet ist, kann ich '/etc/init.d/dhcp3-server start' ohne Probleme ausführen.

Kann ich Folgendes tun: - DHCP3-Server zwingen, zu warten, bis die Schnittstelle geladen wurde, bevor versucht wird, sie zu laden? - Starten Sie den DHCP3-Server, nachdem alles andere geladen wurde?

user2009
quelle

Antworten:

9

Eine Lösung besteht darin, den DHCP-Server anzuweisen, nicht automatisch zu starten, und dann die folgenden zwei Zeilen zu Ihrer /etc/network/interfacesDatei für Ihre Bridge-Definition hinzuzufügen

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

So wird es am Ende so aussehen

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

Auf diese Weise startet die Netzwerkverwaltung (ifup / ifdown, NICHT Netzwerkmanager) den DHCP-Server nach dem Aufrufen der Bridge und fährt ihn herunter, bevor die Bridge entfernt wird.

LassePoulsen
quelle
Ich habe beide Antworten getestet und diese Post-Up / Pre-Down-Lösung ist viel sauberer und Upgrade-freundlicher. Vielen Dank für die tollen Vorschläge! Ich suchte hoch und niedrig nach einer einfachen Lösung wie dieser
user2009
Es ist mir ein Vergnügen;) es ist immer toll, geschätzt zu werden.
LassePoulsen
2

Sie können das /etc/init.d/dhcp3-serverStartskript so ändern , dass darauf gewartet wird, dass eine IP-Adresse verfügbar ist br0. Zum Beispiel: (Warnung: ungetesteter Code!)

# 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 

Das Snippet sollte case ... start)vor dem Start des DHCP3-Daemons innerhalb des Teils in das Startskript aufgenommen werden. Natürlich sollten Sie die Wartezeit und die Anzahl der Versuche so einstellen, dass sie mit Ihrer Umgebung übereinstimmen (wie lange dauert es maximal, bis br0 die IP-Adresse erhält?)

Riccardo Murri
quelle
Dies ist definitiv auf dem richtigen Weg. Ich habe dies unmittelbar nach "case" $ 1 "in start)" in "/etc/init.d/dhcp3-server" platziert, jedoch scheint die Bedingung "/ sbin / ifconfig br0 | fgrep -q" addr: "" auch ohne erfolgreich zu sein die Bridge-Schnittstelle online. Wenn Sie "/ sbin / ifconfig br0 | fgrep -q" addr: "" in das Terminal eingeben, wird keine Ausgabe ausgegeben.
user2009
Auch wenn dies trivial ist, werden die beiden 'log_warning_msg' am Ende des Skripts unabhängig von Erfolg und Misserfolg angezeigt. Wären sie besser im Protokoll mit einer if-Anweisung (max_attempts = n), um diese Meldungen bei einem Fehler korrekt anzuzeigen?
user2009
Außerdem dauert es nach dem Laden der Schnittstellen weitere 5 bis 10 Sekunden, bis die Bridge-Schnittstelle normal eingerichtet ist, gerade lange genug, damit der DHCP3-Server ausfällt.
Benutzer2009
@ user2009 In Bezug auf die grep -qLeitung: 1. Ich denke, die Übereinstimmung schlägt fehl, weil die Bridge eine IPv6-Adresse erhält, sobald sie aktiv ist. Wenn Sie nur an einer IPv4-Adresse interessiert sind, ersetzen Sie einfach die grepZeile durch grep -q 'inet addr:'(bereits oben ausgeführt). Andernfalls muss ein komplexerer regulärer Ausdruck gefunden werden, der allen möglichen endgültigen IP-Adressen Ihrer Bridge entspricht. 2. Die -qOption unterdrückt die Ausgabe (genau wie > /dev/null)
Riccardo Murri
@ user2009 danke für den Kommentar zu log_warning_msg; Ich glaube, ich habe es gemäß Ihrem Vorschlag behoben
Riccardo Murri