“A Interface Crítica do Cliente eth0 / 2 está inativa ou não possui nenhum endereço local vinculado” durante a inicialização de um serviço após a rede ter sido ativada

3

Estou tentando iniciar um trabalho inicial depois de verificar se as interfaces de rede estão funcionando.

Isso é o que eu tenho agora:

start on started network-interface INTERFACE=eth0
stop on runlevel [!2345]

pre-start script
    test -x /usr/sbin/dibbler-client || { stop; exit 0; }
    test -c /dev/null || { stop; exit 0; }

end script

exec /usr/sbin/dibbler-client start 2>&1 > /dev/null

O problema é que o dibbler é obviamente iniciado muito em breve desde que eu estou recebendo Client Critical Interface eth0/2 is down or doesn't have any link-local address. Existe uma maneira simples de resolver isso com eventos ou eu teria que fazer isso no pre-start ? Estou usando apenas o / etc / networking / interfaces e o script de rede para configuração. Então, não há gerente de rede.

    
por vobelic 26.02.2014 / 23:51

3 respostas

0

O principal problema foi que o ipv6 não foi iniciado apesar da interface estar ativa.

Ao navegar, houve uma sugestão para iniciar o módulo ipv6 durante a inicialização, editando o /etc/modules .

Outra solução é supostamente habilitar o inactive-mode na configuração do dibbler /etc/dibbler/client.conf

Eu queria fazer isso apenas no script do upstart, então aqui está o arquivo .conf que testei e parece estar funcionando:

# dibbler-client
#
# The dibbler dhcpv6 client

description     "dibbler-client"

start on (started network-interface
          or started network-manager
          or started networking)
stop on runlevel [!2345]

pre-start script
    test -x /usr/sbin/dibbler-client || { stop; exit 0; }
    test -c /dev/null || { stop; exit 0; }

    TIMEOUT=50 #5 second timeout - eatch iteration sleeps for 1/10th of a second
    LOG_FILE=/tmp/dibbler_upstart.log

    until [ $TIMEOUT -eq 0 ]; do
        if ip addr show dev eth0 | grep -e 'inet6.*link.$'; then
                echo "Detected inet6 link-local, exiting" >> $LOG_FILE
                ip addr show dev eth0 >> $LOG_FILE
                exit 0;
        fi
        TIMEOUT=$((TIMEOUT-1))
        sleep .1
    done

    echo "Timeout waiting for IP address" >> $LOG_FILE
    exit 1;

end script

exec /usr/sbin/dibbler-client start 2>&1 > /dev/null

Se alguém souber como detectar o status do ipv6 com eventos que seriam uma solução mais limpa.

    
por vobelic 28.02.2014 / 16:10
1

Seu trabalho é executado quando a interface é ativada, mas ainda não está configurada. Este trabalho carrega o NetworkManager. E o NetworkManager não emite eventos iniciantes. Esse é o problema.

Acho que o caminho mais limpo seria um script de despachante para o NetworkManager .

Crie um arquivo em /etc/NetworkManager/dispatcher.d/ com o seguinte conteúdo:

#!/bin/bash
# NetworkManager sets those parameters
INTERFACE=$1
ACTION=$2

if [ "$INTERFACE" == "eth0" ] && [ "$ACTION" == "up" ]; then
  # some tests before starting...
  /usr/sbin/dibbler-client start 2>&1 > /dev/null
elif [ "$INTERFACE" == "eth0" ] && [ "$ACTION" == "down" ]; then
  # maybe stop the client...
fi
    
por chaos 27.02.2014 / 02:58
0

Talvez você precise do seguinte começo:

start on net-device-up IFACE=eth0 ADDRFAM=inet6

alternativamente, você pode usar a rede estática para esperar que todas as interfaces estejam ativas.

    
por CameronNemo 02.06.2014 / 19:05

Tags