udev的应用案例

udev 

    是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。它同时也是用来接替devfs及热插拔的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载固件时Linux 2.6.13内核。udev的最新版本依赖于升级后的的uevent接口的最新版本。使用新版本udev的系统不能在2.6.13以下版本启动,除非使用noudev参数来禁用udev并使用传统的/dev来进行设备读取。

基本信息


Linux 传统上使用静态设备创建方法,因此大量设备节点在 /dev 下创建(有时上千个),而不管相应的硬件设备是否真正存在。通常这由一个MAKEDEV脚本实现,这个脚本包含了许多通过世界上(有幽默意味,注)每一个可能存在的设备相关的主设备号和次设备号对mknod程序的调用。采用udev的方法,只有被 内核检测到的设备才会获取为它们创建的设备节点。因为这些设备节点在每次系统启动时被创建,他们会被贮存在ramfs(一个内存中的文件系统,不占用任何磁盘空间).设备节点不需要大量磁盘空间,因此它使用的内存可以忽略。


Udev:动态管理设备文件的方法

  1. Linux中一切皆文件。

  2. Udev管理设备文件。如,主机连接U盘出现新的文件(sdb),移除U盘,磁盘文件消失。

  3. 硬件文件的信息写入到了/sys目录下,这个目录与proc类似。

  4. 我们用udev可以为设备改名,或执行自定义操作。

  1. /etc/udev/rules.d目录下创建规则文件

  2. 接入新设备,如果满足规则,就会按管理员的规则应用

  3. 规则文件名:数字-名字.rules

  1. 规则文件中,管理员指定硬件满足或不满足哪些条件,就执行什么操作

  • 实例:新碰盘接入时,创建一个捷链接的设备文件(相当于创建快捷方式)

1) 查看设备信息(先查看设备完整路径,再查看地完整信息)

[root@pc1 ~]# udevadm info --query=path --name=/dev/vdb      //查看设备的完整路径信息,vdb为磁盘

/devices/pci0000:00/0000:00:0d.0/virtio8/block/vdb

[root@pc1 ~]# udevadm info --query=all --attribute-walk >path=/devices/pci0000:00/0000:00:0e.0/virtio9/block/vdc/vdc1    //两行是一起的,写不了这么长

...........
  looking at device '/devices/pci0000:00/0000:00:0d.0/virtio8/block/vdb':
    KERNEL=="vdb"
..........
  looking at parent device '/devices/pci0000:00/0000:00:0d.0/virtio8':
    KERNELS=="virtio8"
    SUBSYSTEMS=="virtio"
    DRIVERS=="virtio_blk"   //如果里是U盘,一般会显示成DRIVERS=="usb-storage"

......
  looking at parent device '/devices/pci0000:00/0000:00:0d.0':
    KERNELS=="0000:00:0d.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="virtio-pci"    //找到一些有特征的信息,在自定义规则时作为检测条件使用

    ATTRS{irq}=="10"
    ATTRS{subsystem_vendor}=="0x1af4"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x010000"
    ATTRS{driver_override}=="(null)"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{local_cpus}=="1"
    ATTRS{device}=="0x1001"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}==""
    ATTRS{local_cpulist}=="0"
    ATTRS{vendor}=="0x1af4"
    ATTRS{subsystem_device}=="0x0002"
    ATTRS{numa_node}=="-1"
    ATTRS{d3cold_allowed}=="0"

......

2) 创建规则

[root@pc1 rules.d]# cd /etc/udev/rules.d/     //设备链接规则存放目录
[root@pc1 rules.d]# ls

70-persistent-ipoib.rules

[root@pc1 rules.d]# cp 70-persistent-ipoib.rules 80-persistent-ipoib.rules 

[root@pc1 rules.d]# vim 80-persistent-ipoib.rules   //编写规则,删除全部,编写内容如下

ACTION=="add", KERNEL=="vd[a-z]*", DRIVERS=="virtio_blk",SYMLINK+="lcfvdb%n"

//将设备连到主机,ACTION(行为)就是addKERNEL的意思是没有人为干预内核给它起的名。SYMLINIK是创建快捷方式,+=是额外增加。%n是分区号

