Como posso iniciar o servidor DHCP3 posteriormente, para que ele aguarde a inicialização de uma interface de ponte antes de carregar?

8

Atualmente, tenho o servidor Ubuntu 10.04 configurado com dhcp3-server e uma interface em ponte (br0) para uso em máquinas virtuais. O problema que tenho é que, quando o servidor é reiniciado, o dhcp3-server falha ao carregar devido ao atraso extra causado pela abertura da interface em ponte.

Essencialmente, o br0 não tem um endereço IP para uso com o servidor DHCP3 até o final do ciclo de inicialização, bem depois que o servidor DHCP3 tenta carregar.

Depois que o servidor inicializar, eu posso executar '/etc/init.d/dhcp3-server start' sem nenhum problema.

Existe alguma maneira de: - Forçar o dhcp3-server a esperar até que a interface seja carregada antes de tentar carregar? - Inicie o dhcp3-server depois que todo o resto for carregado?

user2009
fonte

Respostas:

9

Uma solução é dizer ao dhcp-server para não iniciar automaticamente e, em seguida, adicione as duas linhas a seguir no seu /etc/network/interfacesarquivo para definição da ponte

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

Então vai acabar ficando assim

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

Dessa forma, o gerenciamento de rede (ifup / ifdown, NOT network-manager) iniciará o servidor DHCP após abrir a ponte e o desligará antes de remover a ponte.

LassePoulsen
fonte
Testei as duas respostas e esta solução de pós-instalação / pré-instalação é muito mais limpa e fácil de atualizar. Muito obrigado pelas ótimas sugestões! Eu procurei alta e baixa para uma solução simples como este
user2009
O prazer é meu;) é sempre bom ser apreciado.
LassePoulsen
2

Você pode modificar o /etc/init.d/dhcp3-serverscript de inicialização para aguardar a disponibilidade de um endereço IP br0. Por exemplo: (Aviso: código não testado!)

# 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 

O snippet deve ir para o script de inicialização, dentro da case ... start)parte, antes da inicialização do daemon DHCP3. Obviamente, você deve ajustar o tempo de espera e o número de tentativas para corresponder ao seu ambiente (quanto tempo leva para o br0 obter o endereço IP?)

Riccardo Murri
fonte
Este é definitivamente o caminho certo. Coloquei isso imediatamente após "case" $ 1 "no início)" em "/etc/init.d/dhcp3-server", mas a condição "/ sbin / ifconfig br0 | fgrep -q" addr: "" parece ter sucesso mesmo sem a interface da ponte online. Digitar "/ sbin / ifconfig br0 | fgrep -q" addr: "" no terminal não dá saída.
user2009
Ainda que triviais, os dois 'log_warning_msg' no final do script serão exibidos independentemente do sucesso e falha. eles seriam melhores dentro do log com uma instrução if (max_attempts = n) para mostrar corretamente essas mensagens em caso de falha?
user2009
Além disso, a interface de ponte normal leva de 5 a 10 segundos adicionais após o carregamento da interface, apenas o tempo suficiente para o dhcp3-server falhar.
usar o seguinte comando
@ user2009 Em relação à grep -qlinha: 1. Acho que a correspondência falha porque a ponte adquire um endereço IPv6 assim que termina. Se você estiver interessado apenas no endereço IPv4, substitua a greplinha por grep -q 'inet addr:'(já feita acima); caso contrário, uma expressão regular mais complexa precisará ser encontrada, que corresponda a todos os possíveis endereços IP finais da sua ponte. 2. A -qsaída suprime opção (como > /dev/null)
Riccardo Murri
@ user2009 obrigado pelo comentário log_warning_msg; Acho que fixa-lo de acordo com sua sugestão
Riccardo Murri