如何为ETH设置udev规则"链接" /"链接"?

时间:2016-11-18 12:15:57

标签: linux udev

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

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

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

此规则应在添加eth0时调用脚本。它从未被执行过。 在我通过输入" udevadm monitor -k -u"来查看udev监视器之后在壳。当我拔下/插上lan电缆时,没有任何事件发生。

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没有任何问题。以太网驱动程序是我的ATMEL提供的。我正在Yocto的帮助下构建一个自定义Linux。

我的问题是,如何将"链接关闭" /"链接"事件到udev? 如果它不适用于udev,那么最好的替代方法是什么?

2 个答案:

答案 0 :(得分:2)

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

您可以通过/dev/xconsoledmesg/var/log/kern.log 追踪连接。

示例,使用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%% *}

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

答案 1 :(得分:2)

正如其他人已经提到的那样,似乎无法使用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_add_watch fails on /sys/class/net/eth0/operstate上使用inotify API。

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

希望有所帮助:)