udev学习总结

来源:互联网 发布:折叠雨伞推荐 知乎 编辑:程序博客网 时间:2024/06/05 08:34

udev 动态设备管理

 

看了不少前人总结的东西,是时候自己来做个总结了,来表达下我眼中的udev。

udev是什么?

udev是生成设备文件节点的一个方法,为了替代2.6内核之前的devfs而产生,最大的不同在于,udev是一个用户空间程序,因此是

硬件平台无关的。udev可以在系统发现一个新的硬件时,根据灵活的udev规则,在/dev下为该硬件生成相应的设备文件。

 

udev产生的需求是什么?

udev产生的需求是固定硬件设备的名称,方便用户的访问;比如:有两个usb设备:usb存储和usb相机;由于内核的处理机制,如果先插入usb存储设备,则被识别为sda,后插入的usb相机被识别为sdb;如果先插入usb相机,则被识别为sda;因此用户会感到困惑,不知道哪个是自己的设备。通过udev,指定规则之后,不管usb存储设备和相机何时被插入,都可以被识别为诸如/dev/usbstorage和/dev/usbcamera的设备节点,方便用户的识别。

 

udev规则

udev中最重要的是构建udev规则,正是通过指定规则,设备才能有序的规律的出现在/dev下面;

 

规则中包含两个要素:匹配项和赋值项,udev规则可以用一句话来概括:

if(A&B&C...) then (D&E&F...)

匹配项包括:KERNEL(设备被内核识别的名称),ACTION(设备发生特定的行为)等,匹配项通过“==”指定;赋值项包括:NAME(指定设备在/dev下的名称)

学习规则,最好的方法是通过例子:

KERNEL=="*", OWNER="root" GROUP="root", MODE="0600"
#内核中任何设备加载后,设置root拥有者,root用户组,访问权限为0600

KERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"

#发现tty设备,命名为%k(%kernel设备在内核默认名称),设置为tty用户组,0666访问权限,之后所有作用于tty的规则都失效
KERNEL=="scd[0-9]*", SYMLINK+="cdrom cdrom-%k"

#KERNEL=="scd[0-9]*",表示 SCSI CD-ROM 驱动. 它创建一对设备符号连接:cdrom和cdrom-%k。
KERNEL=="hd[a-z]", BUS=="ide", SYSFS{removable}=="1", SYSFS{device/media}=="cdrom", SYMLINK+="cdrom cdrom-%k"

#开始的 KERNEL=="hd[a-z]", 表示ATA CDROM驱动器。这个规则创建和上面的规则相同的符号连接。ATA CDROM驱动器需要sysfs值以来区别别的ATA设备,因为SCSI CDROM可以被内核唯一识别。
ACTION=="add", SUBSYSTEM=="scsi_device", RUN+="/sbin/modprobe sg"

#以 ACTION=="add"开始,它告诉udev增加 /sbin/modprobe sg 到命令列表,当任意SCSI设备增加到系统后,这些命令将执行。其效果就是计算机应该会增加sg内核模块来侦测新的SCSI设备。

 

如何添加udev规则 举一个例子:

udev规则的匹配项,是唯一标识目标设备的信息,由于udev是从sysfs获得设备信息的,为了获取这些信息,可以通过udevinfo指令来查询已加载设备的特征信息;

通常的情形是在为设备A创建udev规则之前,该设备可以先加载到系统中,然后运行

udevinfo -a -p $(udevinfo -q path -n /dev/A)

即可获得设备A及其父设备的相关特征信息;

然后可以从中挑选能够唯一标识设备A的信息,作为匹配项;

为了标识系统中的一个硬盘sda,

可以运行

udevinfo -a -p $(udevinfo -q path -n /dev/sda)

 

 结果如下:

 [root@localhost rules.d]# udevinfo -a -p $(udevinfo -q path -n /dev/sda)

Udevinfo starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{capability}=="12"
    ATTR{stat}=="  112812    30568  3171292   589470   137364   398132  4287050  2593137        0   567749  3182822"
    ATTR{size}=="104857600"
    ATTR{removable}=="0"
    ATTR{range}=="16"
    ATTR{dev}=="8:0"

  looking at parent device '/devices/pci0000:00/0000:00:10.0/host0/target0:0:0/0:0:0:0':
    KERNELS=="0:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{modalias}=="scsi:t-0x00"
    ATTRS{ioerr_cnt}=="0xc"
    ATTRS{iodone_cnt}=="0x3d15f"
    ATTRS{iorequest_cnt}=="0x3d15f"
    ATTRS{iocounterbits}=="32"
    ATTRS{timeout}=="60"
    ATTRS{state}=="running"
    ATTRS{rev}=="1.0 "
    ATTRS{model}=="VMware Virtual S"
    ATTRS{vendor}=="VMware, "
    ATTRS{scsi_level}=="3"
    ATTRS{type}=="0"
    ATTRS{queue_type}=="simple"
    ATTRS{queue_depth}=="32"
    ATTRS{device_blocked}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:10.0/host0/target0:0:0':
    KERNELS=="target0:0:0"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{uevent}==""

  looking at parent device '/devices/pci0000:00/0000:00:10.0/host0':
    KERNELS=="host0"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{uevent}==""

  looking at parent device '/devices/pci0000:00/0000:00:10.0':
    KERNELS=="0000:00:10.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="mptspi"
    ATTRS{msi_bus}==""
    ATTRS{broken_parity_status}=="0"
    ATTRS{enable}=="1"
    ATTRS{modalias}=="pci:v00001000d00000030sv00000000sd00000000bc01sc00i00"
    ATTRS{local_cpus}=="ffffffff"
    ATTRS{irq}=="19"
    ATTRS{class}=="0x010000"
    ATTRS{subsystem_device}=="0x0000"
    ATTRS{subsystem_vendor}=="0x0000"
    ATTRS{device}=="0x0030"
    ATTRS{vendor}=="0x1000"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{uevent}==""

 

 

 

 

 

 

 在嵌入式系统中如何加入udev支持

 

 

 

 

 

 

udev相关的官方资源:

man udev :在shell中即可轻松查看,除了没有例子之外,涉及了udev的方方面面,适合遗忘的时候查询;

udev primer:主要包含如何引导你的系统启动udev和简单的udev rules;

udev官方主页:在这里你可以获得udev的源码和相关的文档;

Writing udev rules:详细介绍如何构建udev规则,中文翻译见本博客转载的博文《udev晋级(专业人士提供)》

其中,A,B,C叫做匹配项,即条件;D,E,F叫做赋值项,即条件符合之后,执行相应的操作;

原创粉丝点击