hotplug+mdev机制实现U盘自动挂载、卸载
【背景1】
自动挂载磁盘分区的操作从底层来说,是要内核支持的,2.6 内核的sysfs 虚拟文件系统就提供了这一支持,这个文件系统 (/sys/) 通常用于反应系统硬件信息,总线上的设备变化、网络设备的变化等事件在这里都能反应出来,这个文件系统的变化配合上内核的 hotplug 机制就可以掌握硬件改动相关的信息。
说到内核的 hotplug 机制,简单地说就是在硬件发生变化的时候去通知某一用户态程序,缺省是 /sbin/hotplug,不过现在它已经被 udev 取代了,收到信息之后,udev 会根据 sysfs 的变化调用一些脚本来处理这个事件,这里的处理是指某个用户空间的动作,而不是加载驱动,加载驱动是内核自己的事情,在 udev 反应过来之前就完成了。
在2.6内核里,使用了udev来取代hotplug。2.6.15之后,/proc/sys/kernel/hotplug会成空的,因为内核通知用户空间的接口变成了netlink,所以,最新的udev也采用了netlink接口去写,废弃了/sbin/hotplug或者/sbin/udevsend。udev在2.6.15以后的内核上可以直接通过netlink接听设备事件,sysfs提供了uevent文件,对该文件的“写”可以送出设备事件!
对于以模块驱动的设备,当内核检测到一个新设备连接时,内核会产生一个热插拔事件,并在 /proc/sys/kernel/hotplug 文件里查找处理设备连接的用户空间程序(新的内核通知接口改变,/proc/sys/kernel/hotplug为空了,替换为 /sbin/mdev)。
【背景2】
mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用场合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或者动态加载驱动程序时,自动产生驱动程序所需的节点文件。
【背景3】配置系统支持mdev
配置内核makefile
配置busybox makefile
插拔硬件,内核的hotplug通知用户程序 /proc/sys/kernel/hotplug -> /sbin/mdev
下面是基于MT7620实现的U盘自动挂载实例解析:
goahead进程 -> internet.sh ① -> mdev.conf ② -> automount.sh ③ -> killall -SIGTTIN goahead -> storage.sh (initUSB) ④
goahead进程启动时调用相关脚本,相当于 etc/init.d/rcS 的作用。
① 系统任务调用 internet.sh (MT7620为goahead调用)
mount 文件系统
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
/etc/mdev.conf
② mdev会利用配置文件 /etc/mdev.conf 控制设备节点的所有者和权限、匹配设备节点,执行自定义命令
MT7620自定义命令为 automount.sh
③ 解析并挂载设备节点 automount.sh
mount 设备
killall -SIGTTIN goahead
为了便于设备解析,环境变量 $MDEV 会被设置为设备名,如"hdc"、"sda"等。
④ 相关服务的配置(如 samba 服务等) storage.sh
配置samba服务和用户
【参考】
http://blog.csdn.net/skyflying2012/article/details/8295547 点击打开链接
http://blog.csdn.net/lanmanck/article/details/5954397 点击打开链接
http://www.cnblogs.com/hnrainll/archive/2011/06/25/2090182.html 点击打开链接
【背景1】
自动挂载磁盘分区的操作从底层来说,是要内核支持的,2.6 内核的sysfs 虚拟文件系统就提供了这一支持,这个文件系统 (/sys/) 通常用于反应系统硬件信息,总线上的设备变化、网络设备的变化等事件在这里都能反应出来,这个文件系统的变化配合上内核的 hotplug 机制就可以掌握硬件改动相关的信息。
说到内核的 hotplug 机制,简单地说就是在硬件发生变化的时候去通知某一用户态程序,缺省是 /sbin/hotplug,不过现在它已经被 udev 取代了,收到信息之后,udev 会根据 sysfs 的变化调用一些脚本来处理这个事件,这里的处理是指某个用户空间的动作,而不是加载驱动,加载驱动是内核自己的事情,在 udev 反应过来之前就完成了。
在2.6内核里,使用了udev来取代hotplug。2.6.15之后,/proc/sys/kernel/hotplug会成空的,因为内核通知用户空间的接口变成了netlink,所以,最新的udev也采用了netlink接口去写,废弃了/sbin/hotplug或者/sbin/udevsend。udev在2.6.15以后的内核上可以直接通过netlink接听设备事件,sysfs提供了uevent文件,对该文件的“写”可以送出设备事件!
对于以模块驱动的设备,当内核检测到一个新设备连接时,内核会产生一个热插拔事件,并在 /proc/sys/kernel/hotplug 文件里查找处理设备连接的用户空间程序(新的内核通知接口改变,/proc/sys/kernel/hotplug为空了,替换为 /sbin/mdev)。
【背景2】
mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用场合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或者动态加载驱动程序时,自动产生驱动程序所需的节点文件。
【背景3】配置系统支持mdev
配置内核makefile
配置busybox makefile
插拔硬件,内核的hotplug通知用户程序 /proc/sys/kernel/hotplug -> /sbin/mdev
下面是基于MT7620实现的U盘自动挂载实例解析:
goahead进程 -> internet.sh ① -> mdev.conf ② -> automount.sh ③ -> killall -SIGTTIN goahead -> storage.sh (initUSB) ④
goahead进程启动时调用相关脚本,相当于 etc/init.d/rcS 的作用。
① 系统任务调用 internet.sh (MT7620为goahead调用)
mount 文件系统
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
/etc/mdev.conf
② mdev会利用配置文件 /etc/mdev.conf 控制设备节点的所有者和权限、匹配设备节点,执行自定义命令
MT7620自定义命令为 automount.sh
③ 解析并挂载设备节点 automount.sh
mount 设备
killall -SIGTTIN goahead
为了便于设备解析,环境变量 $MDEV 会被设置为设备名,如"hdc"、"sda"等。
④ 相关服务的配置(如 samba 服务等) storage.sh
配置samba服务和用户
【参考】
http://blog.csdn.net/skyflying2012/article/details/8295547 点击打开链接
http://blog.csdn.net/lanmanck/article/details/5954397 点击打开链接
http://www.cnblogs.com/hnrainll/archive/2011/06/25/2090182.html 点击打开链接