Como configurar o `eth0` para tentar novamente o` dhclient` quando desconectado e reconectado?


12

Estou trabalhando em um gadget linux.

Quero que ele obtenha DHCP se eu conectar o cabo de rede depois que ele já foi inicializado ou se o cabo de rede tiver sido desconectado e reconectado.

Uma solução é executar um script como este (que funciona, btw):

#!/bin/bash

NET_STATUS='different'

while true
do
  NEW_NET_STATUS=`ifconfig | grep RUNNING | grep -v LOOPBACK`
  if [ "${NEW_NET_STATUS}" = "${NET_STATUS}" ]
  then
    echo "no change"
    sleep 1
    continue
  fi
  NET_STATUS=${NEW_NET_STATUS}
  if [ "${NET_STATUS}" ]
  then
    echo "cable plugged in"
  else
    echo "cable unplugged"
  fi
  sleep 1
done

No entanto, no fundo do meu dedinho, sinto que existe uma maneira melhor de lidar com eventos de hotplug para o cabo Ethernet.


1
Infelizmente a partir de 2016 ambos ifplugde netplugdparecem não mantido. No entanto, essa pergunta semelhante parece ter uma resposta boa (simples) usando regras do udev - nenhum pacote adicional é necessário. serverfault.com/a/312296/275255
Thom Nichols

Mude autopara allow-hotplugin interfaces.
Ken afiada

Respostas:


9

netplug

netplugé a solução que eu usei. ifplugdpode funcionar tão bem.

Instalação

sudo apt-get install netplug

Configuração da interface

cat /etc/netplug/netplugd.conf
eth*

Configuração de Eventos

cat /etc/netplug/netplug
#!/bin/sh
PATH=/usr/bin:/bin:/usr/sbin:/sbin
export PATH

dev="$1"
action="$2"

case "$action" in
in)
    echo "$dev : $action : plugged in" >> /tmp/netplug.log
    ;;
out)
    echo "$dev : $action : unplugged" >> /tmp/netplug.log
    ;;
probe)
    echo "$dev : $action : probed" >> /tmp/netplug.log
    ;;
*)
    echo "$dev : $action : I feel violated" >> /tmp/netplug.log
    exit 1
    ;;
esac

Teste

/etc/init.d/netplug stop
/etc/init.d/netplug start

cat /tmp/netplug.log
eth0 : probe : probed
eth1 : probe : probed
...
eth15 : probe : probed
eth0 : in : plugged in

5

O ifplugd lida com essa situação muito bem:

ifplugdé um daemon Linux que configura automaticamente o seu dispositivo Ethernet quando um cabo é conectado e o desconfigura automaticamente se o cabo for puxado. Isso é útil em laptops com adaptadores de rede integrados, pois só configurará a interface quando um cabo estiver realmente conectado.

ifplugd faz interface com os utilitários de configuração de rede nativa da sua distribuição.

Algumas funcionalidades:

  • Usa os programas ifup/ nativos da sua distribuição ifdown.
  • [...]
  • Suporta os sistemas Linux SIOCETHTOOL(mais recente, também conhecido como ethtoolAPI), SIOCGMIIREG(mais antigo, conhecido mii-diag/ mii-toolAPI) e SIOCDEVPRIVATE(mais antigo, conhecido como mii-toolAPI) ioctl()para obter o status do link. A versão 0.24 apresenta suporte para detecção de link com o IFF_RUNNINGsinalizador de interface.
  • [...]
  • Pode ser configurado para ignorar períodos curtos "desconectados" ( -dopção) ou períodos curtos "plugados" ( -uopção)
  • [...]
  • Modo de compatibilidade para dispositivos de rede que não suportam detecção de cabo ( -Fopção)

Meu LUG local me indicou netplug, então eu fui com isso. Obrigado!
CoolAJ86

Isso fez o truque para mim com uma ressalva. Com netplugdhabilitado, eu descobri que eu tinha para remover auto <interface>a partir /etc/network/interfaces. Caso contrário, tive que conectar o cabo Ethernet, removê-lo e conectá-lo novamente antes de obter um endereço IP do DHCP. Com essa linha removida, obtenho um endereço IP do DHCP no primeiro evento de plug-in ou na inicialização, se o cabo já estiver conectado (o IP na inicialização funcionou com ou sem a linha removida quando ifplugdestava ativado).
MrMas 17/05/19

5

Eu sugeriria o uso de ifplugd sobre netplugd , pois funciona melhor e é mantido ativamente.

O ifplugd é um daemon Linux que configura automaticamente o seu dispositivo Ethernet quando um cabo é conectado e o desconfigura automaticamente se o cabo for puxado. Isso é útil em laptops com adaptadores de rede integrados, pois só configurará a interface quando um cabo estiver realmente conectado.


2

Usando este software meu para configuração de rede, é muito fácil.

http://code.google.com/p/badvpn/wiki/NCD

O seguinte programa NCD será executado. Também mostra como você pode estender a configuração, nesse caso executando algo quando a rede sobe / desce.

process eth0 {
    # Set device.
    var("eth0") dev;

    # Wait for device to appear, set it up, and wait for cable to be plugged in.
    net.backend.waitdevice(dev);
    net.up(dev);
    net.backend.waitlink(dev);

    # DHCP configuration.
    # net.ipv4.dhcp() will block here until it obtaines an IP address.
    # It doesn't check the obtained address in any way,
    # so as a basic security measure, do not proceed if it is local.
    net.ipv4.dhcp(dev) dhcp;
    ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
    ifnot(test_local);

    # Assign IP address to interface, as obtained by DHCP.
    net.ipv4.addr(dev, dhcp.addr, dhcp.prefix);

    # Add default route.
    net.ipv4.route("0.0.0.0", "0", dhcp.gateway, "20", dev);

    # Add DNS servers.
    net.dns(dhcp.dns_servers, "20");

    # Run an external program when network comes up or goes down.
    list("/some/program/to/run/when/up", "argument") do;
    list("/some/program/to/run/when/down", "argument") undo;
    run(do, undo);
}

Observe que isso não apenas manipula o cabo de rede conectado ou desconectado, mas também a própria interface de rede que aparece e desaparece (útil se for USB).

A vantagem de usar o NCD em comparação com outros softwares como o ifplugd é que seu design permite uma grande flexibilidade. Basicamente, você pode programar sua própria configuração de rede, em vez de se limitar a um conjunto limitado de recursos codificados.

ATUALIZAÇÃO: Criei pacotes do Ubuntu para BadVPN e NCD. Também atualizei o wiki com instruções de instalação e uso do Ubuntu: http://code.google.com/p/badvpn/wiki/NCD#Running_it


Isso realmente parece útil, você acha que conseguirá encontrá-lo nos repositórios Ubuntu / Fedora?
CoolAJ86

Atualmente, tenho pacotes para Arch e Gentoo, e nada mais porque não uso outras distribuições. Talvez eu encontre tempo para fazer pacotes para outras distros. No entanto, é fácil compilar e instalá-lo em / usr / local ou algo assim e criar um script init simples para iniciá-lo.
Ambroz Bizjak

Ubuntu os pacotes feito, por seu pedido :)
Ambroz Bizjak
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.