Linux内核检测USB事件大家好,我要在Linux内核层中实现以下功能:当有U盘插入时,能检测到这一动作,并对U盘进行验证,只有通过验证的U盘才允许使用。比如只有U盘的某个特定扇区是自己定义的内容时才允许使用。
请问,有什么好的思路吗?如果你能找到u盘的唯一标识的话,可以用个散列算法比如md5(当然不要告诉别人),然后固定存在u盘的某个区域。比如mbr后面有32KB的最后部分。
不过唯一标识应该没有那么好找的吧,除非自己定制u盘。
回复 2# blake326
多谢blake兄。不过我现在遇到的困难是:不知道应该怎样在内核层检测U盘插入事件。
当一个USB设备插入系统后,usb host会检测到这一事件,然后向CPU发送中断请求,并获取该usb设备的信息。usb core会根据usb id来匹配调用一个合适的usb driver处理该usb设备。
那么,我应该在内核的哪一层来检测U盘的插入事件呢?
1. 是应该修改内核文件drivers/usb/storage/usb.c文件吗?但是这样做需要重新编译内核,不实用。
2. 自己写一个usb driver,来专门处理自己需要验证的一类U盘?
请大家多多指点。
gfengict 发表于 2012-02-21 21:47 static/image/common/back.gif
回复 2# blake326
多谢blake兄。不过我现在遇到的困难是:不知道应该怎样在内核层检测U盘插入事件。
有现实的接口, 钊钊恒行的博客 udev可以捕获它。回复 4# 独孤九贱
请问现实的接口具体是什么? udevd就是一个应用程序,你直接使用它就可以满足你的需求了,如果你非要自己的实现,那就下载它的源代码吧。内核新驱动模型对这种热插拔提供了很好的支持,除去udev这些,你自己还有更大的自主权去控制这种热插拔事件,虽然本意并非给自己的书做广告,但是这种对U盘插入的检测在《深入Linux设备驱动内核机制》第9章有个具体的例子,通过kobject/kset的特性自己实现了一个捕捉热插拔事件的程序:
“本例展示了在Linux设备模型最底层kobject一级的sysfs文件系统的作用以及对设备热插拔机制的支持,虽然内核已经通过更高层次的bus、device与driver这些对象向程序员屏蔽了sysfs和uevent底层www.shhongcai.com,昱昱炎炎的这些操作,但是我们应该知道bus、device与driver这一层面的诸如属性文件相关操作以及对设备热插拔特性的支持,其幕后的原理其实就发源于此。
这段文字临结束时,我又突发奇想,不妨插个U盾到机器里来看看会发生什么,于是/var/log/messages中就有了下面的输出:Jun 19 04:11:45 AMDLinuxFGL kernel: [ 5803.856011] usb 3-1: new full speed USB device number 3 using uhci_hcd
Jun 19 04:11:46 AMDLinuxFGL hotplug: ----------------------------------------
Jun 19 04:11:46 AMDLinuxFGL hotplug: argv=usb
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=ACTION=add
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb3/3-1
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=SUBSYSTEM=usb
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=MAJOR=189
Jun 19 04:11:46 AMDLinuxFG L hotplug: env=MINOR=258
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=DEVNAME=bus/usb/003/003
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=DEVTYPE=usb_device
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=PRODUCT=8e6/1813/100
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=TYPE=0/0/0
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=BUSNUM=003
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=DEVNUM=003
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=SEQNUM=1470
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=HOME=/
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=PATH=/sbin:/bin:/usr/sbin:/usr/bin
Jun 19 04:11:46 AMDLinuxFGL hotplug: ----------------------------------------
...一旦你检测到这种热插拔事件,下面做什么还不是你说了算
回复 7# MagicBoy2010
可以共享一份您推荐的 黎锐雪溢的博客 书籍的电子版吗?全部的电子版目前尚未出来,请耐心等待。。。
请问,有什么好的思路吗?如果你能找到u盘的唯一标识的话,可以用个散列算法比如md5(当然不要告诉别人),然后固定存在u盘的某个区域。比如mbr后面有32KB的最后部分。
不过唯一标识应该没有那么好找的吧,除非自己定制u盘。
回复 2# blake326
多谢blake兄。不过我现在遇到的困难是:不知道应该怎样在内核层检测U盘插入事件。
当一个USB设备插入系统后,usb host会检测到这一事件,然后向CPU发送中断请求,并获取该usb设备的信息。usb core会根据usb id来匹配调用一个合适的usb driver处理该usb设备。
那么,我应该在内核的哪一层来检测U盘的插入事件呢?
1. 是应该修改内核文件drivers/usb/storage/usb.c文件吗?但是这样做需要重新编译内核,不实用。
2. 自己写一个usb driver,来专门处理自己需要验证的一类U盘?
请大家多多指点。
gfengict 发表于 2012-02-21 21:47 static/image/common/back.gif
回复 2# blake326
多谢blake兄。不过我现在遇到的困难是:不知道应该怎样在内核层检测U盘插入事件。
有现实的接口, 钊钊恒行的博客 udev可以捕获它。回复 4# 独孤九贱
请问现实的接口具体是什么? udevd就是一个应用程序,你直接使用它就可以满足你的需求了,如果你非要自己的实现,那就下载它的源代码吧。内核新驱动模型对这种热插拔提供了很好的支持,除去udev这些,你自己还有更大的自主权去控制这种热插拔事件,虽然本意并非给自己的书做广告,但是这种对U盘插入的检测在《深入Linux设备驱动内核机制》第9章有个具体的例子,通过kobject/kset的特性自己实现了一个捕捉热插拔事件的程序:
“本例展示了在Linux设备模型最底层kobject一级的sysfs文件系统的作用以及对设备热插拔机制的支持,虽然内核已经通过更高层次的bus、device与driver这些对象向程序员屏蔽了sysfs和uevent底层www.shhongcai.com,昱昱炎炎的这些操作,但是我们应该知道bus、device与driver这一层面的诸如属性文件相关操作以及对设备热插拔特性的支持,其幕后的原理其实就发源于此。
这段文字临结束时,我又突发奇想,不妨插个U盾到机器里来看看会发生什么,于是/var/log/messages中就有了下面的输出:Jun 19 04:11:45 AMDLinuxFGL kernel: [ 5803.856011] usb 3-1: new full speed USB device number 3 using uhci_hcd
Jun 19 04:11:46 AMDLinuxFGL hotplug: ----------------------------------------
Jun 19 04:11:46 AMDLinuxFGL hotplug: argv=usb
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=ACTION=add
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb3/3-1
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=SUBSYSTEM=usb
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=MAJOR=189
Jun 19 04:11:46 AMDLinuxFG L hotplug: env=MINOR=258
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=DEVNAME=bus/usb/003/003
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=DEVTYPE=usb_device
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=PRODUCT=8e6/1813/100
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=TYPE=0/0/0
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=BUSNUM=003
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=DEVNUM=003
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=SEQNUM=1470
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=HOME=/
Jun 19 04:11:46 AMDLinuxFGL hotplug: env=PATH=/sbin:/bin:/usr/sbin:/usr/bin
Jun 19 04:11:46 AMDLinuxFGL hotplug: ----------------------------------------
...一旦你检测到这种热插拔事件,下面做什么还不是你说了算
回复 7# MagicBoy2010
可以共享一份您推荐的 黎锐雪溢的博客 书籍的电子版吗?全部的电子版目前尚未出来,请耐心等待。。。