如何为 ETH "link down"/"link up" 设置 udev 规则?

How to set up a udev rule for ETH "link down"/"link up"?

我喜欢在连接 eth0 时打开绿色 LED(通过 GPIO 连接)。断开连接时,我喜欢打开绿色 LED 和红色 LED。

认为 udev 可能是适合它的地方。我创建了简单的演示规则:

KERNEL=="eth0", SUBSYSTEM=="net", ACTION=="add", RUN+="/sbin/set_BSPleds eth0 on"

此规则应在添加 eth0 时调用脚本。它从未被执行过。 在我通过在 shell 处输入 "udevadm monitor -k -u" 查看 udev 监视器之后。当我 unplug/plug 局域网电缆时没有事件发生。

root@sama5d3xek:/etc/udev/rules.d# udevadm monitor -k -uh0
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

root@sama5d3xek:/etc/udev/rules.d#

似乎没有 eth0 的 uevents。以太网驱动程序由我的 ATMEL 提供。我正在 Yocto 的帮助下构建自定义 Linux。

我的问题是,如何将 "link down"/"link up" 事件发送到 udev? 如果它不适用于 udev,最好的替代方法是什么?

以太网设备是设备,但连接不是。

您可以通过 /dev/xconsoledmesg/var/log/kern.log.

trace 连接

示例,使用 rsyslog:

您可以(作为 root):

echo ':msg, contains, "Link is" |/run/netlink' >/etc/rsyslog.d/netlinkstate.conf
mkfifo /run/netlink
chgrp user /run/netlink
chmod 640 /run/netlink
service rsyslog force-reload

然后,登录为 用户,只需:

read line < /run/netlink

将等待来自 fifo 的输入,然后保持直到发生某些事情。

state=${line#*Link is } eventtime=${line%% $HOSTNAME*}
echo $eventtime $state
2016-11-21T17:40:50.956181+01:00 Down

echo $eventtime $state
2016-11-21T17:40:50.956181+01:00 Up 100 Mbps Full Duplex, Flow Control: Rx/Tx

echo $eventtime ${state%% *}
2016-11-21T17:40:50.956181+01:00 Up

下,您可以使用超时清空 fifo 并只读取最后一个条目:

while read -t .01 entry </run/netlink;do line="$entry";done
state=${line#*Link is }
eventtime=${line%% $HOSTNAME*}
shortstate=${state%% *}

注意: 我用 /run 来存储 fifo。这可能不是更好的地方,因为下次重新启动时它不会存在。

正如其他人已经提到的,似乎不能为此使用 udev。

Ubuntu: wait for network link up and execute a bash command 建议

inotifywait -e modify /sys/class/net/eth0/carrier; echo 'Change detected'

(目前,/ 在我的盒子的 nfs 上,所以我真的不能说它是否有效。)

在其他帖子中,有一些关于在 /sys 上使用 inotify API 的问题:inotify_add_watch fails on /sys/class/net/eth0/operstate .

我认为 Right Way(TM) 这样做是使用 netlink(7) API,最好通过 netplugd 等守护进程。

希望对您有所帮助:)