udev

常駐程式

udev 是Linux kernel的设备管理器,主要管理/dev目錄底下的设备节点。它同时也是用来接替devfshotplug的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载固件时。

udev
開發者Greg Kroah-HartmanKay Sievers
首次发布2003年11月,​21年前​(2003-11
当前版本
  • 256.7(2024年10月8日;穩定版本)[1]
編輯維基數據鏈接
源代码库 編輯維基數據鏈接
编程语言C
操作系统Linux内核
类型设备节点
许可协议GPLv2
网站官方网站

udev的最新版本依赖于升级后的Linux kernel 2.6.13的uevent接口的最新版本。使用新版本udev的系统不能在2.6.13以下版本启动,除非使用noudev参数来禁用udev并使用传统的/dev来进行设备读取。

2012年4月,udev被合併至systemd

概要

在传统的Linux系统中,/dev目录下的设备节点为一系列静态存在的文件,而udev则动态提供了在系统中实际存在的设备节点。虽然devfs提供了类似功能,udev的支持者也给出了很多udev实现得比devfs好的理由[2]

  • udev支持设备的固定命名,而并不依赖于设备插入系统的顺序。默认的udev设置提供了存储设备的固定命名。可以使用其vid(vendor)、pid(device)、设备名称(model)等属性或其父设备的对应属性来确认某一设备。
  • udev完全在用户空间执行,而不是像devfs在内核空间一样执行。结果就是udev将命名策略从内核中移走,并可以在节点创建前用任意程序在设备属性中为设备命名。

运行方式

udev是一个通用的内核设备管理器。它以守护进程的方式运行于Linux系统,并监听在新设备初始化或设备从系统中移除时,内核(通过netlink socket)所发出的uevent。

系统提供了一套规则用于匹配可发现的设备事件和属性的导出值。匹配规则可能命名并创建设备节点,并运行配置程序来对设备进行设置。udev规则可以匹配像内核子系统、内核设备名称、设备的物理等属性,或设备序列号的属性。规则也可以请求外部程序提供信息来命名设备,或指定一个永远一样的自定义名称来命名设备,而不管设备什么时候被系统发现。

系统架构

udev系统可以分为三个部分:

  • libudev函数库,可以用来获取设备的信息。
  • udevd守护进程,处于用户空间,用于管理虚拟/dev
  • 管理命令udevadm,用来诊断出错情况。

系统获取内核通过netlink socket发出的信息。早期的版本使用hotplug,并在/etc/hotplug.d/default添加一个链接到自身来达到目的。

命令格式

BUS 总线 KERNEL 内核名如sd* ID 设备id 如总线id PLACE

SYSFS{filename} 或 ATTR{filename}

PROGRAM 调用外部程序 RESULT 匹配program返回的结果 NAME

SYMLINK 连接规则

编写规则

udev配置文件是/etc/udev/udev.conf,文件内容中很重要的一项是指定udev规则存储的目录,形如udev_rules=“/etc/udev/rules.d”. 指定的目录中存储一系列以.rules结束的规则文件,每个文件处理一系列规则来帮助udev分配名字给设备文件并保证内核可以识别此名字。

规则文件由系列键-值对组成,键值对分两类:匹配键(使用操作符"==","!="等)和赋值键(使用"=","+=",":="等)。匹配键判断规则是否应被应用,赋值键可以被分配一到多个值。

有些常用的键已经有了固定的含义,这里列举出最基本的几个。这也是基本规则之一,更多编辑规则请参见man udev页。

  • KERNEL - 匹配设备的内核名字
  • SUBSYSTEM - 匹配设备的子系统
  • DRIVER - 匹配设备驱动名
  • NAME - 应当被采用为设备节点的名字
  • SYMLINK - 一系列被作为设备节点替补名字的符号链接

常用键举例:KERNEL=="hdb", DRIVER=="ide-disk", NAME="my_spare_disk", SYMLINK+="sparedisk"

作者

udev由Greg Kroah-HartmanKay Sievers共同开发,并得到Dan Stekloff等人的帮助。

參見

外部链接

参考文献

  1. ^ Release 256.7. 2024年10月8日 [2024年10月27日]. 
  2. ^ udev and devfs - The final word. 2003-12-30 [2008-01-13]. (原始内容存档于2011-04-11) (英语).  Authors list列表中的|first1=缺少|last1= (帮助)