Chinaunix首页 | 论坛 | 博客
  • 博客访问: 526378
  • 博文数量: 197
  • 博客积分: 2071
  • 博客等级: 上尉
  • 技术积分: 1307
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-02 09:49
个人简介

prothes 专注嵌入式的ARM linux

文章分类

全部博文(197)

文章存档

2014年(3)

2013年(16)

2012年(108)

2011年(70)

分类: LINUX

2011-11-09 10:32:47

传统的devfs需要在/dev下预先创建设备节点,再由应用空间通过其访问设备文件;而2.6的因udev机制可动态创建,并可同时创建其符号链
接,并执行一系列动作,这就是udev规则文件。缺省的文件为/etc/udev/rules.d/50-udev.rules,我们可以创建自己的规则文件,如:/etc/udev/rules.d/10-local.rules
(1)基本规则(参照Writing udev rules:http://www.reactivated.net/writing_udev_rules.html#syntax)
设备匹配通过“==”去查询,命名则由“=”去完成。
KERNEL=="hdb", NAME="my_spare_disk"
设备的内核中名称为hdb,但其在/dev下的名称将为my_spare_disk,即/dev/my_spare_disk会被动态创建
KERNEL=="hdb", DRIVER=="ide-disk", SYMLINK+="sparedisk"
内核名称为hdb、驱动为ide-disk的设备,其在/dev下的名称将为缺省值(应该与内核名称同名?),符号链接即/dev/sparedisk会被创建。
KERNEL=="hdc", SYMLINK+="cdrom cdrom0"
创建2个符号链接:/dev/cdrom and /dev/cdrom0
为了更准确地匹配设备,还可使用sysfs中的属性匹配设备。使用命令udevinfo -a -p /sys/bloc/sda查看设备属性。
KERNEL=="mice", NAME="input/%k"
KERNEL=="loop0", NAME="loop/%n", SYMLINK+="%k"
第一行%k匹配内核名称,结果为:/dev/input/mice
第二行%n匹配设备序号,结果为:/dev/loop/0, 并创建符号链接/dev/loop0至它
其他匹配:*(0或多个任意字符),?(一个字符) [](字符范围):
KERNEL=="fd[0-9]*", NAME="floppy/%n", SYMLINK+="%k"
KERNEL=="hiddev*", NAME="usb/%k"
上述都是在udev规则文件里固定的。我们也可以使用别的方式更灵活地命名,如使用一个程序/bin/my_device_namer去生成程序。当设备连接上时,该程序被执行,生成设备文件名:
KERNEL=="hda", PROGRAM="/bin/device_namer %k", SYMLINK+="%c"
KERNEL=="hda", PROGRAM="/bin/device_namer %k", NAME="%c{1}", SYMLINK+="%c{2}" #有2列,取不同的值?
KERNEL=="hda", PROGRAM="/bin/device_namer %k", NAME="%c{1}", SYMLINK+="%c{2+}"
(2)设备动作
当设备被连接或断开连接时,可以:
KERNEL=="sdb", RUN+="/usr/bin/my_program"
my_program必须是可执行的。为脚本时,脚本开头必须指定执行shell:如#!/bin/sh,而且它不在任何shell上下文中执行。
udev环境变量。当该udev环境变量设置为yes时,才创建符号链接。
KERNEL=="fd0", ENV{an_env_var}=="yes", SYMLINK+="floppy"
(3)应用实例
当ACTION变量为add和remove时,意味着连接和断开连接,可对于插上和拔掉的动作:
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mkdir -p /storage/usb/%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mount -t auto -o rw,locale=zh_CN.UTF-8,noauto,sync,dirsync,noexec,nodev,noatime /dev/%k /storage/usb/%k"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/umount /dev/%k"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rm -rf /storage/usb/%k"
ACTION=="add", KERNEL=="mmcblk0[p][0-9]", RUN+="/bin/mkdir -p /c2-media/sd/%k"
ACTION=="add", KERNEL=="mmcblk0[p][0-9]", RUN+="/bin/mount -t auto -o rw,locale=zh_CN.UTF-8,noauto,sync,dirsync,noexec,nodev,noatime /dev/%k /c2-media/sd/%k"
ACTION=="remove", KERNEL=="mmcblk0[p][0-9]", NAME="%k", "RUN+="/bin/umount /dev/%k"
ACTION=="remove", KERNEL=="mmcblk0[p][0-9]", RUN+="/bin/rm -rf /c2-media/sd/%k"
并参照“udev详解”http://blog.csdn.net/xianfengdesign/archive/2007/10/16/1827892.aspx
http://blog.csdn.net/xianfengdesign/archive/2007/10/16/1827892.aspx
配置/etc/udev/udev.conf文件:
udev_root="/dev/"
udev_rules="/etc/udev/rules.d/"
udev_log="err"
但重启系统后,插拔u盘未挂载。但内核已将其usb设备信息识别出。
可能原因是,内核版本号不够?我们的内核是2.6.14的,据文档http://wiki.archlinux.org/index.php/Udev_(简体中文)所述 需要2.6.15
or above以上内核.另外也需udevd及udevtrigger等程序,而板子上没有的。参见:udev文件系统的使用和基本工作原理分析

阅读(939) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~