root@wang:/work/7405/trunk2/release/vender/cdma2000/udev/etc/udev# cat udev.conf
# 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"
调试时将udev_log="err"改为udev_log="info" ,这样看以看到更多的日志信息。同理,debug可以看到比info更多的调试信息。
udev_root指定设备节点的位置。
udev_rules="/etc/udev/rules.d/" 指定udev规则的目录。udev会根据规则的名字依次查找,直到找到正确的规则。
写udev规则是需要使用udevinfo工具查看相关的信息:
udevinfo -q path -n /dev/sda,命令会产生一个该设备名对应的在sysfs下的路径,如/block/sda。然后,再用udevinfo -a -p /sys/block/sda,这个命令会显示一堆信息,信息分成很多块。这些信息实际来自于操作系统维护的sysfs链表,不同的块对应不同的路径。你就可以用这些信息来作为udev规则文件中的匹配项。但需要注意的是,同一个规则只能使用同一块中显示的信息,不能跨块书写规则。也可以使用一条命令udevinfo –a –p $(udevinfo –q path –n /dev/hda)
第二种情况是,不知道系统产生的设备名,那就只有到/sys目录下去逐个目录查找了,反复用udevinfo -a -p /sys/path...这个命令看信息,如果对应的信息是这个设备的,那就恭喜你。否则就再换个目录。当然,在这种情况下,成功的可能性比较小
root@wang:/work/7405/trunk2/release/vender/cdma2000/udev/etc/udev/rules.d# cat 9-cdma2000.rules
ACTION=="add",KERNEL=="sg[0-9]",ATTRS{idProduct}=="1446",ATTRS{idVendor}=="12d1",NAME="%k",RUN+="/usr/local/bin/usb_modeswitch -c /etc/usb-modeswitch.d/usb_modeswitch.conf"
ACTION=="add",KERNEL=="ttyUSB[0-9]",ATTRS{idVendor}=="12d1",ATTRS{idProduct}=="140c",RUN+="/etc/ppp/cdma.sh"
这个规则的意思就是如果发现内核设备名为sg0-sg9的设备,并且idProduct=="1446", idVendor=="12d1"的设备加入的话运行/usr/local/bin/usb_modeswitch -c /etc/usb-modeswitch.d/usb_modeswitch.conf 这条命令。这条命令的作用就是将KERNEL=="sg[0-9]",ATTRS{idProduct}=="1446",ATTRS{idVendor}=="12d1"属性改为KERNEL=="ttyUSB[0-9]",ATTRS{idVendor}=="12d1",ATTRS{idProduct}=="140c",这条属性。接下来符合下面的这条规则,就执行/etc/ppp/cdma.sh 脚本。
/etc/ppp/cdma.sh脚本是这样写的:
root@wang:/work/7405/trunk2/release/vender/cdma2000/pppd/etc.ppp# cat cdma.sh
#!/bin/sh
#dial
killall pppd
mkdir -p /var/lock/
mkdir -p /var/run/
echo "\nhello pppd \n"
sleep 20 && /usr/local/bin/pppd call cdma2000&
基本上就是pppd拨号,pppd拨号是会有一些错误,会打不开 /var/lock/ /var/run/这两个目录,就手工建立了两个。然后sleep 20秒,如果不sleep的话会拨号失败,原因不明。
有一点需要注意的是在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 为所有的磁盘分区创建设备文件。
阅读(7375) | 评论(0) | 转发(0) |