Come configurare `eth0` per riprovare` dhclient` quando scollegato e ricollegato?


12

Sto lavorando a un gadget Linux.

Voglio che ottenga DHCP se collego il cavo di rete dopo che è già stato avviato o se il cavo di rete è stato scollegato e ricollegato.

Una soluzione è eseguire uno script come questo (che funziona, tra l'altro):

#!/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

Tuttavia, ho una sensazione nel profondo del mio mignolo che mi dice che c'è un modo migliore per gestire gli eventi hotplug per il cavo Ethernet.


1
Sfortunatamente a partire dal 2016 entrambi ifplugde netplugdsembrano non mantenuti. Comunque questa domanda simile sembra avere una buona (semplice) risposta usando le regole udev - nessun pacchetto aggiuntivo necessario. serverfault.com/a/312296/275255
Thom Nichols,

Passare autoa allow-hotplugin interfaces.
Ken Sharp,

Risposte:


9

netplug

netplugè la soluzione con cui sono andato. ifplugdpotrebbe funzionare altrettanto bene.

Installazione

sudo apt-get install netplug

Configurazione dell'interfaccia

cat /etc/netplug/netplugd.conf
eth*

Configurazione dell'evento

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

analisi

/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

ifplugd gestisce molto bene questa situazione:

ifplugdè un demone Linux che configura automaticamente il tuo dispositivo Ethernet quando viene collegato un cavo e lo configura automaticamente se il cavo viene tirato. Ciò è utile su laptop con adattatori di rete integrati, poiché configurerà l'interfaccia solo quando un cavo è realmente collegato.

ifplugd si interfaccia con le utility di configurazione della rete nativa della tua distribuzione.

Alcune caratteristiche:

  • Utilizza i programmi ifup/ nativi della tua distribuzione ifdown.
  • [...]
  • Supporta Linux SIOCETHTOOL(più recenti, aka ethtoolAPI), SIOCGMIIREG(vecchi, aka mii-diag/ mii-toolAPI) e SIOCDEVPRIVATE(più vecchi, aka mii-toolAPI) ioctl()per ottenere lo stato dei collegamenti. La versione 0.24 introduce il supporto per il rilevamento dei collegamenti con il IFF_RUNNINGflag di interfaccia.
  • [...]
  • Può essere configurato per ignorare brevi periodi "non collegati" ( -dopzione) o brevi periodi "collegati" ( -uopzione)
  • [...]
  • Modalità di compatibilità per dispositivi di rete che non supportano il rilevamento dei cavi ( -Fopzione)

Il mio LUG locale mi ha indirizzato a netplug, quindi sono andato con quello invece. Grazie!
CoolAJ86,

Questo ha fatto il trucco per me con un avvertimento. Con netplugdabilitato, ho scoperto che dovevo rimuovere auto <interface>da /etc/network/interfaces. In caso contrario, ho dovuto collegare il cavo Ethernet, rimuoverlo e ricollegarlo prima di ottenere un indirizzo IP dal DHCP. Con questa linea rimossa, ottengo un indirizzo IP dal DHCP al primo evento plug-in o all'avvio se il cavo era già collegato (l'IP all'avvio funzionava con o senza la linea rimossa quando ifplugdera abilitato).
MrMas

5

Suggerirei di usare ifplugd su netplugd perché funziona meglio e viene mantenuto attivamente.

ifplugd è un demone Linux che configura automaticamente il tuo dispositivo Ethernet quando viene collegato un cavo e lo configura automaticamente se il cavo viene tirato. Ciò è utile su laptop con adattatori di rete integrati, poiché configurerà l'interfaccia solo quando un cavo è realmente collegato.


2

Utilizzando questo mio software per la configurazione di rete, è molto semplice.

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

Lo farà il seguente programma NCD. Mostra anche come estendere la configurazione, in questo caso eseguendo qualcosa quando la rete va su / giù.

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);
}

Si noti che questo non solo gestirà il cavo di rete collegato o disconnesso, ma anche l'interfaccia di rete stessa che appare e scompare (utile se è USB).

Il vantaggio dell'utilizzo di NCD rispetto ad altri software come ifplugd è che il suo design consente una grande flessibilità. Fondamentalmente ti consente di programmare la tua configurazione di rete, invece di essere limitato a un set limitato di capacità hardcoded.

AGGIORNAMENTO: ho creato pacchetti Ubuntu per BadVPN e NCD. Ho aggiornato il wiki con le istruzioni di installazione e utilizzo anche per Ubuntu: http://code.google.com/p/badvpn/wiki/NCD#Running_it


Questo sembra davvero utile, pensi che lo otterrai nei repository Ubuntu / Fedora?
CoolAJ86

Attualmente ho pacchetti per Arch e Gentoo e nient'altro perché non uso altre distro. Potrei trovare del tempo per creare pacchetti per altre distro. Comunque è facile semplicemente compilarlo e installarlo in / usr / local o qualcosa del genere, e fare un semplice script di init per avviarlo.
Ambroz Bizjak,

Pacchetti Ubuntu completati, secondo la tua richiesta :)
Ambroz Bizjak
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.