udev 引入
在2.4内核中 引入了 devfs,他支持设备节点的动态创建。devfs提供了在内存中的文件系统中创建设备节点的能力。设备驱动程序能够自主的管理自己的设备文件。而命名节点的任务还是落到了设备驱动程序头上。但是,设备命名策略是可管理的,不应该与内核混在一起,设备命名策略可以位于头文件,模块参数,或者用户空间中。而udev则将设备管理的任务推向了用户空间。
一 udev 是什么
简单讲,udev负责在用户空间,根据用户设置的规则,在监测到设备被插入后,在/dev/下自动创建并命名设备文件节点(实际上只能做一个已存在节点的链接文件),也可以自动设置设备属性。
udev 的工作取决于以下几项:
1 内核中的 sysfs文件系统 支持
2 一套用户空间守护程序 udevd 和 实用工具 udevinfo
3 用户自定的规则,位于 /etc/udev/rules.d/目录中。可以根据对应设备的特点设置规则。
devfs和udev的区别主要有以下几点:
1、devfs运行在内核空间(使用devfs_register等API在内核空间注册设备节点)。而udev完全运行在用户空间。
2、当用户访问/dev下的某个节点时,devfs会自动加载对应的驱动;而udev则并不负责自动加载驱动的工作(2.6版本内核,驱动是在设备被插入/移除时被加载/卸载的,而不是设备被访问时就加载驱动)。
3、devfs 是在内核空间命名设备,而 udev是在用户空间命名设备
4、udev 也会处理 热拔插、冷拔插, 事实上 udev承担了管理热拔插的全部责任。
二 udev的功能是什么
对热拔插 与 冷拔插的处理:
udev 完全在用户态工作,利用设备加入或移除时内核所发送的热拔插事件来工作,在运行过程中往系统中插入设备称为“热拔插”,而在系统系统前就已经连接的设备则称为冷拔插。侦测到热拔插事件之后,他们会通过netlink套接字向用户空间派生 uevent。 netlink套接字是一种在内核空间和用户空间透过套接字API进行通信的有效机制,用户空间的 udevd(管理设备节点创建和移除的守护进程)会接收uevent并管理热拔插。
udev也处理冷拔插,由于udev是用户空间的一部分,仅仅在内核启动后才开始运行,所以需要一种特殊的机制针对冷拔插设备模拟热拔插事件。启动时,内核为所有设备在sysfs下创建了一个名为 uevnet的文件,并将冷拔插事件记录于这些文件中。当udev开始运行后,他读取sysfs下所有的uevent文件,并为每个冷拔插设备产生热拔插uevent。
三 udev 怎么用
使用:
假设目前有一个 USB DVD驱动器 或 一个 USB CD-RW。根据热拔插设备顺序的不同,一个被命名为 /dev/sr0,另一个被命名为 /dev/sr1。在没有udev的情况下,必须区分这些名字对应的设备是哪个。但是有了udev之后,不管以什么顺序拔插它们,都能分辨出二者,如 DVD命名为 /dev/usbdvd, CD-RW命名为 /dev/usbdrw。
首先,从sysfs响应的文件中提取产品信息。假定 DVD驱动器被分配的设备节点是 /dev/sr0,CR-RW被分配的设备节点是 /dev/sr1。 使用 udevinfo可以收集设备信息
然后使用搜集到的产品信息标识设备并且添加udev命名规则,创建 /etc/udev/rules.d/40-cdvd.rules 文件 并添加如下信息:
BUS="usb", SYSFS{idProduct}="0701", SYSFS{idVendor}="05e3",
KERNEL="sr[0-9]*", NAME="%k", SYMLINK="usbdvd"
BUS="usb", SYSFS{idProduct}="0302", SYSFS{idVendor}="0dbf",
KERNEL="sr[0-9]*", NAME="%k", SYMLINK="usbdcdrw"
首先 第1条规则告诉 udev,一旦发现一个USB设备的产品ID为0x0701,厂商ID为0x05e3,就增加一个以sr开始的名称,udev将在 /dev 目录下创建一个同名的节点并为之创建一个名为 usbdvd的符号链接。类似的,第2条规则是为 CD-RW驱动器创建一个名为usbcdrw的符号链接。
为了测试新创建的语法错误,可以对 /sys/block/sr*运行udevtest。
为了打开 /var/log/messages中的相关提示信息,可以将 /etc/udev/udev.conf文件中的 udev_log设置为 “yes”
为了在运行过程中的对 /dev 目录应用增加规则,可以运行 udevstart重启udev,此后,你的DVD驱动器在系统中将始终为 /dev/usbdvd,而CD-RW驱动器将总是为/dev/usbcdrw。