热插拔机制

本文详细介绍了Linux系统中的热插拔机制,包括hotplug/uevent机制的工作原理、内核如何通过kobject_uevent发送事件以及如何利用mdev进行设备节点的自动创建与管理。此外,还展示了具体的配置示例,如U盘自动挂载的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

热插拔:hotplug / uevent 机制


//一下内容来自为东山  二期  28课

class_device_create
         class_device_register
class_device_add
kobject_uevent(&class_dev->kobj, KOBJ_ADD);
kobject_uevent_env(kobj, action, NULL);


// action_string = "add";
action_string = action_to_string(action);


/* 分配保存环境变量的内存 */
/* environment values */
buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);

/* 设置环境变量 */
envp [i++] = scratch;
scratch += sprintf(scratch, "ACTION=%s", action_string) + 1;
envp [i++] = scratch;
scratch += sprintf (scratch, "DEVPATH=%s", devpath) + 1;
envp [i++] = scratch;
scratch += sprintf(scratch, "SUBSYSTEM=%s", subsystem) + 1;

/* 调用应用程序: 比如mdev */
/* 启动脚本 echo /sbin/mdev > /proc/sys/kernel/hotplug 
* 设置了uevent_helper为“/sbin/mdev“
*/

argv [0] = uevent_helper;  // = "/sbin/mdev"
argv [1] = (char *)subsystem;
argv [2] = NULL;
call_usermodehelper (argv[0], argv, envp, 0);


call_usermodehelper :内核中直接运行用户空间程序




分析: busybox mdev.c  


100ask: uevent_helper = /sbin/mdev
envp[0] = HOME=/
envp[1] = PATH=/sbin:/bin:/usr/sbin:/usr/bin
envp[2] = ACTION=add
envp[3] = DEVPATH=/class/sixth_drv/buttons
envp[4] = SUBSYSTEM=sixth_drv
envp[5] = SEQNUM=720
envp[6] = MAJOR=252
envp[7] = MINOR=0


mdev_main
temp = /sys/class/sixth_drv/buttons
make_device(temp, 0);
/* 确定设备文件名,类型,主次设备号 */
device_name = bb_basename(path);  = "buttons"


'c' == > 字符设备节点
根据"/sys/class/sixth_drv/buttons/dev"的内容确定主次设备号

mknod(device_name, mode | type, makedev(major, minor)


我接上U盘,想自动挂载,怎么办?
mdev.conf的格式:
<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]


device regex:正则表达式,表示哪一个设备
uid: owner
gid: 组ID
octal permissions:以八进制表示的属性
@:创建设备节点之后执行命令
$:删除设备节点之前执行命令
*: 创建设备节点之后 和 删除设备节点之前 执行命令
command:要执行的命令


写mdev.conf
1.
leds 0:0 777
led1 0:0 777
led2 0:0 777
led3 0:0 777


2.
leds?[123]? 0:0 777


3.
leds?[123]? 0:0 777 @ echo create /dev/$MDEV > /dev/console


4.
leds?[123]? 0:0 777 * if [ $ACTION = "add" ]; then echo create /dev/$MDEV > /dev/console; else echo remove /dev/$MDEV > /dev/console; fi


5. 
leds?[123]? 0:0 777 * /bin/add_remove_led.sh


把命令写入一个脚本:
add_remove_led.sh


#!/bin/sh
if [ $ACTION = "add" ]; 
then 
echo create /dev/$MDEV > /dev/console; 
else 
echo remove /dev/$MDEV > /dev/console; 
fi


6. U盘自动加载
sda[1-9]+ 0:0 777 * if [ $ACTION = "add" ]; then mount /dev/$MDEV /mnt; else umount /mnt; fi


7.
sda[1-9]+ 0:0 777 * /bin/add_remove_udisk.sh


add_remove_udisk.sh
#!/bin/sh
if [ $ACTION = "add" ]; 
then 
mount /dev/$MDEV /mnt; 
else 
umount /mnt; 
fi


