热插拔
当某些事件发生时,Procd(init系统和进程管理守护进程)执行位于/etc/hotplug.d/中的脚本,例如当接口up或down、检测到新的存储驱动器或按下设备上的某个key。它在PPPoE连接或不稳定的网络中,或者使用硬件key时非常有用。
这个功能模拟/扩展了长期退役的hotplug2软件包所做的事情。
它是如何工作的
在/etc/hotplub.d目录中,你会发现一些目录block,iface,net和ntp。
当触发器事件触发时,Procd将按字母顺序执行该触发器目录中的所有脚本。这就是为什么其中的大多数脚本都使用数字前缀。
目录 | 描述 |
block | 块设备事件:设备连接/断开连接 |
button | 按钮:默认情况下没有创建按钮,请参见/etc/rc.button |
dhcp | dhcp相关事件 |
dsl | DSL调制解调器事件 |
firewall | 防火墙相关事件 |
iface | 接口相关事件: LAN/WAN/等连接或断开 |
neigh | 邻居发现 |
net | 网络相关事件 |
ntp | 时间同步事件:时间步长、时间服务器层变化 |
tftp | TFTP相关事件 |
usb | USB设备,如3g调制解调器和tty* |
用法/排障
只需将你的要执行的脚本放到正确的hotplug.d目录,如果没有,就创建一个。
Procd在/etc/hotplug.d中执行脚本时公开了大量的信息,例如环境变量。如果您想了解它提供了什么环境变量,请制作这样的脚本:
cat<<"EOF">/etc/hotplug.d/iface/00-logger logger -t hotplug $(env) EOF |
注:
cat <<EOF 什么意思?
cat命令表示查看,而cat <<EOF命令表示将进行输入,直到以EOF终止符来结束输入(最后的新行)。EOF必须写在一行的头部,前面不能有制表符或者空格。如果结束符EOF前面有制表符或者空格,则EOF不会被当做结束符,只会被视为继续输入的状态。
简单的理解,就是随意输入一堆字符,当输入EOF的时候才真正结束。
然后可以通过logread命令查看输出。
事件分类/目录
iface
对于iface目录中的脚本,有如下(相关的)环境变量:
变量名称 | 描述 |
ACTION | ifdown, ifup, ifup-failed, ifupdate, free, reload, iflink, create |
INTERFACE | Name of the logical interface which went up or down (e.g. wan or ppp0) |
DEVICE | Physical device name which interface went up or down (e.g. eth0.1 or br-lan), when applicable |
大多数ACTION的含义很明了,以下几个是不明显的:
值 | 描述 |
ifup-failed | 接口up的过程中报错了,up失败 |
free | 接口被删除了,和create相反 |
iflink | the interface reported the presence of a carrier |
当 ACTION 是 ifupdate, 可以设置以下环境变量:
变量名称 | 描述 |
IFUPDATE_ADDRESSES | 自上次ifupdate事件后,IP地址发生改变了 |
IFUPDATE_ROUTES | 自上次ifupdate事件后,路由发生改变了 |
IFUPDATE_PREFIXES | if prefix changed since previous ifupdate event |
IFUPDATE_DATA | if ubus call network.interface.$INTERFACE set_data … (or equivalent) happened |
ntp
以下变量基于busybox中的ntpd进程
变量名称 | 描述 |
ACTION | step, stratum, unsync or periodic |
freq_drift_ppm | ntp variables |
offset | Time adjustment done |
stratum | Quality (nr of servers to atomic clock) |
poll_interval | ntp variables |
即使没有NTP同步,您也会收到一个“周期性”热插拔事件,stratum=16,大约每11分钟输出一次。
MTK7621上接口updown默认是没有调用热插拔脚本的,手工执行脚本可以通过logread看到日志,但是插、拔网口网线是没有打印任何日志的。
