netifd,在interface up或down的时候都会通过通用的框架调用hotplug。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #define DEFAULT_HOTPLUG_PATH "/sbin/hotplug-call" setenv("ACTION", eventnames[event], 1); setenv("INTERFACE", ifname, 1); if (device) setenv("DEVICE", device, 1); if (event == IFEV_UPDATE) { if (updated & IUF_ADDRESS) setenv("IFUPDATE_ADDRESSES", "1", 1); if (updated & IUF_ROUTE) setenv("IFUPDATE_ROUTES", "1", 1); if (updated & IUF_PREFIX) setenv("IFUPDATE_PREFIXES", "1", 1); if (updated & IUF_DATA) setenv("IFUPDATE_DATA", "1", 1); } argv[0] = hotplug_cmd_path; argv[1] = "iface"; argv[2] = NULL; execvp(argv[0], argv); |
而hotplug-call是一个脚本,它会调用/etc/hotplug.d/iface下面的所有的脚本。
1 2 3 4 5 | [ \! -z "$1" -a -d /etc/hotplug.d/$1 ] && { for script in $(ls /etc/hotplug.d/$1/* 2>&-); do ( [ -f $script ] && . $script ); done} |
动作相关的参数通过环境变量传递。如ACTION/INTERFACE/DEVICE。
当前/etc/hotplug.d/iface下面的脚本有:
1 2 3 4 | # ls /etc/hotplug.d/iface/00-netstate 25-dnsmasq 65-pppoe 95-ddns15-teql 30-repacd 75-rstp 99-igmpproxy20-firewall 50-miniupnpd 90-rngd |