Aguarde a interface ser exibida antes do UDHCP

2

Estou usando uma distribuição Linux incorporada com utilitários do busybox. Durante a inicialização do sistema, estou configurando minha interface via DHCP em scripts de inicialização.

/etc/rcS.d/S40networking                  | --------- > ifup -a

Agora o problema é que o link da minha interface é exibido depois de algum tempo (ou seja, 3 a 4 segundos), mas depois da interface (antes do Link estar ativo), o ifup chama o udhcp para obter o endereço IP do DHCP eventualmente falhou porque a interface não é ativada neste momento.

Logo após o S40networking, eu estou executando um dos meus próprios scripts / aplicativos que utilizam o material da rede, mais uma vez neste momento a interface ainda não foi ativada e eu não tenho um IP, então meu aplicativo também falha.

Minha pergunta é como posso pausar o S40networking para não continuar até que meu Link esteja realmente ativo, ou porque minha interface está demorando para abrir o link real. dormir 5 após o ifup -a no S40networking funciona, mas eu quero evitá-lo. Estou enviando ip :::::: eth0: off na minha linha de comando do kernel.

Pensamentos?

Atenciosamente, Farrukh Arshad.

    
por Farrukh Arshad 15.03.2013 / 13:26

1 resposta

1

Ok. Eu encontrei uma solução para mim mesmo. Não tenho certeza se essa é a solução mais otimizada ou não, mas aqui estão minhas razões.

1) Eu não quero abrir o módulo ethernet na inicialização do kernel, para evitar ip = dhcp ou ip = $ {ipaddr}: $ {serverip}: $ {gatewayip}: $ {netmask}: $ { hostname}: eth0: off, já que não tenho certeza qual será a configuração do usuário final.

2) Eu escrevi meu próprio script de configuração de rede que traz a interface de rede como mostrado abaixo.

link_up_waittime=60
interface=""
tmpfile="/tmp/cspnetwork"
linkups="Link is Up"

function error_out
{
    exit -1
}
function search_ifc_dev()
{
    for iface in 'awk '{print $1}' /proc/net/dev | cut -f1 -d":"'; do
        if [[ ${iface} == eth* ]]; then
            interface=${iface}
        fi
    done
    if [[ ${interface} == "" ]]; then
        echo "Unable to find network interface. Can not continue"
        error_out
    fi
}

function wait_for_link_up()
{
    startsec='date +%s' 
    endsec='expr ${startsec} + ${link_up_waittime}'
    while [[ ${startsec} -lt ${endsec} ]]; do
        found='dmesg | grep "${linkups}"'   
        if [[ ! -z ${found} ]]; then
            break;  
        fi
        # Increment current time
        startsec='date +%s'
    done

    # We will not continue if interface can not be brought up..."
    if [[ -z ${found} ]]; then
        echo "Unable to bring up interface. Can not continue"
        error_out
    fi
}

function dynamic_ip_assign()
{
    ifconfig ${interface} 0.0.0.0
    wait_for_link_up
    udhcpc -D -s /usr/share/udhcpc/default.script
}

Vamos ver esse script. search_ifc_dev irá procurar o nome do dispositivo atribuído à interface ehternet pelo kernel. (Você deve ter apenas uma interface para isso funcionar).

dynamic_ip_assign atribuirá endereço ip dinamicamente. Eu estou usando o ifconfig em vez de ifup -a porque ifup -a chama automaticamente (veja interface homem) utilitários udhcpc ou dhcpclient (se você configurou seu iface como dhcp em / etc / network / interface) sem esperar que a interface seja exibida na realidade. Isso causa o problema quando o servidor DHCP está respondendo (na maioria dos casos) lento, pois o script de rede será encerrado antes que a interface seja ativada e o script de inicialização do aplicativo seja iniciado e a interface ainda não esteja ativa. Você pode ver acima Estou aguardando o link para UP antes de continuar a sair do meu script, então sempre que eu estou lançando meu próprio aplicativo na inicialização, tenho certeza que a interface é realmente criada, caso contrário, eu posso fazer algo de bom em error_out função.

Note que se você estiver usando ip = dhcp na linha de comando do kernel, seu driver ethernet não continuará até que sua interface esteja ativa, então sempre que o script de ativação do aplicativo for invocado você tem certeza de que a interface já está UP, mas como eu mencionei, eu não quero fornecer o parâmetro ip na linha de comando do kernel.

Qualquer pessoa por favor forneça feedback se você tiver uma solução compacta para este problema. Observe também que essa é uma distro incorporada personalizada, por isso estou com falta de utilitários de rede, exceto o busybox. Usar algum outro utilitário (como usado em distros de desktop) pode me dar uma solução compacta.

Atenciosamente, Farrukh Arshad.

    
por 19.03.2013 / 10:14