在拔出并重新插入后,如何配置eth0以重试dhclient?


12

我正在研究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

但是,我的小脚趾有一种内在的感觉,告诉我,有一种更好的方法可以处理以太网电缆的热插拔事件。


1
不幸的是,截至2016年,两者ifplugd并没有得到netplugd维持。但是,使用udev规则,这个类似的问题看起来像是一个很好的(简单)答案-不需要其他软件包。serverfault.com/a/312296/275255
Thom Nichols

更改autoallow-hotpluginterfaces
肯·夏普

Answers:


9

网络插件

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守护程序,它将在插入电缆时自动配置您的以太网设备,并在拔出电缆时自动取消配置。这对带有板载网络适配器的笔记本电脑很有用,因为它只会在真正连接电缆时配置接口。

ifplugd 与发行版的本机网络配置实用程序接口。

一些功能:

  • 使用您的发行版的本机ifup/ ifdown程序。
  • [...]
  • 支持Linux SIOCETHTOOL(较新的aka ethtoolAPI),SIOCGMIIREG(较旧的aka mii-diag/ mii-toolAPI)和SIOCDEVPRIVATE(最旧的aka mii-toolAPI)ioctl()以获取链接状态。0.24版引入了对带有IFF_RUNNING接口标志的链接检测的支持。
  • [...]
  • 可以配置为忽略短的“拔出”时间段(-d选件)或短的“拔出”时间段(-u选件)
  • [...]
  • 不支持电缆检测的网络设备的兼容模式(-F可选)

我当地的LUG引导我前往netplug,所以我改用了。谢谢!
CoolAJ86'9

告诫我,这为我带来了窍门。与netplugd启用,我发现,我不得不删除auto <interface>/etc/network/interfaces。如果没有,我必须插入以太网电缆,将其拔下,然后再次插入,然后再从DHCP获得IP地址。删除此行后,如果已插入电缆,则在第一个插件事件或启动时会从DHCP获取IP地址(启动时IP启用或ifplugd禁用时都可删除该行)。
MrMas

5

我建议使用ifplugd over netplugd,因为它可以更好地工作并得到积极维护。

ifplugd是一个Linux守护程序,它将在插入电缆时自动配置您的以太网设备,并在拔出电缆时自动取消配置。这对带有板载网络适配器的笔记本电脑很有用,因为它只会在真正连接电缆时配置接口。


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,则很有用)。

与诸如ifplugd之类的其他软件相比,使用NCD的优势在于其设计具有更大的灵活性。基本上,您可以编程自己的网络配置,而不必局限于一组有限的硬编码功能。

更新:我已经为BadVPN和NCD制作了Ubuntu软件包。我也用Ubuntu的安装和使用说明更新了Wiki:http : //code.google.com/p/badvpn/wiki/NCD#Running_it


这看起来确实有用,您认为可以将其放入Ubuntu / Fedora存储库中吗?
CoolAJ86'9

目前,我有用于Arch和Gentoo的软件包,没有别的,因为我不使用其他发行版。我可能会花一些时间来制作其他发行版的软件包。但是,很容易将其编译并安装到/ usr / local或其他内容中,并制作一个简单的初始化脚本来启动它。
Ambroz Bizjak 2011年

根据您的要求完成Ubuntu软件包:)
Ambroz Bizjak 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.