如何为 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/xconsole
、dmesg
或 /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
在 bash 下,您可以使用超时清空 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 等守护进程。
希望对您有所帮助:)
我喜欢在连接 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/xconsole
、dmesg
或 /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
在 bash 下,您可以使用超时清空 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 等守护进程。
希望对您有所帮助:)