当前位置:Linux教程 - Linux资讯 - 使用固定的设备名 (通过书写Udev规则)

使用固定的设备名 (通过书写Udev规则)

  背景:

  昨天在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)


上一页 [1] [2] 

(出处:http://www.sheup.com)


上一页 [1] [2] [3]