udev 是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目錄底下的设备节点 。它同时也是用来接替devfs 及hotplug 的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载firmware 时。
udev的最新版本依赖于升级后的Linux kernel 2.6.13的uevent 接口的最新版本。使用新版本udev的系统不能在2.6.13以下版本启动,除非使用noudev 参数来禁用udev并使用传统的/dev来进行设备读取。
概要
在传统的Linux系统中,/dev目录下的设备节点为一系列静态存在的文件,而udev则动态提供了在系统中实际存在的设备节点。虽然devfs提供了类似功能,udev的支持者也给出了很多udev实现比devfs好的理由[1] :
- udev支持设备的固定命名,而并不依赖于设备插入系统的顺序。默认的udev设置提供了存储设备的固定命名。任何硬盘都根据其唯一的文件系统id、磁盘名称及硬件连接的物理位置来进行识别。
- udev完全在用户空间 执行,而不是像devfs在内核空间 一样执行。结果就是udev将命名策略从内核中移走,并可以在节点创建前用任意程序在设备属性中为设备命名。
运行方式
udev是一个通用的内核设备管理器。它以守护进程的方式运行于Linux系统,并监听在新设备初始化或设备从系统中移除时内核(通过netlink socket)发出的uevent。
系统提供了一套规则用于匹配可发现的设备事件和属性的导出值。匹配规则可能命名并创建设备节点,并运行配置程序来对设备进行设置。udev规则可以 匹配像内核子系统、内核设备名称、设备的物理等属性,或设备序列号的属性。规则也可以请求外部程序提供信息来命名设备,或指定一个永远一样的自定义名称来 命名设备,而不管设备什么时候被系统发现。
系统架构
udev系统可以分为三个部分:
- namedev函数库,处理设备的命名。
- libsysfs函数库,进行设备信息的读取(080版本后废弃)
- 守护进程udevd,处于用户空间,用于创建虚拟/dev
系统获取内核通过netlink socket发出的信息。早期的版本使用hotplug ,并在/etc/hotplug.d/default添加一个链接到自身来达到目的。