udev mdev热插拔配置说明
udev
udev介绍
udev用于linux2.6.13或更高版本的内核上,为用户空间提供使用固定设备名的动态/dev目录的解决方案。它通过在 sysfs 的 /class/ 和/block/ 目录树中查找一个称为 dev 的文件,以确定所创建的设备节点文件的主次设备号。所以要使用udev,驱动必须为设备在sysfs中创建类接口及其dev属性文件,方法和sculld模块中创建dev属性相同。
工作原理
当系统内核发现系统中添加或者删除了某个新的设备时,内核检测到后会产生一个hotplug event并查找/proc/sys/kernel/hotplug去找出管理设备连接的用户空间程序。若udev已经启动,内核会通知udev去检测sysfs中关于这个新设备的信息并创建设备节点。udev就会去执行udevd,以便让udevd可以产生或者删除硬件的设备文件。 接着udevd会通过libsysfs读取sys文件系统,以便取得该硬件设备的信息(如/dev/vcs,在/sys/class/tty/vcs/dev存放的是”7:0”,既/dev/vcs的主次设备号);然后再向namedev查询该外部设备的设备文件信息,例如文件的名称、权限等。最后,udevd就依据上述的结果,在/dev/目录中自动建立该外部设备的设备文件,同时在/etc/udev/rules.d下检查有无针对该设备的使用权限。当设备插入或移除时,hotplug机制会让内核会通过netlink socket通讯(内核调用kobject_uevent函数发送netlink message给用户空间,该功能由内核的统一设备模型里的子系统这一层实现)向用户传递一个事件的发生,Udevd通过标准的socket机制,创建socket连接来获取内核广播的uevent事件 并解析这些uevent事件。
热插拔配置
-
必须保证文件系统支持udev
-
修改etc/init.d/rcs脚本,在系统启动时,挂载sysfs 和tmpfs 文件系统,然后启动udev
#如果/etc/fstab已经配置了挂载sysfs和tmpfs的挂载则忽略以下两行
/bin/mount -t sysfs sysfs /sys
/bin/mount -t tmpfs tmpfs /dev
#udevd和udevadm 所在的目录可能不同,根据自己的情况修改路径
/bin/udevd --daemon
/sbin/udevadm trigger
- 确保内核配置以下选项
CONFIG_HOTPLUG=y
CONFIG_UEVENT_HELPER_PATH=""
CONFIG_NET=y
CONFIG_UNIX=y
CONFIG_SYSFS=y
CONFIG_SYSFS_DEPRECATED*=n
CONFIG_PROC_FS=y
CONFIG_TMPFS=y
CONFIG_INOTIFY_USER=y
CONFIG_SIGNALFD=y
CONFIG_TMPFS_POSIX_ACL=y (user ACLs for device nodes)
CONFIG_BLK_DEV_BSG=y (SCSI devices)
- 在/etc下创建udev目录,在/etc/udev创建目录rules.d和文件udev.conf,在udev.conf中添加如下内容
# see udev.conf(5) for details
#udev_log="info"
- 在目录/etc/udev/rules.d/下创建auto-mount.rules规则文件
ACTION=="add",KERNEL=="sd[a-z][0-9]",RUN+="/etc/udev/mount-sd.sh %k"
ACTION=="remove",KERNEL=="sd[a-z][0-9]",RUN+="/etc/udev/umount-sd.sh %k"
ACTION=="add",KERNEL=="mmcblk[0-9]p[0-9]",RUN+="/etc/udev/mount-sd.sh %k"
ACTION=="remove",KERNEL=="mmcblk[0-9]p[0-9]",RUN+="/etc/udev/umount-sd.sh %k"
ACTION:说明是什么事件;
KERNEL:说明是什么设备比如sda1,mmcblk0p1等;
RUN:这个设备插入后去执行哪个程序%k是传入这个程序的参数,这里%k=kernel的值也就是sda1等.
- 在/etc/udev下创建mount-sd.sh挂载脚本和umount-sd.sh卸载脚本,即上面auto-mount.rules文件RUN+指定的执行脚本,当系统监控的热插拔事件发生,则会执行脚本进行挂载或卸载,添加如下内容
mount-sd.sh脚本:
#!/bin/sh
mkdir -p /run/media/$1
mount /dev/$1 /run/media/$1
sync
umount-sd.sh脚本:
#!/bin/sh
umount /run/media/$1
rm /run/media/$1 -rf
sync
修改文件权限,为其添加可执行的权限:chmod +x mount-usb.sh umount-usb.sh
- 注意脚本的格式问题,可能会出现如下问题,这个在Windows编辑器编辑导致,把^M去掉
umount /run/media/$1^M- 注意文件系统系统的shell工具,有些是用/bin/bash,则需要改为#!/bin/bash
mdev
mdev介绍
mdev是busybox提供的一个工具,用在嵌入式系统中,相当于简化版的udev,作用是在系统启动和热插拔或动态加载驱动程序时,自动创建设备节点。文件系统中的/dev目录下的设备节点都是由mdev创建的。在加载驱动过程中,根据驱动程序,在/dev下自动创建设备节点。
工作原理
mdev 是基于uevent_helper 机制的,它在系统启动时修改了内核中的uevnet_helper 变量(通过写/proc/sys/kernel/hotplug),值为“/sbin/mdev”。这样内核产生uevent 时会调用uevent_helper 所指的用户级程序,也就是mdev,来执行相应的热拔插动作。
mdev 使用的uevent_helper 机制实现简单,适合用在嵌入式系统中。另外要说明的一点是,uevent_helper 的初始值在内核编译时是可配置的,默认值为/sbin/hotplug。如果想修改它的值,写/proc/sys/kernel/hotplug 文件就可以了。
热插拔配置
- 配置uevent_helper
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
- 在/etc/init.d/rsC文件中添加如下内容
mount -t tmpfs mdev /dev
mkdir /dev/pts
mount -t devpts devpts /dev/pts
#它是mdev运行的基础条件之一
mount -t sysfs sysfs /sys
#设置系统的hotplug程序为mdev,当有热插拔事件产生时,内核就会调用位于 /sbin目录的mdev。这时mdev通过环境变量中的 ACTION 和 DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的哪个目录。接着会看看这个目录中是否有“dev”属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
#调用/sbin/mdev程序(其实是个链接,作用是传递参数给/bin目录下的busybox程序并调用它),检索/sys/class、/sys/block和/proc中所有类设备目录,如果在目录中含有名为“dev”的文件且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev 下创建设备节点文件。
mdev –s
- 确保编译内核时编译如下选项:
CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_HOTPLUG=y
CONFIG_NET=y
- 在/etc/mdev.conf文件中添加对热插拔事件的响应,实现U盘和SD卡的自动挂载
sd[a-z][0-9] 0:0 666 @/etc/mdev/udisk_insert.sh
sd[a-z] 0:0 666 $/etc/mdev/udisk_remove.sh
@:表示在插入(创建设备结点)后执行后面的脚本;
$:表示在拔出(删除设备结点)前执行后面的脚本;
*:表示在创建设备结点后,删除节点设备前执行后面的脚本。
/etc/mdev/udisk_insert.sh:
#!/bin/sh
mkdir -p /run/media/$MDEV
mount /dev/$MDEV /run/media/$MDEV
etc/mdev/udisk_remove.sh
#!/bin/sh
umount -l /run/media/sd*
rm -rf /run/media/sd*
- 给以上两个脚本设置可执行权限:
chmod +x /etc/mdev/udisk_insert.sh
chmod +x /etc/mdev/udisk_remove.sh
以上为udev和mdev热插拔工具的配置过程。