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

Я работаю над 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 

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

    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 

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

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

    Ifplugd отлично справляется с этой ситуацией:

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

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

    Некоторые функции:

    • Использует собственные дистрибутивы ifup / ifdown .
    • […]
    • Поддерживает Linux SIOCETHTOOL (более новый, aka ethtool API), SIOCGMIIREG (более старый, SIOCGMIIREG mii-diag / mii-tool API) и SIOCDEVPRIVATE (старейший, SIOCDEVPRIVATE mii-tool API) ioctl() s для получения статуса ссылки. В выпуске 0.24 представлена ​​поддержка обнаружения ссылок с IFF_RUNNING интерфейса IFF_RUNNING .
    • […]
    • Может быть сконфигурирован так, чтобы игнорировать короткие «отключенные» периоды ( -d ) или короткие «подключенные» периоды (опция -u )
    • […]
    • Режим совместимости для сетевых устройств, которые не поддерживают обнаружение кабеля (опция -F )

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

    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

    Давайте будем гением компьютера.