用户名: 密码: 忘记密码? 注册

udev配置

作者:  时间: 2010-11-30
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创建的设备文 件。赋值键可以处理一个多值列表。匹配键和赋值键操作符解释见下表:


                       udev 键/值对操作符
操作符     匹配或赋值t                         解释
----------------------------------------
  ==            匹配              相等比较
  !=            匹配             不等比较
  =            赋值              分配一个特定的值给该键,他可以覆盖之前的赋值。
  +=      赋值              追加特定的值给已经存在的键
  :=            赋值                  分配一个特定的值给该键,后面的规则不可能覆盖它。


这有点类似我们常见的编程语言,比如C语言。只是这里的键一次可以处理多个值。有一些键在udev规则文件里经常出现,这些键的值可以使用通配符(*,?,甚至范围,比如[0-9]),这些常用键列举如下:


常用udev键
键        含义
ACTION         一个时间活动的名字,比如add,当设备增加的时候
KERNEL         在内核里看到的设备名字,比如sd*表示任意SCSI磁盘设备
DEVPATH       内核设备录进,比如/devices/*
SUBSYSTEM       子系统名字,比如sound,net
BUS         总线的名字,比如IDE,USB
DRIVER         设备驱动的名字,比如ide-cdrom
ID           独立于内核名字的设备名字
SYSFS{ value}       sysfs属性值,他可以表示任意
ENV{ key}       环境变量,可以表示任意
PROGRAM       可执行的外部程序,如果程序返回0值,该键则认为为真(true)
RESULT         上一个PROGRAM调用返回的标准输出。
NAME         根据这个规则创建的设备文件的文件名。注意:仅仅第一行的NAME描述是有效的,后面的均忽略。
                                  如果你想使用使用两个以上的名字来访问一个设备的话,可以考虑SYMLINK键。
SYMLINK       根据规则创建的字符连接名
OWNER         设备文件的属组
GROUP         设备文件所在的组。
MODE         设备文件的权限,采用8进制
RUN         为设备而执行的程序列表
LABEL         在配置文件里为内部控制而采用的名字标签(下下面的GOTO服务)
GOTO         跳到匹配的规则(通过LABEL来标识),有点类似程序语言中的GOTO
IMPORT{ type}     导入一个文件或者一个程序执行后而生成的规则集到当前文件
WAIT_FOR_SYSFS   等待一个特定的设备文件的创建。主要是用作时序和依赖问题。
PTIONS         特定的选项: last_rule 对这类设备终端规则执行; ignore_device 忽略当前规则; ignore_remove 忽略接下来的并移走请求。
           all_partitions 为所有的磁盘分区创建设备文件。


我们给出一个列子来解释如何使用这些键。下面的例子来自Fedora Core 5系统的标准配置文件。

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"

上面的例子给出了5个规则,每一个都是KERNEL或者ACTION键开头:

*第一个规则是缺省的,他匹配任意被内核识别到的设备,然后设定这些设备的属组是root,组是root,访问权限模式是0600(-rw-------)。这也是一个安全的缺省设置保证所有的设备在默认情况下只有root可以读写。
*第二个规则也是比较典型的规则了。它匹配终端设备(tty),然后设置新的权限为0600,所在的组是tty。它也设置了一个特别的设备文件名:%K。在这里例子里,%k代表设备的内核名字。那也就意味着内核识别出这些设备是什么名字,就创建什么样的设备文件名。

*第三行开始的KERNEL=="scd[0-9]*",表示 SCSI CD-ROM 驱动. 它创建一对设备符号连接:cdrom和cdrom-%k。

*第四行,开始的 KERNEL=="hd[a-z]", 表示ATA CDROM驱动器。这个规则创建和上面的规则相同的符号连接。ATA CDROM驱动器需要sysfs值以来区别别的ATA设备,因为SCSI CDROM可以被内核唯一识别。.

*第五行以 ACTION=="add"开始,它告诉udev增加 /sbin/modprobe sg 到命令列表,当任意SCSI设备增加到系统后,这些命令将执行。其效果就是计算机应该会增加sg内核模块来侦测新的SCSI设备。

当然,上面仅仅是一小部分例子,如果你的系统采用了udev方式,那你应该可以看到更多的规则。如果你想修改设备的权限或者创建信的符号连接,那么你需要熟读这些规则,特别是要仔细注意你修改的那些与之相关的设备。

修改你的udev配置

在修改udev配置之前,我们一定要仔细,通常的考虑是:你最好不要修改系统预置的那些规则,特别不要指定影响非常广泛的配置,比如上面例子中的第一行。不正确的配置可能会导致严重的系统问题或者系统根本就无法这个正确的访问设备。

而 我们正确的做法应该是在/etc/udev/rules.d/下创建一个信的规则文件。确定你给出的文件的后缀是rules文件名给出的数字序列应该比标 准配置文件高。比如,你可以创建一个名为99-my-udev.rules的规则文件。在你的规则文件中,你可以指定任何你想修改的配置,比如,假设你修 改修改floppy设备的所在组,还准备创建一个信的符号连接/dev/floppy,那你可以这么写:
KERNEL=="fd[0-9]*", GROUP="users",   SYMLINK+="floppy"


有些发行版本,比如Fedora,采用了外部脚本来修改某些特定设备的属组,组关系和权限。因此上面的改动可能并不见得生效。如果你遇到了这个问题,你就需要跟踪和修改这个脚本来达到你的目的。或者你可以修改PROGRAM或RUN键的值来做到这点。

某些规则的修改可能需要更深的挖掘。比如,你可能想在一个设备上使用sysfs信息来唯一标识一个设备。这些信息最好通过udevinfo命令来获取。
$ udevinfo –a –p $(udevinfo –q path  –n /dev/hda)

上 面的命令两次使用udevinfo:一次是返回sysfs设备路径(他通常和我们看到的Linux设备文件名所在路径--/dev/hda--不同);第 二次才是查询这个设备路径,结果将是非常常的syfs信息汇总。你可以找到最够的信息来唯一标志你的设备,你可以采用适当的替换udev配置文件中的 SYSFS选项。下面的结果就是上面的命令输出

[root@localhost rules.d]# udevinfo -a -p $(udevinfo -q path    -n  /dev/hda1)

Udevinfo starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

 looking at device '/block/hda/hda1':
   KERNEL=="hda1"
   SUBSYSTEM=="block"
   DRIVER==""
   ATTR{stat}=="    1133     2268        2        4"
   ATTR{size}=="208782"
   ATTR{start}=="63"
   ATTR{dev}=="3:1"

 looking at parent device '/block/hda':
   KERNELS=="hda"
   SUBSYSTEMS=="block"
   DRIVERS==""
   ATTRS{stat}=="   28905    18814  1234781   302540    34087   133247   849708   981336        0   218340  1283968"
   ATTRS{size}=="117210240"
   ATTRS{removable}=="0"
   ATTRS{range}=="64"
   ATTRS{dev}=="3:0"

 looking at parent device '/devices/pci0000:00/0000:00:1f.1/ide0/0.0':
   KERNELS=="0.0"
   SUBSYSTEMS=="ide"
   DRIVERS=="ide-disk"
   ATTRS{modalias}=="ide:m-disk"
   ATTRS{drivename}=="hda"
   ATTRS{media}=="disk"

 looking at parent device '/devices/pci0000:00/0000:00:1f.1/ide0':
   KERNELS=="ide0"
   SUBSYSTEMS==""
   DRIVERS==""

 looking at parent device '/devices/pci0000:00/0000:00:1f.1':
   KERNELS=="0000:00:1f.1"
   SUBSYSTEMS=="pci"
   DRIVERS=="PIIX_IDE"
   ATTRS{broken_parity_status}=="0"
   ATTRS{enable}=="1"
   ATTRS{modalias}=="pci:v00008086d000024CAsv0000144Dsd0000C009bc01sc01i8a"
   ATTRS{local_cpus}=="1"
   ATTRS{irq}=="11"
   ATTRS{class}=="0x01018a"
   ATTRS{subsystem_device}=="0xc009"
   ATTRS{subsystem_vendor}=="0x144d"
   ATTRS{device}=="0x24ca"
   ATTRS{vendor}=="0x8086"

 looking at parent device '/devices/pci0000:00':
   KERNELS=="pci0000:00"
   SUBSYSTEMS==""
   DRIVERS==""


举 一个例子:假设你想修改USB扫描仪的配置。通过一系列的尝试,你已经为这个扫描仪标识了Linux设备文件(每次打开扫描仪时,名字都会变)。你可以使 用上面的命令替换这个正确的Linux设备文件名,然后定位输出的采用SYSFS{idVendor}行和SYSFS{idProduct}行。最后你可 以使用这些信息来为这个扫描仪创建新的选项。


SYSFS{idVendor}=="0686", \

SYSFS{idProduct}=="400e", \

SYMLINK+="scanner", MODE="0664", \

group="scanner"

上面的例子表示将扫描仪的组设置为scanner,访问权限设置为0664,同时创建一个/dev/scanner的符号连接。