udev——设备文件管理的用户空间实现( 三 )


第四步是一个简单的字符串替换 。如果设备的内核的名字在这里指定的名称相匹配,请求的新名称将用于设备 。如果用户总是知道将具有相同的内核名称,但希望名称不同的东西,这是有用的 。
第五步是捕捉所有落下的步骤 。如果前面的步骤都未能提供此设备的名称,默认的内核的名称将被用于此设备 。对于大多数系统中的设备,这是将要使用的规则,因为它匹配在Linux系统上没有devfs的或udev的命名的设备 。
下图表显示了一个配置文件例子 。这个配置文件说明了如何替换默认的内核命名方案的四种不同的替换方式 。
# USB Epsonto be
LABEL, BUS=”usb”, =”″, NAME=””
# USB HPto belp_hp,
LABEL, BUS=”usb”, =”″, NAME=”lp_hp”
【udev——设备文件管理的用户空间实现】# sound card with PCI bus id 00:0b.0 to be the first sound card
, BUS=”pci”, id=”00:0b.0″, NAME=”dsp”
# sound card with PCI bus id 00:07.1 to be thesound card
, BUS=”pci”, id=”00:07.1″, NAME=”dsp1″
# USB mouseinto the third port of the first hub to be
#
, BUS=”usb”, place=”1.3″, NAME=”″
# USBinto theport of thehub to be
#
, BUS=”usb”, place=”2.2″, NAME=”″
#bevisor
, =”″, NAME=”visor”
3:file
3.2
为了让更多的用户空间程序访问sysfs,而不仅仅是udev的项目,有必要有一个通用的API来访问sysfs中的设备信息 。与将查询逻辑重复写入不同的项目内不同,将查询逻辑在sysfs之上分割出来为一个单独的库,将更有意义 。另外,sysfs表征不同类型设备的方式没有标准,PCI设备与USB有不同的属性项,这也是创建一个用于查询设备信息的标准库接口的另一个原因 。
目前版本的udev使用的最初版本的,代码库的开发正处于活跃阶段 。
3.3 udev
udev负责沟通和库以完成设备的命名 。当内核调用/sbin/时,udev被触发运行,udev是通过在/etc/.d/目录中添加一个链接自身的符号链接来实现这种触发关联的 。/sbin/通过搜索/etc/.d/目录间接调用udev 。
/sbin/ 被内核调用的时候,“热插事件名”会被传给/sbin/ ,另外,内核还通过环境变量传递更多的事件信息,例如事件类型(插入是拔出)、发生事件的设备类型(USB, PCI等),还有具体(在sysfs目录树的)哪个设备发生了事件 。udev根据这些信息,调用取得设备名,如果是添加新设备,udev调用取得设备号,然后创建相应的设备文件;如果是移除设备,udev移除相应用设备文件 。
4
有不少用户要求对udev进一步优化增强,这些优化可以添加到现有的udev实现 。
很多用户空间程序希望能检测到新设备被添加或从系统中删除的事件 。Gnome和KDE都想在系统添加新磁盘的时候添加一个新的图标,或者在USB Palm设备插入后启动一个同步程序 。D-BUS项目的目标就是为应用程序使用消息实现彼此通信提供一种简单的方法 。例如,udev在创建或移除设备文件后向系统广播一条D-BUS消息,所有侦听消息应用程序可以作出相应的动作 。
目前,使用一个非常简单的配置文件,创建一个简单的基于RAM的数据库,用于存储当前所有的设备信息和设备的命名规则 。有人建议,将这个“数据库”转移到一个真实的,备份式存储类型的数据库,以持久化系统的状态,或者提供一个更复杂的命名方案给udev使用 。