[root@pc1 rules.d]# ls /dev/lcf*

ls: 无法访问/dev/lcf*: 没有那个文件或目录

//重启电脑后再查看一次

[root@pc1 ~]# ls /dev/lcf*

/dev/lcfvdb  /dev/lcfvdb1  /dev/lcfvdb2

//这样就出来了

3) udevadm 工具简介
概要:

udevadm [--debug] [--version] [--help]

udevadm info options

udevadm trigger [options]

udevadm settle [options]

udevadm control command

udevadm monitor [options]

udevadm test [options] devpath

 

描述:

udevadm 后接一个命令和命令指定选项。它控制了udev运行的行为,处理内核事件,控制事件队列,并且提供简单的调试机制。

 

选项:

--debug 打印错误信息

--version 打印版本信息

--help 帮助文档

 

udevadm info options

查询udev数据库中的设备信息。也可以从sysfs文件系统中查询到设备的属性以辅助创建udev规则。

 

--query=type

从数据库中查询指定类型的设备。需要--path和--name来指定设备。合法的查询文件是:设备名,链接,路径,属性

--path=devpath

设备的路径

--name=file

设备节点或者链接

--attribute-walk

打印指定设备的所有sysfs记录的属性,以用来udev规则匹配特殊的设备。该选项打印链上的所有设备信息,最大可能到sys目录。

--device-id-of-file=file

打印主/从设备号

--export-db

输出udev数据库中的内容

--version

输出版本信息

--help

打印帮助文档

 

 

udevadm trigger [options]

接收内核发送来的设备事件。主要用于重放coldplug事件信息

(译者补充:内核在启动时已经检测到了系统的硬件设备,并把硬件设备信息通过sysfs内核虚拟文件系统导出。udev扫描sysfs文件系统,根据硬件设备信息生成热插拔(hotplug)事件,udev再读取这些事件,生成对应的硬件设备文件。由于没有实际的硬件插拔动作,所以这一过程被称为coldplug。)

--verbose 输出将要被触发的设备列表。

--dry-run 不真的触发事件

--type=type 触发一个特殊的设备。合法的类型:devices,subsystem,failed.默认是devices

--action=action

被触发的事件,默认是change

--subsystem-match=subsystem

触发匹配子系统的设备事件。这个选项可以被多次指定,并且支持shell模式匹配。

--attr-match=attribute=value

触发匹配sysfs属性的设备事件。如果属性值和属性一起指定,属性的值可以使用shell模式匹配。如果没有指定值,会重新确认现有属性。这个选项可以被多次指定。

--attr-nomatch=attribute=value

不要触发匹配属性的设备事件。如果可以使用模式匹配。也可以多次指定

--property-match=property=value

匹配属性吻合的设备。可以多次指定支持模式匹配

--tag-match=property

匹配标签吻合的设备。可以多次指定。

--sysname-match=name

匹配sys设备名相同的设备。可以多次指定支持模式匹配。

 

 

udevadm settle [options]

查看udev事件队列,如果所有事件全部处理完就退出。

--timeout=seconds

等待事件队列空的最大时间。默认是180秒。如果是0则立即退出。

--seq-start=seqnum

只等待到给定的顺序号。

--seq-end=seqnum

只等待到给定顺序号之前。

--exit-if-exists=file

如果文件存在就退出

--quiet

不输出任何信息

--help

输出帮助文档

 

 

udevadm monitor [options]

监听内核事件和udev发送的events事件。打印事件发出的设备。可以通过比较内核或者udev事件的时间戳来分析事件时序。

--kernel

输出内核事件

--udev

输出udev规则执行时的udev事件

--property

输出事件的属性

--subsystem-match=string

通过子系统或者设备类型过滤事件。只有匹配了子系统值的udev设备事件通过。

--tag-match=string

通过属性过滤事件,只有匹配了标签的udev事件通过。

--help

 

 

udevadm test [options] devpath

模拟一个udev事件,打印出debug信息。

 

--action=string

--subsystem=string

`--help


猜你喜欢

转载自blog.csdn.net/cbuy888/article/details/80751727