八、热插拔

一、概述

  1. udev设备文件系统,基于netlink-socket,用户态监听内核发出的uevent事件处理设备的插入和拔出
  2. mdev设备文件系统,是udev的轻量级,基于uevent_helper,内态调用用户注册的回调函数处理设备的插入和拔出
  3. udevadm monitor监听uevent事件
  4. netlink的用户态实现参开socket,但是没有bind函数
  5. usbmount可以配合udev实现U盘的自动挂载,文件系统中添加该工具即可

二、关键结构体和API

// 内核发送一个事件,对应的kobj必须有对应的kset
int kobject_uevent(struct kobject *kobj, enum kobject_action action);
// kset中的uevent_ops成员对发送的uevent进行操作
struct kset_uevent_ops {
	int (* const filter)(struct kset *kset, struct kobject *kobj);            // 对kset的kobject进行过滤
	const char *(* const name)(struct kset *kset, struct kobject *kobj);      // 获得kset的kobject的name
	int (* const uevent)(struct kset *kset, struct kobject *kobj,        
		      struct kobj_uevent_env *env);                                   // 设置env
};
// kobject_uevent函数关于udev监听的重要函数
kobject_uevent_net_broadcast      // 该函数广播uevent
// kobject_uevent函数关于mdev的重要函数
call_usermodehelper_setup         // 启动一个用户空间进程

三、使用udev自动挂载

  1. 配置文件系统,/dev/management (Dynamic using devtmpfs+eudev)
  2. 添加规则文件/etc/udev/rules.d/001.rules
  3. 实现规则文件和其配套文件,参数sd对应U盘,参数mmcblk对应SD卡
KERNEL=="sd[a-z][0-9]", SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/rules.d/usb/usb-add.sh %k" SUBSYSTEM=="block", ACTION=="remove", RUN+="/etc/udev/rules.d/usb/usb-remove.sh"
  1. 挂载脚本
#!/bin/sh
/bin/mount -t vfat /dev/$1 /mnt
sync
  1. 卸载脚本
#!/bin/sh
sync
/bin/umount -l /mnt

四、使用mdev自动挂载

  1. 配置文件系统,/dev/management (Dynamic using devtmpfs+mdev)
  2. 配置busybox的mdev
  3. 添加规则文件/etc/mdev.conf,,参数sd对应U盘,参数mmcblk对应SD卡
  4. 添加规则
sd[a-z][0-9] 0:0 666 @/etc/mdev/usb_insert.sh
sd[a-z] 0:0 666 $/etc/mdev/usb_remove.sh
  1. 挂载脚本
#!/bin/sh
if [ -d /sys/block/*/$MDEV ]; then
mount /dev/$MDEV /mnt
sync
fi
  1. 卸载脚本
#!/bin/sh
sync
/bin/umount -l /mnt

五、固定usb设备的设备节点

udevadm info -a -n /dev/ttyUSB0 | grep "KERNELS=="
添加规则文件/etc/udev/rules.d/001.rules
KERNELS=="5-1:1.0",SUBSYSTEMS=="usb",MODE:="0777",SYMLINK+="myusb"
这样udev就会对/dev/ttyUSB0创建一个符号链接,/dev/myusb
posted @ 2025-11-26 23:05  gramming  阅读(9)  评论(0)    收藏  举报