udev分析

来源:互联网 发布:企业数据意识改进 编辑:程序博客网 时间:2024/05/22 04:53
udev是一个通用的内核设备管理器,现在udev守护进程是systemd的一部分,存在于linux内核2.6版本以上的,也就是说目前方德的所有系统都有它。

udev作用:它主要管理/dev目录下的设备节点,同时接替devfs和hotplug的功能,这就意味着它要在增删硬件时处理/dev和所有用户空间的行为(包括加载firmware)。

原理简述:它基于libudev库,数据绝大部分来源于/sys存于/dev文件系统下。它作为用户空间daemon运行于系统,监听新设备初始化或设备从系统中移除时,内核通过netlink socket所发出的uevent<这里的uevent是指内核的一个模块>。(早期用的是hotplug,并在/etc/hotplug.d/default下添加一个链接到自身来达到目的)

系统提供一套规则用于匹配可发现的设备事件和属性,udev规则可能命名并创建设备节点,运行配置程序对设备进行设置。也可以匹配像内核子系统、内核设备名称、设备的物理属性、序列号属性。还可以请求外部程序提供信息来命名设备,或制定一个永远一样的自定义名称来命名设备,而不管设备是什么时候被系统发现的。
系统架构
libudev函数库,用来获取设备信息。
udevd守护进程,处于用户空间,用于管理虚拟/dev。
命令udevdadm ,用来诊断出错情况。(这个对我们分析相关问题有用)
工作过程
1、当内核检测到在系统中出现新设备时,内核会在sysfs文件系统(一般mount在/sys下)中为新设备生成一个记录,该记录是以一个或多个文件或目录的形式存在,记录着该设备相关的信息。
2、udev在系统中是以udevd守护进程的方式运行,它通过某种途径(上面原理第一段)检测到新设备的出现,通过查找设备对应的sysfs中的记录得到设备信息。
3、udev会根据/etc/udev/udev.conf中的udev_rules指定的目录,该目录下的文件就是传说中的udev规则文件,这些文件都是针对某类或者某个设备应该施行什么措施的规则,udev读取文件是按照文件名的ASCII字母顺序来读取的,如果udev一旦找到了与新加入的设备匹配的文件规则,udev就会根据规则定义的措施对新设备进行配置,同时不再读后续的规则。如10-local.rules,90-printer.rules都是对打印机的规则的话,10-local.rules生效。(规则的写法请参见man page和百度搜索)
相关的目录
udev配置文件:
udev_root="/dev";产生的设备文件根目录
udev_db="/dev/.udevdb";设备文件形成的数据库
udev_rules="/etc/udev/rules.d";指导udev工作的规则目录所在目录。
udev_log=“err”;当出现错误时,用syslog记录错误信息。(在/var/log/下有相关信息<boot.log,syslog,udev>)
规则目录位置,优先级由上到下:
本机规则:/etc/udev/rules.d
运行时规则:/run/udev/rules.d

系统规则:/usr/lib/udev/rules.d

(针对usb设备)

有几个问题探讨下:

1.       内核是如何通知到udevd的?我看你文档中有两个说法:一个是“内核通过netlink socket所发出的uevent”,另一个是sysfs新生成记录。这两者是什么关系。

能否举个具体的例子说明如何工作的?

2.       Udevd是如何监控sys下面的uevent事件的

3.       另外,和初始化有关。Udevd服务是何时启动的,启动后会对sys下面既有的uevent做处理吗

先答    3、udev现在是作为systemd的一部分,启动的sysytemd据我了解属于并发启动,所以我认为加载头号init进程的后就开始了。udev会对已有的处理,uedv取代静态文件和devfs的优势之一就是动态管理,静态的更不在话下,更多的描述,参见第一次发的文档。

            1、2、这两种方式一起作用,比如在添加u盘时,udevd监听到uevent,然后根据/sys信息生成/dev下的设备节点。uevent事件和/sys下的信息是内核发的。这个图大致描述了uevent在内核中的位置,uevent是指内核的一个模块,"设备模型中任何设备有事件需要上报时,会触发Uevent提供的接口。Uevent模块准备好上报事件的格式后,可以通过两个途径把事件上报到用户空间: 一种是通过kmod模块,直接调用用户空间的可执行文件;另一种是通过netlink通信机制,将事件从内核空间传递给用户空间。(引自蜗窝科技)"不但是/sys下的uevent文件。netlink、Kmod、uevent、sysfs等以后再逐个分析。

0 0
原创粉丝点击