vimer linux kernel 爱好者

udev的编写

2016-08-16

这篇文章在分类的时候让我犹豫了一下,我想还是归到kernel的类别下。

udev是干什么的

在linux kernel 2.6中,内核引入了一种新的机制,该机制可以动态的监控/dev目录下 的设备,原来的实现/dev的监控功能的 devfs被抛弃了。这篇文章也就是简单的记录下,详细的情况请参考这篇文章 udev

基本概念

在linux系统中,/dev目录是存储设备节点的,每一个设备节点都指向了一个设备,用户空间的应用程序可以使用这些设备节点来交互硬件设备,例如,X server 就是监听 /dev/input/mice来反映鼠标的运动的。

udev

devfs只是可以展示这些信息,无法提供一个合适的方法去修改这些问题,/udev的引入,就是解决这类问题的。解决的方法是根据用户向/sysfs提供的规则(rules),udev在 /dev目录下产生对应的设备节点。

sysfs

sysfs被内核使用,导出插入内核最基本的设备信息。udev就是根据这些信息来创造设备节点,sysfs被悬挂在/sys目录下。

udev的强大如下:

  1. 重新命名一个设备节点

  2. 提供一个可代替或者不变的名字对于一个设备

  3. 由一个程序的输出结果就可以命名一个设备节点

  4. 改变一个设备节点的权限

  5. 启动一个脚本当一个设备节点被创造或者删除时

  6. 重命名一个网络接口

提供一种不因设备变换、设备节点而变化的机制,具有很重要的作用。具体来讲,就是让用户可以辨认出自己需要的设备。下面是我的笔记本中存储设备的节点(没有插U盘),注意我使用的命令:

udev-1.png

下面这幅图片是我插入一个U盘的显示:注意中间的usb-genereic-

udev-2.png

由此可以看出,同一个设备有两个不同的名称?我的u盘正好是两个分区,ata-st500是我的硬盘。

写规则文件

决定如何命名一个设备并且如何表现,这些就是规则文件的任务了。在udev中,这些文件保存在/etc/udev/rules.d/目录下,并且所有的文件以.rules后缀结尾。

在这个目录下的文件,udev以一定的规则解析规则文件,所以,如果你想使你的规则文件代替默认的规则文件,则最好使你的规则文件置于前面。

规则文件只能一行写一个,不能一条规则写多行,以#进行注释。

一个设备可以被不止一个规则文件控制,

系统语法

就是简单的键值配对,每条规则至少一个键值,总的来说,就是匹配和赋值。例子:

KERNEL=="hdb", NAME="my_spare_disk"

”==”就是匹配符号,”=”就是赋值符号。

基本规则

为了更精确的匹配硬件,udev提供了几个不同的匹配关键词,详细的,请参阅man udev

KERNEL 设备在内核的名字

SUBSYSTEM 匹配设备子系统

DRIVER 匹配设备的驱动

通过这几种匹配条件,你可以使用以下赋值字段进行控制。

NAME 设备节点的名字

SYMLINK 一个对应设备的符号链接

最后一种实际上会形成设备名的链表,如果你是有意这么做的,请使用 “+=”进行操作。

KERNEL=="hdb", NAME="my_spare_disk"

这条规则是说,匹配一个被kernel称为hdb的设备,并且命名为“my_spare_disk”,而不是叫做hdb。

KERNEL=="hdb",DRIVER=="ide-disk" SYMLINK+="sparedisk"

这条规则是说,匹配一个kernel成为“hdb”&&驱动为“ide-disk”的设备,并且在保留默认设备名称的情况下,创造一个新的符号链接叫做”sparedisk”.

为了保持/dev目录下的文件组织是系统默认的,你最好使用符号链接,建立自己的设备名称。`

KERNEL=="hdc", SYMLINK+="cdrom cdrom0"

如果你写上面这条规则,则会导致/dev/cdrom和/dev/cdrom0,且都指向名为hdc的设备

设备体系


Comments

Content