Jak skonfigurować `eth0`, aby ponowił próbę` dhclient` po odłączeniu i ponownym podłączeniu?

12

Pracuję nad gadżetem dla systemu Linux.

Chcę, aby uzyskał DHCP, jeśli podłączę kabel sieciowy po jego uruchomieniu lub jeśli kabel sieciowy zostanie odłączony i ponownie podłączony.

Jednym z rozwiązań jest uruchomienie takiego skryptu (który działa, 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

Mam jednak wrażenie głęboko w moim małym palcu, który mówi mi, że istnieje lepszy sposób radzenia sobie ze zdarzeniami typu hotplug dla kabla Ethernet.

CoolAJ86
źródło
1
Niestety od 2016 zarówno ifplugdi netplugdwydają unmaintained. Jednak to podobne pytanie wygląda na to, że ma dobrą (prostą) odpowiedź przy użyciu reguł udev - nie jest potrzebny żaden dodatkowy pakiet. serverfault.com/a/312296/275255
Thom Nichols
Zmieni autosię allow-hotplugw interfaces.
Ken Sharp

Odpowiedzi:

9

wtyczka sieciowa

netplugjest rozwiązaniem, z którym poszedłem. ifplugdmoże równie dobrze działać.

Instalacja

sudo apt-get install netplug

Konfiguracja interfejsu

cat /etc/netplug/netplugd.conf
eth*

Konfiguracja zdarzenia

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

Testowanie

/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
CoolAJ86
źródło
5

ifplugd bardzo dobrze radzi sobie z tą sytuacją:

ifplugdjest demonem systemu Linux, który automatycznie skonfiguruje urządzenie Ethernet po podłączeniu kabla i automatycznie zdekonfiguruje je, gdy kabel zostanie wyciągnięty. Jest to przydatne na laptopach z wbudowanymi kartami sieciowymi, ponieważ konfiguruje interfejs tylko wtedy, gdy kabel jest naprawdę podłączony.

ifplugd interfejsy z natywnymi narzędziami do konfiguracji sieci twojej dystrybucji.

Niektóre funkcje:

  • Używa natywnych ifup/ ifdownprogramów twojej dystrybucji .
  • [...]
  • Obsługuje Linux SIOCETHTOOL(nowszy, aka ethtoolAPI), SIOCGMIIREG(starszy, aka mii-diag/ mii-toolAPI) i SIOCDEVPRIVATE(najstarszy, aka mii-toolAPI) w ioctl()celu uzyskania statusu łącza. Wersja 0.24 wprowadza obsługę wykrywania linków z IFF_RUNNINGflagą interfejsu.
  • [...]
  • Może być skonfigurowany tak, aby ignorował krótkie okresy „odłączone” ( -dopcja) lub krótkie okresy „odłączone” ( -uopcja)
  • [...]
  • Tryb zgodności dla urządzeń sieciowych, które nie obsługują wykrywania kabli ( -Fopcja)
byronc
źródło
Mój lokalny LUG skierował mnie do netplug, więc zamiast tego poszedłem. Dzięki!
CoolAJ86,
To załatwiło sprawę z jednym zastrzeżeniem. Przy netplugdwłączeniu, stwierdziliśmy, że musiałem usunąć auto <interface>z /etc/network/interfaces. Jeśli nie, musiałem podłączyć kabel Ethernet, usunąć go i podłączyć ponownie, zanim otrzymam adres IP z DHCP. Po usunięciu tej linii otrzymuję adres IP z DHCP przy pierwszym zdarzeniu wtyczki lub przy rozruchu, jeśli kabel był już podłączony (IP przy rozruchu działał z linią usuniętą lub bez, gdy ifplugdbyła włączona).
MrMas
5

Proponuję za pomocą ifplugd nad netplugd jak to działa lepiej i jest aktywnie utrzymane.

ifplugd to demon systemu Linux, który automatycznie skonfiguruje urządzenie ethernetowe po podłączeniu kabla i automatycznie zdekonfiguruje je po wyciągnięciu kabla. Jest to przydatne na laptopach z wbudowanymi kartami sieciowymi, ponieważ konfiguruje interfejs tylko wtedy, gdy kabel jest naprawdę podłączony.

NGRhodes
źródło
2

Korzystanie z mojego oprogramowania do konfiguracji sieci jest bardzo łatwe.

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

Zrobi to następujący program NCD. Pokazuje także, w jaki sposób można rozszerzyć konfigurację, w tym przypadku uruchamiając coś, gdy sieć idzie w górę / w dół.

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

Zauważ, że to nie tylko poradzi sobie z podłączaniem i odłączaniem kabla sieciowego, ale także z pojawianiem się i znikaniem samego interfejsu sieciowego (przydatne, jeśli jest to USB).

Zaletą korzystania z NCD w porównaniu do innych programów, takich jak ifplugd, jest to, że jego konstrukcja zapewnia dużą elastyczność. Zasadniczo pozwala zaprogramować własną konfigurację sieci, a nie ograniczać się do ograniczonego zestawu zakodowanych możliwości.

AKTUALIZACJA: Stworzyłem pakiety Ubuntu dla BadVPN i NCD. Zaktualizowałem wiki również instrukcjami instalacji i użytkowania Ubuntu: http://code.google.com/p/badvpn/wiki/NCD#Running_it

Ambroz Bizjak
źródło
To naprawdę wydaje się przydatne, czy myślisz, że dostaniesz go do repozytoriów Ubuntu / Fedora?
CoolAJ86,
Obecnie mam pakiety dla Arch i Gentoo i nic więcej, ponieważ nie używam innych dystrybucji. Mogę znaleźć trochę czasu na przygotowanie pakietów dla innych dystrybucji. Jednak łatwo jest po prostu skompilować i zainstalować go w / usr / local lub czymś innym i przygotować prosty skrypt startowy, aby go uruchomić.
Ambroz Bizjak
Pakiety Ubuntu zrobione, na twoją prośbę :)
Ambroz Bizjak