Udev管理设备
一、udev特点
1、udev是一种工具,它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。
2、使用udev后,在/dev/目录下就只包含系统中真正存在的设备
3、与设备主/从编号无关
4、提供持续的设备命名
5、Udev是硬件平台无关的,属于user space 的进程,它脱离驱动层的关联而建立在操作系统之上。
6、遵循linux Standard Base (LSB) 设备命名方法,但也可以自定义命名。
7、非常轻量级
Udev只支持linux-2.6以上的内核,因为udev严重依赖于sysfs文件系统提供的信息,而sysfs文件系统只在linux-2.6以上的内核才有。Udev运行在用户模式中是一个用户程序,而devfs运行在内核是一个内核模块。Udev能够实现所有devfs实现功能。Udev通过对内核产生的设备名增加别名的方式来达到不管设备连接顺序而维持一个统一的设备名的目的。Udev是用户模式程序,不会更改内核的行为。内核依然会我行我素地产生设备名,但udev可以根据设备的期它信息如总线(BUS),生产商(vendor)等不同来区分不同的设备,并产生设备文件。
二、udev原理和结构
1、当udev从kernel收到设备add/remove事件后,udev将解析:
/etc/udev/rules.d/目录中的用户自定义规则文件。
使用自定义规则输出(可选)。
从/sys中查询相应的信息。
2、据解析的信息,udev汇集了:
处理设备命名
确定将创建什么设备文件(device file)或符号链接(symlink)
确定如何设备文件属性。
确定后续操作
传统上Linux系统使用创建静态设备文件的方法来管理系统硬件,因此在/dev 目录下创建了大量的设备文件(有时会有数千个文件),而不管对应的硬件设备实际上是否存在。这些操作通常是由 MAKEDEV脚本完成的,这个脚本包含许多调用mknod 程序的命令,为这个世界上可能存在的每个设备创建相应的主设备号和次设备号。而使用 udev 方式的时候,只有被内核检测到的设备才为其创建设备文件。因为每次系统启动的时候都要重新创建这些设备节点,所以它们被存储在tmpfs 文件系统(一种完全存在于内存里,不占用任何磁盘空间的文件系统)上,设备文件不需要很多磁盘空间,所占用的内存可以忽略不计。
devfs 存在的主要的问题是它处理设备检测、创建和命名的方式,其中设备节点的命名可能是最严重的问题。一般可接受的方式是,如果设备名是可配置的,那么设备命名策略应该由系统管理员决定,而不是由某些开发者强制规定。devfs 文件系统还存在竞争条件(raceconditions)的问题,这是它天生的设计缺陷,不对内核做彻底的修改就无法修正这个问题。因为近来缺乏维护,它已经被标记为deprecated(反对的)。
对于已经编入内核的驱动程序,当被内核检测到的时候,会直接在 sysfs 中注册其对象;对于编译成模块的驱动程序,当模块载入的时候才会这样做。一旦挂载了 sysfs 文件系统(挂载到 /sys), 内建的驱动程序在 sysfs 注册的数据就可以被用户空间的进程使用,并提供给 udev 以创建设备节点。udev通过系统调用函数libsysfs得到设备的相应信息比如本地名、设备主/从号等等。
udev初始化脚本负责在 Linux 启动的时候创建设备节点(RedHatLinux 中该脚本为/sbin/start_udev),该脚本首先将注册一个热插拔事件处理程序(Redhat Linux 中该程序为 /sbin/udevd)。热插拔事件本不应该在这个阶段发生,注册 udev 只是为了以防万一。然后 udev初始化脚本遍历 /sys 文件系统,并在 /dev目录下创建符合描述的设备。例如/sys/class/tty/tty1/dev 里含有"4:1"字符串,udev初始化脚本就根据这个字符串创建主设备号为 4 、次设备号为 1 的 /dev/tty1设备。创建的每个设备的名字和权限由/etc/udev/rules.d/ 目录下的文件指定的规则来设置,这些文件以类似于 LFS 启动脚本风格的编号。如果 udev找不到所创建设备的权限文件,就将其权限设置为缺省的660 ,所有者为 root:root。在RedHat Linux系统中略有不同,具体请参看/sbin/start_udev脚本。
三、配置udev
四、udev规则
1、文件名位置及命名方法
默认放置在/etc/udev/rules.d目录下
临时规则/dev/.udev/rules.d/
命名为<rule_name>.rules
2、规则结构
ACTION=="add",SUBSYSTEM=="mmc", RUN+="modprobe mmc_block"
ACTION=="add",KERNEL=="sda", RUN+="/bin/raw/dev/raw/raw1 %N"
3、规则文件将在第一次预读后缓冲
当规则文件被修改后时间戳的更新会强制udev从读规则文件,如果想强制重读可以使用touch命令更新时间戳。
4、Udev不会因为找到匹配的规则而停止运行,它会继续寻找并尝试应用每一条它所能识别的规则。
五、udev关键字
1、运算符
== 比较以判断相等
!= 比较以判断不符
2、关键字示例
ACTION==”add”
KERNEL==”sd[a-z]1”
BUS==”scsi”
DRIVER!=”ide-cdrom”
SYSFS{prod_id1}==”IBM”
PROGRAM==”check-cdrom.sh%k CD-R”
SYSLINK+=”cdwriter cdwriter-%k cdrw cdrw-%k”
3、udev 关键字文档
man 7 udev
/usr/share/doc/udev-095/writing_udev_rules/index.html
常用关键字
大多领域支持的模式匹配形式
六、查询udev匹配键值
1、网卡
2、硬盘信息
3、硬盘大小
4、查看设备信息
如果是查看硬盘设置目录为/sys/block/下,
七、udev规则赋值
1、运算符
= 给一个键赋值,它将覆盖之前的赋值
+= 给一个键追加值
:= 最后赋值给键;禁止其后任何变动,也就是防止之后的规则改动这个键值。
2、关键字
八、udev规则置换
1、udev 具有类似printf的字符转换功能
2、能简化和省略规则
3、支持NAME、SYSMLINK、PROGRAM、OWNER、GROUP和RUN关键。
九、实验
1、BUS=="usb", ATTRS{serial}=="AA00000000001786",ATTRS{product}=="Lovely Attache", NAME="myusb%n",RUN+="/usr/bin/wall 1234"
2、BUS=="usb", ATTRS{serial}=="AA00000000001786",ATTRS{product}=="Lovely Attache", NAME="myusb%n",RUN="/bin/sh /root/hello.sh"
3、自动加载usb设备
KERNEL=="sd[a-z]", NAME="%k", SYMLINK+="usb%m",GROUP="users", OPTIONS="last_rule"
ACTION=="add", KERNEL=="sd[a-z][0-9]",SYMLINK+="usb%n", GROUP="users", NAME="%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]",RUN+="/bin/mkdir -p /mnt/usb%n"
ACTION=="add", KERNEL=="sd[a-z][0-9]",PROGRAM=="/lib/udev/vol_id -t %N", RESULT=="vfat",
RUN+="/bin/mount -t vfat -orw,noauto,sync,dirsync,noexec,nodev,noatime,dmask=000,
fmask=111 /dev/%k/mnt/usb%n", OPTIONS="last_rule"
ACTION=="add", KERNEL=="sd[a-z][0-9]",RUN+="/bin/mount -t auto -o rw,noauto,sync,dirsync,
noexec,nodev,noatime/dev/%k /mnt/usb%n", OPTIONS="last_rule"
ACTION=="remove", KERNEL=="sd[a-z][0-9]",RUN+="/bin/umount -l /mnt/usb%n"
ACTION=="remove", KERNEL=="sd[a-z][0-9]",RUN+="/bin/rmdir /mnt/usb%n", OPTIONS="last_rule"
转载于:https://blog.51cto.com/slhappylife/1334098