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


11

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

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

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

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

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


1
К сожалению, по состоянию на 2016 год оба ifplugdи netplugdкажутся необслуживаемыми. Однако этот похожий вопрос выглядит так, как будто он имеет хороший (простой) ответ с использованием правил udev - никакого дополнительного пакета не требуется. serverfault.com/a/312296/275255
Том Николс

Изменить autoна allow-hotplugв interfaces.
Кен Шарп

Ответы:


8

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

5

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

Это помогло мне с одной оговоркой. С netplugdвключенным я обнаружил, что должен был удалить auto <interface>из /etc/network/interfaces. Если нет, мне пришлось подключить кабель Ethernet, вынуть его и подключить снова, прежде чем я получил IP-адрес от DHCP. После удаления этой строки я получаю IP-адрес от DHCP при первом событии модуля или при загрузке, если кабель уже подключен (IP при загрузке работал с или без линии, удаленной, когда ifplugdбыла включена).
МрМас

5

Я предложил бы использовать ifplugd над Netplugd , как она работает лучше , и активно поддерживается.

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


2

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

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

В настоящее время у меня есть пакеты для Arch и Gentoo, и ничего больше, потому что я не использую другие дистрибутивы. Я могу найти время, чтобы сделать пакеты для других дистрибутивов. Однако легко просто скомпилировать и установить его в / usr / local или что-то в этом роде и создать простой сценарий инициализации для его запуска.
Амброз Бизжак

Пакеты Ubuntu сделаны, согласно вашему запросу :)
Ambroz Bizjak
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.