Come posso avviare il server DHCP3 in un secondo momento, in modo che attenda l'inizializzazione di un'interfaccia bridge prima del caricamento?


8

Ho un server Ubuntu 10.04 attualmente configurato con dhcp3-server e un'interfaccia con ponte (br0) per l'uso con macchine virtuali. Il problema che ho è che quando il server si riavvia, il server dhcp3 non riesce a caricarsi a causa del ritardo aggiuntivo causato dall'apertura dell'interfaccia con bridge.

Fondamentalmente br0 non ha un indirizzo IP da utilizzare con DHCP3-Server fino a tardi nel ciclo di avvio, ben dopo che DHCP3-server ha tentato di caricare.

Una volta avviato il server, posso eseguire "/etc/init.d/dhcp3-server start" senza alcun problema.

C'è un modo in cui posso: - Forzare dhcp3-server in attesa che l'interfaccia si sia caricata prima di provare a caricare? - Avvia dhcp3-server dopo aver caricato tutto il resto?

Risposte:


9

Una soluzione è dire al dhcp-server di non avviarsi automaticamente e quindi aggiungere le seguenti due righe al /etc/network/interfacesfile per la definizione del bridge

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

Quindi finirà per apparire così

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

In questo modo la gestione della rete (ifup / ifdown, NON gestore della rete) avvierà il server DHCP dopo aver aperto il bridge e lo spegnerà prima di rimuovere il bridge.


Ho testato entrambe le risposte e questa soluzione post-up / pre-down è molto più pulita e facile da aggiornare. Grazie mille per gli ottimi suggerimenti! Ho cercato in alto e in basso una soluzione semplice come questa
user2009

Il mio piacere;) è sempre bello essere apprezzato.
LassePoulsen,

2

È possibile modificare lo /etc/init.d/dhcp3-serverscript di avvio in modo che un indirizzo IP sia disponibile su br0. Ad esempio: (Attenzione: codice non testato!)

# 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 

Lo snippet dovrebbe andare nello script di avvio, all'interno della case ... start)parte, prima dell'avvio del daemon DHCP3. Ovviamente, dovresti ottimizzare il tempo di attesa e il numero di tentativi di adattamento al tuo ambiente (quanto tempo impiega br0 a ottenere l'indirizzo IP?)


Questo è sicuramente sulla strada giusta. L'ho inserito immediatamente dopo "case" $ 1 "in start)" in "/etc/init.d/dhcp3-server" tuttavia la condizione "/ sbin / ifconfig br0 | fgrep -q" addr: "" sembra avere successo anche senza l'interfaccia bridge online. Digitando "/ sbin / ifconfig br0 | fgrep -q" addr: "" nel terminale non si ottiene alcun output.
user2009

Inoltre, anche se banali, i due "log_warning_msg" alla fine dello script mostreranno indipendentemente dal successo e dal fallimento. sarebbero meglio all'interno del registro con un'istruzione di stile if (max_attempts = n) per mostrare correttamente questi messaggi in caso di errore?
user2009

Inoltre, l'interfaccia bridge normale impiega altri 5-10 secondi dopo che le interfacce si caricano per stabilire, il tempo necessario per il fallimento del server dhcp3.
user2009

@ user2009 Per quanto riguarda la grep -qlinea: 1. Penso che la partita fallisca perché il bridge acquisisce un indirizzo IPv6 non appena è attivo . Se sei interessato solo all'indirizzo IPv4, sostituisci semplicemente la grepriga con grep -q 'inet addr:'(già fatto sopra); in caso contrario, è necessario trovare un'espressione regolare più complessa, che corrisponda a tutti i possibili indirizzi IP finali del bridge. 2. L' -qopzione sopprime l'output (proprio come > /dev/null)
Riccardo Murri

@utente2009 grazie per il commento su log_warning_msg; Penso di averlo risolto secondo il tuo suggerimento
Riccardo Murri,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.