传统的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文件系统的使用和基本工作原理分析http://www.voos.org.cn/html/76/n-476.html |
udev规则及其实例
原创protheschildren 博主文章分类:LINUX ©著作权
文章分类
©著作权归作者所有:来自51CTO博客作者protheschildren的原创作品,请联系作者获取转载授权,否则将追究法律责任
下一篇:Qt4之保存窗体状态
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Java实现基于清除后分配规则的垃圾回收器及其实现原理
Java实现基于清除后分配规则的垃圾回收器及其实现原理
垃圾回收器 java 递归 -
小何讲Linux: 文件锁及其实例
Linux中软件、硬件资源都是文件(一切皆文件),文件在多用户环境中是可共享的。文件锁是=
文件锁 读锁 写锁 fcntl 共享互斥