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-ddns 15-teql 30-repacd 75-rstp 99-igmpproxy 20-firewall 50-miniupnpd 90-rngd |