<think>嗯,用户想了解OpenWRT系统的热插拔机制实现原理和配置方法,特别是与udev的关系。首先,我需要回忆一下OpenWRT的基本架构。记得OpenWRT使用Procd作为其初始化系统,而Procd整合了hotplug、coldplug等功能。用户提供的引用中提到,新版本的OpenWRT将hotplug等集成到Procd中,所以可能需要解释Procd和传统udev的区别和联系。 接下来,热插拔机制的原理。根据引用内容,udev在用户态处理内核发送的热插拔事件,而OpenWRT可能使用自己的方式。需要确认OpenWRT是否完全使用Procd来替代udev,还是两者结合。引用3提到hotplug处理驱动程序后调用udevd生成设备文件,但可能在OpenWRT中流程不同,因为Procd可能接管了部分功能。 然后是配置方法,用户可能需要知道如何添加自定义规则。在udev中,规则文件通常在/etc/udev/rules.d/,但OpenWRT可能路径不同,或者使用其他机制。比如,Procd的hotplug脚本可能在/etc/hotplug.d/目录下,分不同子目录如block、net等,处理不同类型设备的事件。 还要考虑用户的实际需求,他们可能希望自动挂载U盘或配置网络设备。需要提供具体的配置示例,比如挂载U盘的脚本,可能需要用到block hotplug,编写脚本检查设备类型并执行mount命令。 此外,引用中提到的冷插拔处理,即开机时已连接的设备,OpenWRT如何处理?可能需要通过触发事件或查询sysfs来生成设备节点,确保这些设备在启动后被正确识别。 最后,验证配置的方法,比如使用logger记录日志,或者查看/dev/下的设备文件是否存在。可能还需要提醒用户注意权限问题,尤其是在自动挂载时的用户权限设置。 总结下来,回答的结构应该包括原理、组件分析、配置步骤、示例和验证方法,同时引用提供的资料来支持每个部分。确保使用正确的术语,比如Procd、hotplug.d目录、udev规则等,并区分OpenWRT与传统Linux发行版的不同之处。</think>### OpenWRT热插拔机制实现与配置分析 #### 一、实现原理 1. **Procd系统集成** OpenWRT从2014年起采用全新的Procd系统,将热插拔(hotplug)、冷插拔(coldplug)和守护进程管理等功能整合到统一框架中[^1]。与传统Linux的udev不同,Procd通过精简设计更适配嵌入式场景。 2. **事件传递流程** - 内核检测到设备变动时,通过netlink发送事件到用户态 - Procd的hotplug模块接收事件并解析 - 通过/etc/hotplug.d/目录下的脚本响应事件[^3] 3. **与udev的差异** OpenWRT未直接使用udev,但保留了类似机制: ```shell # 设备规则路径 /etc/dev.d/ # 设备事件处理脚本 /sys/class/ # 设备信息接口 ``` #### 二、核心配置方法 1. **脚本挂载点配置** ```shell /etc/hotplug.d/ ├── block/ # 存储设备事件 ├── net/ # 网络设备事件 └── usb/ # USB设备事件 ``` 示例U盘自动挂载脚本(/etc/hotplug.d/block/10-mount): ```bash case "$ACTION" in add) mkdir -p /mnt/$DEVICE mount /dev/$DEVICE /mnt/$DEVICE ;; remove) umount /mnt/$DEVICE rmdir /mnt/$DEVICE ;; esac ``` 2. **自定义设备规则** 通过创建预执行脚本实现高级控制: ```bash # /etc/hotplug.d/iface/00-custom [ "$INTERFACE" = "wan" ] && { logger "WAN接口状态变更:$ACTION" } ``` #### 三、调试与验证 1. **事件触发测试** ```shell # 模拟存储设备插拔 echo add > /sys/block/sda/uevent ``` 2. **日志监控方法** ```shell logread -f | grep hotplug ``` #### 四、进阶配置建议 1. **冷插拔处理优化** 对于启动时已连接的设备,建议在/etc/rc.local添加初始化检测: ```bash for dev in $(ls /sys/block); do hotplug-call block $dev done ``` 2. **权限控制** 通过mdev规则实现细粒度权限管理: ```shell # /etc/mdev.conf sd[a-z][0-9] 0:0 660 */etc/hotplug.d/block/mount.sh ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值