详解linux下的udev

本文介绍了Linux中udev设备管理系统,它解决了设备文件管理的不确定性、命名混乱等问题,尤其是对热插拔设备和大量设备的管理。udev通过用户空间程序动态管理/dev目录,保证设备文件的唯一性和可靠性。文章探讨了udev的目标、为何使用udev,以及如何配置udev规则,包括设备文件的权限、符号链接等。此外,还展示了如何通过udevinfo命令获取设备信息来定制规则,确保设备名的稳定性和权限设置。
摘要由CSDN通过智能技术生成

如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略。在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev目录下。后来,采用了devfs,一个基于内核的动态设备文件系统,他首次出现在2.3.46 内核中。Mandrake,Gentoo等Linux分发版本采用了这种方式。devfs创建的设备文件是动态的。但是devfs有一些严重的限制,从 2.6.13版本后移走了。目前取代他的便是文本要提到的udev--一个用户空间程序。

目前很多的Linux分发版本采纳了udev的方式,因为它在Linux设备访问,特别是那些对设备有极端需求的站点(比如需要控制上千个硬盘)和热插拔设备(比如USB摄像头和MP3播放器)上解决了几个问题。下面我我们来看看如何管理udev设备。

实际上,对于那些为磁盘,终端设备等准备的标准配置文件而言,你不需要修改什么。但是,你需要了解udev配置来使用新的或者外来设备,如果不修改配置,这些设备可能无法访问,或者说Linux可能会采用不恰当的名字,属组或权限来创建这些设备文件。你可能也想知道如何修改RS-232串口,音频设备等文件的属组或者权限。这点在实际的Linux实施中是会遇到的。

为什么使用udev
在此之前的设备文件管理方法(静态文件和devfs)有几个缺点:

* 不确定的设备映射。特别是那些动态设备,比如USB设备,设备文件到实际设备的映射并不可靠和确定。举一个例子:如果你有两个USB打印机。一个可能称为 /dev/usb/lp0,另外一个便是/dev/usb/lp1。但是到底哪个是哪个并不清楚,lp0,lp1和实际的设备没有一一对应的关系,因为他可能因为发现设备的顺序,打印机本身关闭等原因而导致这种映射并不确定。理想的方式应该是:两个打印机应该采用基于他们的序列号或者其他标识信息的唯一设备文件来映射。但是静态文件和devfs都无法做到这点。

*没有足够的主/辅设备号。我们知道,每一个设备文件是有两个8位的数字:一个是主设备号 ,另外一个是辅设备号来分配的。这两个8位的数字加上设备类型(块设备或者字符设备)来唯一标识一个设备。不幸的是,关联这些身边的的数字并不足够。

*/dev目录下文件太多。一个系统采用静态设备文件关联的方式,那么这个目录下的文件必然是足够多。而同时你又不知道在你的系统上到底有那些设备文件是激活的。

*命名不够灵活。尽管devfs解决了以前的一些问题,但是它自身又带来了一些问题。其中一个就是命名不够灵活;你别想非常简单的就能修改设备文件的名字。缺省的devfs命令机制本身也很奇怪,他需要修改大量的配置文件和程序。;

*内核内存使用,devfs特有的另外一个问题是,作为内核驱动模块,devfs需要消耗大量的内存,特别当系统上有大量的设备时(比如上面我们提到的系统一个上有好几千磁盘时)

udev的目标是想解决上面提到的这些问题,他通采用用户空间(user-space)工具来管理/dev/目录树,他和文件系统分开。知道如何改变缺省配置能让你之大如何定制自己的系统,比如创建设备字符连接,改变设备文件属组,权限等。

udev配置文件
主要的udev配置文件是/etc/udev/udev.conf。这个文件通常很短,他可能只是包含几行#开头的注释,然后有几行选项:

udev_root="/dev/"

udev_rules="/etc/udev/rules.d/"

udev_log="err"

上面的第二行非常重要,因为他表示udev规则存储的目录,这个目录存储的是以.rules结束的文件。每一个文件处理一系列规则来帮助udev分配名字给设备文件以保证能被内核识别。
你的/etc/udev/rules.d下面可能有好几个udev规则文件,这些文件一部分是udev包安装的,另外一部分则是可能是别的硬件或者软件包生成的。比如在Fedora Core 5系统上,sane-backends包就会安装60-libsane.rules文件,另外initscripts包会安装60-net.rules文件。这些规则文件的文件名通常是两个数字开头,它表示系统应用该规则的顺序。

规则文件里的规则有一系列的键/值对组成,键/值对之间用逗号(,)分割。每一个键或者是用户匹配键,或者是一个赋值键。匹配键确定规则是否被应用,而赋值键表示分配某值给该键。这些值将影响udev创建的设备文件。赋值键可以处理一个多值列表。

规则说明
1、udev 规则的所有操作符

“==”:  比较键、值,若等于,则该条件满足;
“!=”:   比较键、值,若不等于,则该条件满足;
“=”:    对一个键赋值;
“+=”:  为一个表示多个条目的键赋值。
“:=”:  对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。


2、udev 规则的匹配键

ACTION:          事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 )。
KERNEL:          内核设备名称,例如:sda, cdrom。
DEVPATH:          设备的 devpath 路径。
SUBSYSTEM:        设备的子系统名称,例如:sda 的子系统为 block。
BUS:            设备在 devpath 里的总线名称,例如:usb。
DRIVER:           设备在 devpath 里的设备驱动名称,例如:ide-cdrom。
ID:             设备在 devpath 里的识别号。
SYSFS{filename}:     设备的 devpath 路径下,设备的属性文件“filename”里的内容。
               例如:SYSFS{model}==“ST936701SS”表示:如果设备的型号为 ST936701SS,则该设备匹配该 匹配键。
               在一条规则中,可以设定最多五条 SYSFS 的 匹配键。
ENV{key}:          环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键。
PROGRAM:        调用外部命令。
RESULT:           外部命令 PROGRAM 的返回结果。


3、udev 的重要赋值键 

NAME:           在 /dev下产生的设备文件名。只有第一次对某个设备的 NAME 的赋值行为生效,之后匹配的规则再对该设备的 NAME 赋值行为将被忽略。如果没有任何规则对设备的 NAME 赋值,udev 将使用内核设备名称来产生设备文件。
SYMLINK:          为 /dev/下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接。
OWNER, GROUP, MODE:  为设备设定权限。
ENV{key}:         导入一个环境变量。


4、udev 的值和可调用的替换操作符 

Linux 用户可以随意地定制 udev 规则文件的值。例如:my_root_disk, my_printer。同时也可以引用下面的替换操作符:
$kernel, %k:        设备的内核设备名称,例如:sda、cdrom。
$number, %n:        设备的内核号码,例如:sda3 的内核号码是 3。
$devpath, %p:       设备的 devpath路径。
$id, %b:          设备在 devpath里的 ID 号。
$sysfs{file}, %s{file}:     设备的 sysfs里 file 的内容。其实就是设备的属性值。<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值