udev

常駐程式

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

udev
开发者Greg Kroah-HartmanKay Sievers
首次发布2003年11月,​20年前​(2003-11
当前版本
  • 255 (2023年12月6日;稳定版本)[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 255. 2023年12月6日 [2023年12月19日]. 
  2. ^ udev and devfs - The final word. 2003-12-30 [2008-01-13]. (原始内容存档于2011-04-11) (英语).  Authors list列表中的|first1=缺少|last1= (帮助)