背景:
昨天在gnome的一个panel上加了几个disk Mounter的按钮,每个都有一个设置的界面,需要设mount的位置,
当Mouse点击时,disk mounter会调用mount程序,具体mount什么设置由/etc/fstab来决定,
/dev/hde1 /media/ms0 vfat user,sync,noauto,uni_xlate 0 0/dev/hdg1 /media/cf0 vfat user,sync,noauto,uni_xlate 0 0
当MS插入系统时,系统发现他是一个BLOCK设备,于是就在/hde开始找第一个安全空闲的盘符,同样CF插入的情况也类似,
这里有一个问题,当CF先插入时,系统会把/dev/hde1分配给它。此时对应的关系就发生了混乱。
为了解决这个问题可以使用Linux2.6kernel的UDEV规则。
udev规则简介
关于这个规则,有一篇很经典的英文说明 http://www.reactivated.net/writing_udev_rules.Html
udev是一种Linux2.6内核采用的/dev 目录的管理系统,它通过从sysfs获得的信息,可以提供对特定设备的固定的设备名。
sysfs是linux 2.6内核的一种新型文件系统,它提供了当前设备的基本信息。
udev的一个重要目的就是提供固定的设备名,像我们刚才碰到的情况,如果ms插入系统,系统能使用固定的设备名
(例如/dev/ms) CF卡插入系统,使用/dev/cf,就可以很方便的解决我们需要到的困难。
/etc/udev/rules.d/ 下面的文件根据字母的顺序来解析,一般udev当找到满足它条件的说明项后就会终于解析过程,
因为为了使用我们的配置优先于系统的默认值,选择文件名时一定要注意,例如,我们选择 /etc/udev/rule.d/10-local.rules
BUS="usb", SYSFS{serial}="HXOLL0012202323480", NAME="lp_epson", SYMLINK="printers/epson_stylus"
上面是一个USB打印机的印子。当一台USB打印机序列号是HXOLL0012202323480,就会创建一个device名 /dev/lpepson,
同时创建一个symbol link /dev/printers/epson_styles
注意:在任何规则修改后,为了让它生效:需要执行udevstart
规则书写格式
最方便的查找方法是 man udev 或在线文档 http://www.die.net/doc/linux/man/man8/udev.8.html
常用的有
* BUS - 匹配总路类型,比如PCI USB等 * KERNEL - 匹配Kernel设备名,比如hda hdb. * DRIVER - 匹配Kernel的驱动程序名 * SUBSYSTEM - 匹配子系统名。 * ID - 匹配总路系统的ID (e.g. PCI bus ID)。 * PLACE - 匹配物理位置 (对USB很有用)。 * SYSFS{filename} - 匹配从sysfs得到的信息,比如label, vendor, USB serial number, SCSI UUID or file system label. * PROGRAM - 调用外部程序。 * RESULT - 匹配最后一次调用外部程序所得到的返回字符串 * NAME - 需要创建的设备或 * SYMLINK -需要创建的符号链接名 * OWNER, GROUP, MODE 设置设备的所有者,组,及模式
匹配符号:
%n 内核设备号 例如 sda3 的3 %k 内核设备名 %M 设备的major号 %m 设备的minor号 %b bus id %c %s{filename} sysfs属性的内容 %% 引用%时使用 * 可以匹配任意个字符 ? 可以匹配一个字符 [ ] 从中选一个字符sample:
[1] [2] 下一页
# if /sbin/scsi_id returns "OEM 0815" device will be called disk1BUS="scsi", PROGRAM="/sbin/scsi_id", RESULT="OEM 0815", NAME="disk1"# USB printer to be called lp_colorBUS="usb", SYSFS{serial}="W09090207101241330", NAME="lp_color"# SCSI disk with a specific vendor and model number will be called bootBUS="scsi", SYSFS{vendor}="IBM", SYSFS{model}="ST336", NAME="boot%n"# sound card with PCI bus id 00:0b.0 to be called dspBUS="pci", ID="00:0b.0", NAME="dsp"# USB mouse at third port of the second hub to be called mouse1BUS="usb", PLACE="2.3", NAME="mouse1"# ttyUSB1 should always be called pda with two additional symlinksKERNEL="ttyUSB1", NAME="pda", SYMLINK="palmtop handheld"# multiple USB webcams with symlinks to be called webcam0, webcam1, ……BUS="usb", SYSFS{model}="XV3", NAME="video%n", SYMLINK="webcam%n"
查看sysfs的信息
这里使用udevinfo的指令, man udevinfo 在线文档http://www.die.net/doc/linux/man/man8/udevinfo.8.html 基本用法
-a SYSFS{filename} attributes along the device chain. -p sysfs_path Specify the sysfs path of the device to query. -q query_type Query the database for specified value of a created device node or network interface. valid type: name, symlink, mode ,owner , group , path or all. -n name Specify the name of the node, the symlink or the network interface for the device to queue sample:
udevinfo -a -p /sys/path/to/hardware/info udevinfo -a -p /sys/block/sda udevinfo -q path -n /dev/sda 联起来用: # udevinfo -a -p $(udevinfo -q path -n /dev/sda)
测试方法
# udevtest /sys/class/sound/dsp/version 056looking at '/class/sound/dsp/'opened class_dev->name='dsp'configured rule in '/etc/udev/rules.d/50-udev.rules[132]' applied, added symlink '%k'configured rule in '/etc/udev/rules.d/50-udev.rules[132]' applied, 'dsp' becomes 'sound/%k'creating device node '/dev/sound/dsp', major = '14', minor = '3', mode = '0660', uid = '0', gid = '18'
实际的例子
010_local.rules
#Clie th55#syncBUS="usb", SYSFS{prodUCt}="Palm Handheld", KERNEL="ttyUSB*", SYMLINK="pilot%n"#eXPortBus="usb", SYSFS{product}="Sony PEG Mass Storage", KERNEL="sd*",SYMLINK="cliems"#usb HDDBUS="usb", SYSFS{product}="USB TO IDE", KERNEL="sd*", SYMLINK="usbhdd%n"#cf1 used for 5in1 card readerBUS="ide", ID="2.0", KERNEL="hd*", SYMLINK="ms"]
(出处:http://www.sheup.com)
(出处:http://www.sheup.com)