¿Cómo puedo iniciar el servidor DHCP3 más tarde, para que espere a que se inicie una interfaz de puente antes de cargar?

8

Tengo el servidor Ubuntu 10.04 actualmente configurado con el servidor dhcp3, así como una interfaz puenteada (br0) para usar con máquinas virtuales. El problema que tengo es que cuando el servidor se reinicia, el servidor dhcp3 no se carga debido a la demora adicional causada por abrir la interfaz en puente.

Esencialmente, br0 no tiene una dirección IP para usar con el servidor DHCP3 hasta el final del ciclo de arranque, mucho después de que el servidor DHCP3 haya intentado cargarse.

Una vez que el servidor se ha iniciado, puedo ejecutar '/etc/init.d/dhcp3-server start' sin ningún problema.

¿Hay alguna manera de que yo pueda: - Forzar dhcp3-server a esperar hasta que la interfaz se haya cargado antes de intentar cargar? - ¿Iniciar dhcp3-server después de que todo lo demás se haya cargado?

usuario2009
fuente

Respuestas:

9

Una solución es decirle al servidor dhcp que no se inicie automáticamente y luego agregar las dos líneas siguientes a su /etc/network/interfacesarchivo para su definición de puente

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

Así terminará luciendo así

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 esta forma, la administración de red (ifup / ifdown, NOT network-manager) iniciará el servidor DHCP después de abrir el puente y lo cerrará antes de quitar el puente.

LassePoulsen
fuente
He probado ambas respuestas y esta solución post-up / pre-down es mucho más limpia y fácil de actualizar. ¡Muchas gracias por las excelentes sugerencias! Busqué por todas
partes
Un placer;) siempre es genial ser apreciado.
LassePoulsen
2

Puede modificar el /etc/init.d/dhcp3-serverscript de inicio para esperar a que esté disponible una dirección IP br0. Por ejemplo: (Advertencia: ¡código no probado!)

# 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 

El fragmento debe ir al script de inicio, dentro de la case ... start)parte, antes del inicio del daemon DHCP3. Por supuesto, debe ajustar el tiempo de espera y el número de intentos para que coincida con su entorno (¿cuánto tiempo tarda br0 en obtener la dirección IP?)

Riccardo Murri
fuente
Esto definitivamente está en el camino correcto. Coloqué esto inmediatamente después de "case" $ 1 "en el inicio)" en "/etc/init.d/dhcp3-server" sin embargo, la condición "/ sbin / ifconfig br0 | fgrep -q" addr: "" parece tener éxito incluso sin La interfaz del puente en línea. Escribir "/ sbin / ifconfig br0 | fgrep -q" addr: "" en el terminal no da salida.
user2009
Además, aunque triviales, los dos 'log_warning_msg' al final del script se mostrarán independientemente del éxito y el fracaso. ¿serían mejores dentro del registro con una declaración de estilo if (max_attempts = n) para mostrar correctamente estos mensajes en caso de falla?
user2009
Además, la interfaz del puente normal tarda entre 5 y 10 segundos adicionales después de que se cargan las interfaces para establecerse, el tiempo suficiente para que falle el servidor dhcp3.
user2009
@ user2009 Acerca de la grep -qlínea: 1. Creo que la coincidencia falla porque el puente adquiere una dirección IPv6 tan pronto como se activa . Si solo le interesa la dirección IPv4, simplemente reemplace la greplínea por grep -q 'inet addr:'(ya se hizo anteriormente); de lo contrario, se debe encontrar una expresión regular más compleja, que coincida con todas las direcciones IP finales posibles de su puente. 2. La -qopción suprime la salida (al igual que > /dev/null)
Riccardo Murri
@ user2009 gracias por el comentario sobre log_warning_msg; Creo que lo arreglé según su sugerencia
Riccardo Murri