Udev守护进程解析uevent数据,并且对/etc/udev/rules.d中指定的规则进行匹配.
根据指定的规则为设备创建设备节点和符号链接.
Udev守护进程读取/etc/udev/rules.d/*.rules 中的规则并且保存到内存里面.
Udev接收接收inotify事件,如果某个规则发生了改变,读取这些改变并更新内存副本.
设备驱动程序加载
Udev使用modalias方法来加载设备驱动程序. 位于/lib/modules/`uname -r`/modules.alias 的modalias文件用于协助Udev加载设备驱动. modalias文件由depmod命令创建,包括了设备驱动的别名。
让我们检查一个Linux设备驱动加载的例子:
我使用一个C程序来从netlink套接字收集数据,并且使用它们来创建设备节点以及加载模块。
[root@arch ~]# ./a.outadd@/devices/pci0000:00/0000:00:02.1/usb1/1-4ACTION=addDEVPATH=/devices/pci0000:00/0000:00:02.1/usb1/1-4SUBSYSTEM=usbMAJOR=189MINOR=1DEVTYPE=usb_deviceDEVICE=/proc/bus/usb/001/002PRODUCT=1058/1010/105TYPE=0/0/0BUSNUM=001DEVNUM=002SEQNUM=1163add@/devices/pci0000:00/0000:00:02.1/usb1/1-4/1-4:1.0ACTION=addDEVPATH=/devices/pci0000:00/0000:00:02.1/usb1/1-4/1-4:1.0SUBSYSTEM=usbDEVTYPE=usb_interfaceDEVICE=/proc/bus/usb/001/002PRODUCT=1058/1010/105 …………………………………………你可以看到它提供了很多关于这个设备的信息。这其中包括了用来告诉Udev加载某个特定模块的modalias变量。
modalias数据看起来像这样:
MODALIAS=pci:v000010ECd00008169sv00001385sd0000311Abc02sc00i00The modalias data contains all the information required to find the corresponding device driver :
pci :- 这是一个PCI设备 v :- 设备的厂商ID. 在这里就是 000010EC ( 即 10EC )d :- 设备的设备ID. 在这里就是 00008169 ( 即 8169 )sv 和 sd 是厂商和设备的子系统版本号. 依据ID查找一个PCI设备的厂商/产品的最好地方是 http://www.pcidatabase.com.
Udev使用modalias数据来从/lib/modules/`uname -r`/modules.alias 查找正确的设备驱动。
$ grep -i 10EC /lib/modules/`uname -r`/modules.alias | grep -i 8169alias pci:v000010ECd00008129sv*sd*bc*sc*i* r8169alias pci:v000010ECd00008169sv*sd*bc*sc*i* r8169你可以看到适合这个设备的模块是r8169. 让我们获取关于这个驱动程序的更多的信息.
$ /sbin/modinfo r8169filename: /lib/modules/2.6.18-53.el5/kernel/drivers/net/r8169.koversion: 2.2LK-NAPIlicense: GPLdescription: RealTek RTL-8169 Gigabit Ethernet driverauthor: Realtek and the Linux r8169 crew srcversion: D5EDA4980B92CA2CF677B62alias: pci:v00001737d00001032sv*sd00000024bc*sc*i*alias: pci:v000016ECd00000116sv*sd*bc*sc*i*alias: pci:v00001186d00004300sv*sd*bc*sc*i*alias: pci:v000010ECd00008129sv*sd*bc*sc*i*alias: pci:v000010ECd00008169sv*sd*bc*sc*i*depends:vermagic: 2.6.18-53.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1parm: media:force phy operation. Deprecated by ethtool (8). (array of int)parm: rx_copybreak:Copy breakpoint for copy-only-tiny-frames (int)parm: use_dac:Enable PCI DAC. Unsafe on 32 bit PCI slot. (int)parm: debug:Debug verbosity level (0=none, …, 16=all) (int)注意查看从"depends”开始的那些行. 它描述了r8169这个模块所依赖的其他一些模块。因此Udev也会加载这些模块。
规则处理和设备节点创建
如前所述,Udev会为内核中每个设备状态的改变解析/etc/udev/rules.d/ 中的规则。Udev规则可以用于在用户空间操作设备节点的名字/权限/符号链接。
让我们看一些示例规则,有利于帮助你更好地理解Udev规则。来源:考试大 - Linux认证
责编:zj 纠错