OpenWrt的hotplug功能详解:内核事件到用户空间的处理

需积分: 17 3 下载量 63 浏览量 更新于2024-09-07 收藏 28KB DOCX 举报
"hotplug是Linux系统中用于设备热插拔的功能,主要负责在设备插入或移除时自动管理和通知用户空间。在OpenWrt这样的轻量级操作系统中,hotplug功能同样得到了应用,以适应其对硬件变化的响应。本文将详细介绍OpenWrt中的hotplug功能、工作流程以及如何使用它。 当设备被插入或移除时,内核会通过kobject_uevent()函数生成一个UEVENT(用户事件),这个事件会通过netlink_broadcast_filtered()发送到用户空间。在默认设置中,UEVENT会被uevent_helper数组中指定的程序(通常是"/sbin/hotplug")处理。然而,在OpenWrt中,由于没有使用传统的"/sbin/hotplug"程序,而是利用PF_NETLINK(协议族为网络链接)来直接监听内核发出的UEVENT。 在OpenWrt中,初始化进程procd扮演了关键角色。procd内部的plug/hotplug.c模块创建了一个PF_NETLINK套接字,用于接收内核通过netlink_broadcast_filtered()广播的UEVENT。一旦收到UEVENT,procd会根据配置文件/etc/hotplug.json进行后续处理。这个配置文件定义了如何响应不同的设备事件。 例如,当插入一个U盘或SD卡时,系统可能会生成如下的事件消息: - ACTION=add:表示设备添加到系统中。 - DEVPATH=/devices/...:提供了设备在设备树中的路径。 这些消息会触发/etc/hotplug.d/目录下的相应脚本来执行。脚本根据UEVENT中的$SUBSYSTEM变量来判断如何处理,比如对于USB设备,可能调用"/sbin/hotplug-call",该脚本会进一步执行/etc/hotplug.d/目录下针对USB设备的特定脚本来完成设备的挂载、创建设备节点等工作。 因此,OpenWrt的hotplug机制使得系统能够动态地响应硬件变化,无需重启或手动干预,极大地提高了系统的灵活性和易用性。通过理解hotplug的工作原理和配置,用户可以自定义设备的自动管理策略,满足各种应用场景的需求。"