赞
踩
本文是参考网上很多资料整合在一起的,这里只是为了方便学习和记忆,没有别的目的。如有侵犯到版权,请及时联系。
udev是在Linux kernel2.6系列上新添加的设备文件管理模块。其功能主要为动态管理设备文件,如增加、删除等操作。当新插入的设备被驱动检测到后会在sysfs上注册新的数据(与此设备相关的一些信息文件)。同时内核会发送设备的uevent给udev,udev收到后便会访问配置规则。然后按照配置规则来执行相应的操作,比如修改设备文件的属组、组、权限、创建链接文件以及挂载等等。同样在设备拔出后,udev也会收到内核发送的uevent事件,udev会根据uevnet的规则来执行如删除设备文件、去挂载、删除链接文件等等操作。这样就能很好的动态地管理设备文件,可以支持设备的热插拔。而无需预先在/dev目录下创建一大堆的静态设备文件。
除了上述的动态管理设备文件外,udev的另外一个亮点是其在用户空间运行,可以根据客户自定义的规则来执行相应的操作。比如设备上有多个USB接口,其中有两台USB接口打印机,假如同时接在设备上,那么在设备上/dev/目录下会生成两个设备文件,如/dev/sda和/dev/sdb。那么他们的对应关系是怎么样的呢?sda对应的是打印机1还是打印机2这和客户的操作相关,如插入的先后顺序,以及中途设备有关机的情况。这在以前的静态设备文件管理和devfs上无法处理的。咱们只需要简单地修改udev的规则便可以实现一一对应的映射。比如根据设备的序列号、vendorID等之类的来创建设备文件链接printer1、printer2。只要插入打印机1便会生成一个链接文件printer1,咱们再也不需要定时设备插入的先后顺序等之类的约束了。由于udev是运行于用户空间的模块,所以内核依旧会生成sda、sdab等设备文件。
udev的工作原理:在Linux2.6版本中引入了sysfs文件系统。sysfs把连接在系统上的设备和总线组织成一个分级的文件,并提供给用户空间存取使用。udev运行在用户模式,而非内核中。udev的初始化脚本在系统启动时创建设备节点,并且在新的设备被检测到后,会在sysfs上生成一系列的文件,udev会创建新的设备节点。udev必须需要内核中的sysfs和tmpfs支持,sysfs为udev提供设备入口和uevent通道,tmpfs为udev设备文件提供存放空间。下图为udev的工作流程图,配置文件存放在/etc/udev/udev.conf文件中。

为什么使用udev,因为之前使用的设备文件管理方法(静态文件和devfs)存在一些缺陷:
udev的目标是想解决上面提到的这些问题,他通采用用户空间(user-space)工具来管理/dev/目录树,他和文件系统分开。知道如何改变缺省配置能让你知道如何定制自己的系统,比如创建设备字符连接,改变设备文件属组,权限等。
上述中说了,udev会根据用户规则来执行相关的操作。那么这些规则文件放在哪里以及有哪些规则?其中关于规则部分,本文只讲解一些通用的,详细的请查看man udev文档。
主要的udev配置文件是**/etc/udev/udev.conf**。这个文件通常很短,常见如下图。其中udev_root指定了设备文件存放的根目录,udev_rules则指定了规则的存放路径,udev_log则指定记录日志的等级。还有其他的一些配置这里就暂不讲解,如日志存放的数据库。
udev_root="/dev/"
udev_rules="/etc/udev/rules.d/"
udev_log="err"
规则文件存放在udev_rules指定的目录下,并且文件名的后缀为.lures。规则文件可能有多个,匹配的先后顺序是安装ASCII码来进行的。如找到了比配的规则,则暂停匹配,不在去匹配后续的规则文件。所以自定义的规则文件基本上都是以数字开头,这样提高了规则文件的优先级。下图是简单的规则文件规则文件以行为单位,一行就是一条规则
KERNEL=="*", OWNER="root" GROUP="root", MODE="0600"
KERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"
KERNEL=="scd[0-9]*", SYMLINK+="cdrom cdrom-%k"
KERNEL=="hd[a-z]", BUS=="ide", SYSFS{removable}=="1", SYSFS{device/media}=="cdrom", SYMLINK+="cdrom cdrom-%k"
ACTION=="add", SUBSYSTEM=="scsi_device", RUN+="/sbin/modprobe sg"
在规则文件中,规则是由一系列的键值对组成,键值对以逗号分隔。键值对分为匹配键和赋值键。匹配键用来指定匹配规则,而赋值键则用来进行赋值的,赋值键可以处理一个多值列表。
下图的规则是根据扫描仪的IDvendor 和IDproduct来生产指定的链接名,每次打开扫描仪后其链接都是固定的,所以能很好的确定映射关系。
SYSFS{idVendor}=="0686",SYSFS{idProduct}=="400e", SYMLINK+="scanner", MODE="0664", group="scanner"
在修改规则后要是规则生效,我们可以插拔我们的设备产生一个事件或在设备中的event文件增加信息以达到发送事件的目的来更新我们的udev规则。更加方便的方法是运行下列命令
udevadm test /sys/class/block/sdc4
udevinfo -q path -n /dev/sda 这个命令会产生一个该设备名对应的在sysfs下的路径
udevinfo -a -p /sys/block/sda 这个命令会显示一堆信息,这些信息实际来自于操作系统维护的sysfs链表。
从udev下载网址可以下载到udev的源码。下面为移植步骤。
/bin/mount -t sysfs sysfs /sys
/bin/mount -t tmpfs tmpfs /dev
/bin/udevd --deamon
/bin/udevstart
# udev.conf
# The initial syslog(3) priority: 'err', 'info', 'debug' or its
# numerical equivalent. For runtime debugging, the daemons internal
# state can be changed with: 'udevcontrol log_priority='.
udev_root="/dev/"
udev_rules="/etc/udev/rules.d"
udev_log="err"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。