成一个或多个匹配部分和赋值部分。匹配部分用匹配专用的关键字来表示,相应的赋值部分用赋值专用的
关键字来表示。匹配关键字包括:ACTION(行为)、KERNEL(匹配内核设备名)、BUS(匹配总线类
型)、SUBSYSTEM(匹配子系统名)、ATTR(属性)等,赋值关键字包括:NAME(创建的设备文件
名)、SYMLINK(符号创建链接名)、OWNER(设置设备的所有者)、GROUP(设置设备的组)、
IMPORT(调用外部程序)、MODE(节点访问权限)等。
例如,如下规则:
SUBSYSTEM=="net"
, ACTION=="add"
, DRIVERS==" *"
, ATTR{address}=="08:00:27:35:be:ff"
,
ATTR{dev_id}=="0x0"
, ATTR{type}=="1"
, KERNEL=="eth*"
, NAME="eth1"
其中的“匹配”部分包括SUBSYSTEM、ACTION、ATTR、KERNEL等,而“赋值”部分有一项,是
NAME。这个规则的意思是:当系统中出现的新硬件属于net子系统范畴,系统对该硬件采取的动作
是“add”这个硬件,且这个硬件的“address”属性信息等于“08:00:27:35:be:ff”
,
“dev_id”属性等
于“0x0”
、
“type”属性为1等,此时,对这个硬件在udev层次施行的动作是创建/dev/eth1。
通过一个简单的例子可以看出udev和devfs在命名方面的差异。如果系统中有两个USB打印机,一个可
能被称为/dev/usb/lp0,另外一个便是/dev/usb/lp1。但是到底哪个文件对应哪个打印机是无法确定的,
lp0、lp1和实际的设备没有一一对应的关系,映射关系会因设备发现的顺序、打印机本身关闭等而不确
定。因此,理想的方式是两个打印机应该采用基于它们的序列号或者其他标识信息的办法来进行确定的映
射,devfs无法做到这一点,udev却可以做到。使用如下规则:
SUBSYSTEM="usb"
,ATTR{serial}="HXOLL0012202323480"
,NAME="lp_epson"
,SYMLINK+="printers/
epson_stylus"
该规则中的匹配项目有SUBSYSTEM和ATTR,赋值项目为NAME和SYMLINK,它意味着当一台USB
打印机的序列号为“HXOLL0012202323480”时,创建/dev/lp_epson文件,并同时创建一个符号链
接/dev/printers/epson_styles。序列号为“HXOLL0012202323480”的USB打印机不管何时被插入,对应的设
备名都是/dev/lp_epson,而devfs显然无法实现设备的这种固定命名。
udev规则的写法非常灵活,在匹配部分,可以通过“*”
、
“?”
、[a~c]、[1~9]等shell通配符来灵活匹配
多个项目。
*类似于shell中的*通配符,代替任意长度的任意字符串,?代替一个字符。此外,%k就是
KERNEL,%n则是设备的KERNEL序号(如存储设备的分区号)。
udev 不是多路径,是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。它同时也是用来接替devfs及hotplug的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载firmware时。udev的最新版本依赖于升级后的Linux kernel 2.6.13的uevent接口的最新版本。使用新版本udev的系统不能在2.6.13以下版本启动,除非使用noudev参数来禁用udev并使用传统的/dev来进行设备读取。Linux 传统上使用静态设备创建方法,因此大量设备节点在 /dev 下创建(有时上千个),而不管相应的硬件设备是否真正存在。通常这由一个MAKEDEV脚本实现,这个脚本包含了许多通过世界上(有幽默意味,注)每一个可能存在的设备相关的主设备号和次设备号对mknod程序的调用。采用udev的方法,只有被内核检测到的设备才会获取为它们创建的设备节点。因为这些设备节点在每次系统启动时被创建,他们会被贮存在ramfs(一个内存中的文件系统,不占用任何磁盘空间).设备节点不需要大量磁盘空间,因此它使用的内存可以忽略。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)