成一个或多个匹配部分和赋值部分。匹配部分用匹配专用的关键字来表示,相应的赋值部分用赋值专用的
关键字来表示。匹配关键字包括: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序号(如存储设备的分区号)。
早期的linux的/dev目录下有一大堆设备文件,不管你的主机上是否有这些设备,相当于提供一个标准接口,比如 /dev/sda 一般表示 SISC 盘第一块磁盘,但你主机上即使没有这种磁盘,/dev/sda还是存在于是,这就有个问题:/dev/下会有很多实际上并不需要的文件,尽管这些文件占用不了多少空间(都是一字节的大小)
后来linux只在/dev上保留一些必要的设备文件,比如 /dev/console (表示控制台)等,其它的由udev在系统启动时检测并加载,比如 如果扫描到你有 SISC 设备(包括U盘)就在 /dev/下增加一个设备文件,比如 /dev/sda ,换句话说,有udev的前提下,/dev下的设备文件,就表示你的主机真的有这个设备
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)