在LINUX下Udev的详细介绍.doc
《在LINUX下Udev的详细介绍.doc》由会员分享,可在线阅读,更多相关《在LINUX下Udev的详细介绍.doc(14页珍藏版)》请在三一文库上搜索。
1、在LINUX下Udev的详细介绍如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略。在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev目录下。后来,采用了devfs,一个基于内核的动态设备文件系统,他首次出现在2.3.46 内核中。Mandrake,Gentoo等Linux分发版本采用了这种方式。devfs创建的设备文件是动态的。但是devfs有一些严重的限制,从 2.6.13版本后移走了。目前取代他的便是文本要提到的udev一个用户空间程序。目前很多的Linux分发版本采纳了udev的方式,因为
2、它在Linux设备访问,特别是那些对设备有极端需求的站点(比如需要控制上千个硬盘)和热插拔设备(比如USB摄像头和MP3播放器)上解决了几个问题。下面我我们来看看如何管理udev设备。实际上,对于那些为磁盘,终端设备等准备的标准配置文件而言,你不需要修改什么。但是,你需要了解udev配置来使用新的或者外来设备,如果不修改配置,这些设备可能无法访问,或者说Linux可能会采用不恰当的名字,属组或权限来创建这些设备文件。你可能也想知道如何修改RS232串口,音频设备等文件的属组或者权限。这点在实际的Linux实施中是会遇到的。为什么使用udev在此之前的设备文件管理方法(静态文件和devfs)有几
3、个缺点:* 不确定的设备映射。特别是那些动态设备,比如USB设备,设备文件到实际设备的映射并不可靠和确定。举一个例子:如果你有两个USB打印机。一个可能称为 /dev/usb/lp0,另外一个便是/dev/usb/lp1。但是到底哪个是哪个并不清楚,lp0,lp1和实际的设备没有一一对应的关系,因为他可能因为发现设备的顺序,打印机本身关闭等原因而导致这种映射并不确定。理想的方式应该是:两个打印机应该采用基于他们的序列号或者其他标识信息的唯一设备文件来映射。但是静态文件和devfs都无法做到这点。*没有足够的主/辅设备号。我们知道,每一个设备文件是有两个8位的数字:一个是主设备号 ,另外一个是辅
4、设备号来分配的。这两个8位的数字加上设备类型(块设备或者字符设备)来唯一标识一个设备。不幸的是,关联这些身边的的数字并不足够。*/dev目录下文件太多。一个系统采用静态设备文件关联的方式,那么这个目录下的文件必然是足够多。而同时你又不知道在你的系统上到底有那些设备文件是激活的。*命名不够灵活。尽管devfs解决了以前的一些问题,但是它自身又带来了一些问题。其中一个就是命名不够灵活;你别想非常简单的就能修改设备文件的名字。缺省的devfs命令机制本身也很奇怪,他需要修改大量的配置文件和程序。;*内核内存使用,devfs特有的另外一个问题是,作为内核驱动模块,devfs需要消耗大量的内存,特别当系
5、统上有大量的设备时(比如上面我们提到的系统一个上有好几千磁盘时)udev的目标是想解决上面提到的这些问题,他通采用用户空间(user-space)工具来管理/dev/目录树,他和文件系统分开。知道如何改变缺省配置能让你之大如何定制自己的系统,比如创建设备字符连接,改变设备文件属组,权限等。udev配置文件主要的udev配置文件是/etc/udev/udev.conf。这个文件通常很短,他可能只是包含几行#开头的注释,然后有几行选项:udev_root=/dev/udev_rules=/etc/udev/rules.d/udev_log=err上面的第二行非常重要,因为他表示udev规则存储的目
6、录,这个目录存储的是以.rules结束的文件。每一个文件处理一系列规则来帮助udev分配名字给设备文件以保证能被内核识别。你的/etc/udev/rules.d下面可能有好几个udev规则文件,这些文件一部分是udev包安装的,另外一部分则是可能是别的硬件或者软件包生成的。比如在Fedora Core 5系统上,sane-backends包就会安装60-libsane.rules文件,另外initscripts包会安装60-net.rules文件。这些规则文件的文件名通常是两个数字开头,它表示系统应用该规则的顺序。规则文件里的规则有一系列的键/值对组成,键/值对之间用逗号(,)分割。每一个键或
7、者是用户匹配键,或者是一个赋值键。匹配键确定规则是否被应用,而赋值键表示分配某值给该键。这些值将影响udev创建的设备文件。赋值键可以处理一个多值列表。规则说明1、udev 规则的所有操作符“=”:比较键、值,若等于,则该条件满足;“!=”:比较键、值,若不等于,则该条件满足;“=”: 对一个键赋值;“+=”:为一个表示多个条目的键赋值。“:=”:对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。2、udev 规则的匹配键ACTION:事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 )。KERNEL: 内核设备名称,例如:sd
8、a, cdrom。DEVPATH:设备的 devpath 路径。SUBSYSTEM:设备的子系统名称,例如:sda 的子系统为 block。BUS:设备在 devpath 里的总线名称,例如:usb。DRIVER:设备在 devpath 里的设备驱动名称,例如:ide-cdrom。ID: 设备在 devpath 里的识别号。SYSFSfilename:设备的 devpath 路径下,设备的属性文件“filename”里的内容。例如:SYSFSmodel=“ST936701SS”表示:如果设备的型号为 ST936701SS,则该设备匹配该 匹配键。在一条规则中,可以设定最多五条 SYSFS 的
9、匹配键。ENVkey:环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键。PROGRAM:调用外部命令。RESULT: 外部命令 PROGRAM 的返回结果。3、udev 的重要赋值键NAME:在 /dev下产生的设备文件名。只有第一次对某个设备的 NAME 的赋值行为生效,之后匹配的规则再对该设备的 NAME 赋值行为将被忽略。如果没有任何规则对设备的 NAME 赋值,udev 将使用内核设备名称来产生设备文件。SYMLINK:为 /dev/下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接
10、。OWNER, GROUP, MODE:为设备设定权限。ENVkey:导入一个环境变量。4、udev 的值和可调用的替换操作符Linux 用户可以随意地定制 udev 规则文件的值。例如:my_root_disk, my_printer。同时也可以引用下面的替换操作符:$kernel, %k:设备的内核设备名称,例如:sda、cdrom。$number, %n:设备的内核号码,例如:sda3 的内核号码是 3。$devpath, %p:设备的 devpath路径。$id, %b:设备在 devpath里的 ID 号。$sysfsfile, %sfile:设备的 sysfs里 file 的内容。
11、其实就是设备的属性值。$envkey, %Ekey:一个环境变量的值。$major, %M:设备的 major 号。$minor %m:设备的 minor 号。$result, %c:PROGRAM 返回的结果。$parent, %P: 父设备的设备文件名。$root, %r:udev_root的值,默认是 /dev/。$tempnode, %N:临时设备名。%:符号 % 本身。$:符号 $ 本身。给出一个列子来解释如何使用这些键,下面的例子来自Fedora Core 5系统的标准配置文件:KERNEL=*, OWNER=root GROUP=root, MODE=0600KERNEL=tty
12、, NAME=%k, GROUP=tty, MODE=0666, OPTIONS=last_ruleKERNEL=scd0-9*, SYMLINK+=cdrom cdrom-%kKERNEL=hda-z, BUS=ide, SYSFSremovable=1, SYSFSdevice/media=cdrom, SYMLINK+=cdrom cdrom-%kACTION=add, SUBSYSTEM=scsi_device, RUN+=/sbin/modprobe sg上面的例子给出了5个规则,每一个都是KERNEL或者ACTION键开头:*第一个规则是缺省的,他匹配任意被内核识别到的设备,然后设
13、定这些设备的属组是root,组是root,访问权限模式是0600(-rw-)。这也是一个安全的缺省设置保证所有的设备在默认情况下只有root可以读写。*第二个规则也是比较典型的规则了。它匹配终端设备(tty),然后设置新的权限为0600,所在的组是tty。它也设置了一个特别的设备文件名:%K。在这里例子里,%k代表设备的内核名字。那也就意味着内核识别出这些设备是什么名字,就创建什么样的设备文件名。*第三行开始的KERNEL=scd0-9*,表示 SCSI CD-ROM 驱动. 它创建一对设备符号连接:cdrom和cdrom-%k。*第四行,开始的 KERNEL=hda-z, 表示ATA CDR
14、OM驱动器。这个规则创建和上面的规则相同的符号连接。ATA CDROM驱动器需要sysfs值以来区别别的ATA设备,因为SCSI CDROM可以被内核唯一识别。.*第五行以 ACTION=add开始,它告诉udev增加 /sbin/modprobe sg 到命令列表,当任意SCSI设备增加到系统后,这些命令将执行。其效果就是计算机应该会增加sg内核模块来侦测新的SCSI设备。当然,上面仅仅是一小部分例子,如果你的系统采用了udev方式,那你应该可以看到更多的规则。如果你想修改设备的权限或者创建信的符号连接,那么你需要熟读这些规则,特别是要仔细注意你修改的那些与之相关的设备。修改你的udev配置
15、在修改udev配置之前,我们一定要仔细,通常的考虑是:你最好不要修改系统预置的那些规则,特别不要指定影响非常广泛的配置,比如上面例子中的第一行。不正确的配置可能会导致严重的系统问题或者系统根本就无法这个正确的访问设备。而我们正确的做法应该是在/etc/udev/rules.d/下创建一个信的规则文件。确定你给出的文件的后缀是rules文件名给出的数字序列应该比标准配置文件高。比如,你可以创建一个名为99-my-udev.rules的规则文件。在你的规则文件中,你可以指定任何你想修改的配置,比如,假设你修改修改floppy设备的所在组,还准备创建一个信的符号连接/dev/floppy,那你可以这
16、么写:KERNEL=fd0-9*, GROUP=users, SYMLINK+=floppy有些发行版本,比如Fedora,采用了外部脚本来修改某些特定设备的属组,组关系和权限。因此上面的改动可能并不见得生效。如果你遇到了这个问题,你就需要跟踪和修改这个脚本来达到你的目的。或者你可以修改PROGRAM或RUN键的值来做到这点。某些规则的修改可能需要更深的挖掘。比如,你可能想在一个设备上使用sysfs信息来唯一标识一个设备。这些信息最好通过udevinfo命令来获取。$udevinfo a p $(udevinfo q path n /dev/hda)上面的命令两次使用udevinfo:一次是返
17、回sysfs设备路径(他通常和我们看到的Linux设备文件名所在路径/dev/hda不同);第二次才是查询这个设备路径,结果将是非常常的syfs信息汇总。你可以找到最够的信息来唯一标志你的设备,你可以采用适当的替换udev配置文件中的 SYSFS选项。下面的结果就是上面的命令输出rootlocalhost rules.d#udevinfo -a -p $(udevinfo -q path -n /dev/hda1)Udevinfo starts with the device specified by the devpath and thenwalks up the chain of pare
18、nt devices. It prints for every devicefound, all possible attributes in the udev rules key format.A rule to match, can be composed by the attributes of the deviceand the attributes from one single parent device.looking at device /block/hda/hda1:KERNEL=hda1SUBSYSTEM=blockDRIVER=ATTRstat= 1133 2268 2
19、4ATTRsize=208782ATTRstart=63ATTRdev=3:1looking at parent device /block/hda:KERNELS=hdaSUBSYSTEMS=blockDRIVERS=ATTRSstat= 28905 18814 1234781 302540 34087 133247 849708 981336 0 218340 1283968ATTRSsize=117210240ATTRSremovable=0ATTRSrange=64ATTRSdev=3:0looking at parent device /devices/pci0000:00/0000
20、:00:1f.1/ide0/0.0:KERNELS=0.0SUBSYSTEMS=ideDRIVERS=ide-diskATTRSmodalias=ide:m-diskATTRSdrivename=hdaATTRSmedia=disklooking at parent device /devices/pci0000:00/0000:00:1f.1/ide0:KERNELS=ide0SUBSYSTEMS=DRIVERS=looking at parent device /devices/pci0000:00/0000:00:1f.1:KERNELS=0000:00:1f.1SUBSYSTEMS=p
21、ciDRIVERS=PIIX_IDEATTRSbroken_parity_status=0ATTRSenable=1ATTRSmodalias=pci:v00008086d000024CAsv0000144Dsd0000C009bc01sc01i8aATTRSlocal_cpus=1ATTRSirq=11ATTRSclass=0x01018aATTRSsubsystem_device=0xc009ATTRSsubsystem_vendor=0x144dATTRSdevice=0x24caATTRSvendor=0x8086looking at parent device /devices/pc
22、i0000:00:KERNELS=pci0000:00SUBSYSTEMS=DRIVERS=例子一:修改USB扫描仪的配置。通过一系列的尝试,你已经为这个扫描仪标识了Linux设备文件(每次打开扫描仪时,名字都会变)。你可以使用上面的命令替换这个正确的Linux设备文件名,然后定位输出的采用SYSFSidVendor行和SYSFSidProduct行。最后你可以使用这些信息来为这个扫描仪创建新的选项。SYSFSidVendor=0686, SYSFSidProduct=400e, SYMLINK+=scanner, MODE=0664, group=scanner上面的例子表示将扫描仪的组设置
23、为scanner,访问权限设置为0664,同时创建一个/dev/scanner的符号连接。例子二:使用udev修改u盘设备文件名 编写我们的/etc/udev/rules.d/10-local.rules文件sudo vim /etc/udev/rules.d/10-local.rules在里面加入这几个变量信息,如下:KERNEL=sdc4,SUBSYSTEMS=block, NAME+=kinstonusb,SYMLINK+=kinstonusb_link上面的KERNEL=sdc4,SUBSYSTEMS=block我们可以根据上面的输出直接拷贝过去的。我们保存这个文件。一般我们要使这个规
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINUX Udev 详细 介绍
链接地址:https://www.31doc.com/p-3408167.html