Как настроить `eth0` для повторной попытки` dhclient` при отключении и повторном подключении?

20007
CoolAJ86

Я работаю над гаджетом Linux.

Я хочу, чтобы он получал DHCP, если я подключу сетевой кабель после того, как он уже загрузился, или если сетевой кабель отключен и подключен повторно.

Одним из решений является запуск такого скрипта (который работает, кстати):

#!/bin/bash  NET_STATUS='different'  while true do NEW_NET_STATUS=`ifconfig | grep RUNNING | grep -v LOOPBACK` if [ "$" = "$" ] then echo "no change" sleep 1 continue fi NET_STATUS=$ if [ "$" ] then echo "cable plugged in" else echo "cable unplugged" fi sleep 1 done 

Однако в глубине моего маленького пальца чувствуется чувство, что мне подсказывает, что есть лучший способ справиться с событиями горячего подключения для кабеля Ethernet.

10
К сожалению, по состоянию на 2016 год оба `ifplugd` и` netplugd` не поддерживаются. Однако этот похожий вопрос выглядит так, как будто он имеет хороший (простой) ответ с использованием правил udev - никакого дополнительного пакета не требуется. http://serverfault.com/a/312296/275255 Thom Nichols 8 лет назад 1
Измените `auto` на` allow-hotplug` в `interfaces`. Ken Sharp 5 лет назад 0

4 ответа на вопрос

8
CoolAJ86

netplug

netplugэто решение, с которым я пошел. ifplugdможет работать так же хорошо.

Монтаж

sudo apt-get install netplug 

Конфигурация интерфейса

cat /etc/netplug/netplugd.conf eth* 

Конфигурация события

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 

тестирование

/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 
4
byronc

ifplugd очень хорошо справляется с этой ситуацией:

ifplugdэто демон Linux, который автоматически настраивает ваше Ethernet-устройство при подключении кабеля и автоматически отключает его при вытягивании кабеля. Это полезно на ноутбуках с встроенными сетевыми адаптерами, поскольку он будет настраивать интерфейс только тогда, когда кабель действительно подключен.

ifplugd интерфейсы с собственными утилитами настройки сети вашего дистрибутива.

Некоторые особенности:

  • Использует родной дистрибутив ifup/ ifdownпрограммы.
  • [...]
  • Поддерживает Linux SIOCETHTOOL(более новый, он же ethtoolAPI), SIOCGMIIREG(более старый, он же mii-diag/ mii-toolAPI) и SIOCDEVPRIVATE(самый старый, он же mii-toolAPI) ioctl()для получения статуса ссылки. В версии 0.24 добавлена ​​поддержка обнаружения ссылок с помощью IFF_RUNNINGфлага интерфейса.
  • [...]
  • Может быть настроен на игнорирование коротких «отключенных» периодов ( -dопция) или коротких «подключенных» периодов ( -uопция)
  • [...]
  • Режим совместимости для сетевых устройств, которые не поддерживают обнаружение кабелей ( -Fопция)
Мой местный LUG направил меня к `netplug`, поэтому я пошел с этим вместо этого. Спасибо! CoolAJ86 12 лет назад 0
4
NGRhodes

I would suggest using ifplugd over netplugd as it works better and is actively maintained.

ifplugd is a Linux daemon which will automatically configure your ethernet device when a cable is plugged in and automatically unconfigure it if the cable is pulled. This is useful on laptops with onboard network adapters, since it will only configure the interface when a cable is really connected.

2
Ambroz Bizjak

Используя это мое программное обеспечение для настройки сети, это очень просто.

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

Следующая программа NCD сделает. Также показано, как вы можете расширить конфигурацию, в этом случае запустив что-то, когда сеть идет вверх / вниз.

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

Обратите внимание, что это будет обрабатывать не только сетевой кабель, подключенный или отключенный, но и сам сетевой интерфейс, появляющийся и исчезающий (полезно, если это USB).

Преимущество использования NCD по сравнению с другими программами, такими как ifplugd, заключается в том, что его дизайн обеспечивает большую гибкость. Это в основном позволяет программировать вашу собственную конфигурацию сети, в отличие от ограниченного набора жестко закодированных возможностей.

ОБНОВЛЕНИЕ: я сделал пакеты Ubuntu для BadVPN и NCD. Я также обновил вики с инструкциями по установке и использованию для Ubuntu: http://code.google.com/p/badvpn/wiki/NCD#Running_it

Это действительно выглядит полезным, как вы думаете, вы попадете в репозитории Ubuntu / Fedora? CoolAJ86 12 лет назад 0
В настоящее время у меня есть пакеты для Arch и Gentoo, и ничего больше, потому что я не использую другие дистрибутивы. Я могу найти время, чтобы сделать пакеты для других дистрибутивов. Однако легко просто скомпилировать и установить его в / usr / local или что-то в этом роде и сделать простой сценарий инициализации для его запуска. Ambroz Bizjak 12 лет назад 0
Пакеты Ubuntu сделаны, согласно вашему запросу :) Ambroz Bizjak 12 лет назад 0

Похожие вопросы