什么是udev,在网上搜索一下可以得到很多关于udev的信息,个人总结如下。
一、什么是udev
《system:udev原理分析》 :http://www.turbolinux.com.cn/turbo/wiki/doku.php?id=system:udev%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90):
在linux系统中,/dev目录用来保存设备文件的.每个文件指向一个系统设备.用户的程序可以通过使用这些设备文件,
对真实的硬件的设备进行操作.如: hda是第1个IDE硬盘,sda是第1个SCSI硬盘.
在2.4内核时代,在/dev下保存了所有kernel可以支持的硬件设备的设备文件,将近有1万个.而这些设备中,大多数
是没有连接的设备.这样就大大的浪费了系统资源,而且/dev目录也显得非常混乱.
udev 就是用了解决这些问题的.在2.6内核中,采用udev 方式来管理/dev目录.它可以动态的建立/删除设备文件(设备
连接到系统时,它会自动建立相应的设备文件,设备断开连接后,它会自动删除相应的设备文件).这样使/dev目录
简化了许多.而且,udev 还可以允许用户编写命名规则,为不同设备指定设备文件名.这样,对设备的管理也方便了
许多.
例如:你有2个U盘,1个容量是1G的,1个容量是2G的.一般情况下,你先接上的U盘会是sdb,后接上的U盘会是sdc.这样对
使用很不方便.每次U盘的设备名可能不一样.但通过udev 命名规则,你可以自己指定的设备命名,可以将1G的U盘命名为
1g,将2G的U盘命名为2g.设备名不会再变化.使用和管理都会很方便.
《udev实现原理》-- 李先静(http://blog.csdn.net/absurd/archive/2007/04/27/1587938.aspx)
相对于 linux 来说, udev 还是一个新事物。然而,尽管它 03 年才出现,尽管它很低调 ( J ) ,但它无疑已经成为 linux 下不可或缺的组件了。 udev 是什么?它是如何实现的?最近研究 Linux 设备管理时,花了一些时间去研究 udev 的实现。
udev 是什么? u 是指 user space , dev 是指 device , udev 是用户空间的设备驱动程序吗?最初我也这样认为,调试内核空间的程序要比调试用户空间的程序复杂得多,内核空间的程序的 BUG 所引起的后果也严重得多, device driver 是内核空间中所占比较最大的代码,如果把这些 device driver 中硬件无关的代码,从内核空间移动到用户空间,自然是一个不错的想法。
但我的想法并不正确, udev 的文档是这样说的,
1. dynamic replacement for /dev 。作为 devfs 的替代者,传统的 devfs 不能动态分配 major 和 minor 的值,而 major 和 minor 非常有限,很快就会用完了。 udev 能够像 DHCP 动态分配 IP 地址一样去动态分配 major 和 minor 。
2. device naming 。提供设备命名持久化的机制。传统设备命名方式不具直观性,像 /dev/hda1 这样的名字肯定没有 boot_disk 这样的名字直观。 udev 能够像 DNS 解析域名一样去给设备指定一个有意义的名称。
3. API to access info about current system devices 。提供了一组易用的 API 去操作 sysfs ,避免重复实现同样的代码,这没有什么好说的。
我们知道,用户空间的程序与设备通信的方法,主要有以下几种方式,
1. 通过 ioperm 获取操作 IO 端口的权限,然后用 inb/inw/ inl/ outb/outw/outl 等函数,避开设备驱动程序,直接去操作 IO 端口。(没有用过)
2. 用 ioctl 函数去操作 /dev 目录下对应的设备,这是设备驱动程序提供的接口。像键盘、鼠标和触摸屏等输入设备一般都是这样做的。
3. 用 write/read/mmap 去操作 /dev 目录下对应的设备,这也是设备驱动程序提供的接口。像 framebuffer 等都是这样做的。
上面的方法在大多数情况下,都可以正常工作,但是对于热插拨 (hotplug) 的设备,比如像 U 盘,就有点困难了,因为你不知道:什么时候设备插上了,什么时候设备拔掉了。这就是所谓的 hotplug 问题了。
二、为什么使用udev
《 红旗工程师大讲堂:掌握udev》:http://linux.chinaitlab.com/administer/782422.html
在此之前的设备文件管理方法(静态文件和devfs)有几个缺点:
◆不确定的设备映射。特别是那些动态设备,比如USB设备,设备文件到实际设备的映射并不可靠和确定。举一个例子:如果你有两个USB打印机。 一个可能称为 /dev/usb/lp0,另外一个便是/dev/usb/lp1。但是到底哪个是哪个并不清楚,lp0,lp1和实际的设备没有一一对应的关系,因为他 可能因为发现设备的顺序,打印机本身关闭等原因而导致这种映射并不确定。理想的方式应该是:两个打印机应该采用基于他们的序列号或者其他标识信息的唯一设 备文件来映射。但是静态文件和devfs都无法做到这点。
◆没有足够的主/辅设备号。我们知道,每一个设备文件是有两个8位的数字:一个是主设备号,另外一个是辅设备号来分配的。这两个8位的数字加上设备类型(块设备或者字符设备)来唯一标识一个设备。不幸的是,关联这些身边的的数字并不足够。
◆/dev目录下文件太多。一个系统采用静态设备文件关联的方式,那么这个目录下的文件必然是足够多。而同时你又不知道在你的系统上到底有那些设备文件是激活的。
◆命名不够灵活。尽管devfs解决了以前的一些问题,但是它自身又带来了一些问题。其中一个就是命名不够灵活;你别想非常简单的就能修改设备文件的名字。缺省的devfs命令机制本身也很奇怪,他需要修改大量的配置文件和程序。;
◆内核内存使用,devfs特有的另外一个问题是,作为内核驱动模块,devfs需要消耗大量的内存,特别当系统上有大量的设备时(比如上面我们提到的系统一个上有好几千磁盘时)
udev的目标是想解决上面提到的这些问题,他通采用用户空间(user-space)工具来管理/dev/目录树,他和文件系统分开。知道如何改变缺省配置能让你之大如何定制自己的系统,比如创建设备字符连接,改变设备文件属组,权限等。
三、udev的使用
《linux udev的认识》:http://www.91linux.com/html/article/network_memory/20090603/17070_2.html#
问:udev怎样做到不管设备连接的顺序而维持一个统一的设备名?
答:实际上,udev是通过对内核产生的设备名增加别名的方式来达到上述目的的。前面说过,udev是用户模式程序,不会更改内核的行为。因此,内核依然会我行我素地产生设备名如sda,sdb 等。但是,udev可以根据设备的其他信息如总线(bus),生产商(vendor)等不同来区分不同的设备,并产生设备文件。udev只要为这个设备文件取一个固定的文件名就可以解决这个问题。在后续对设备的操作中,只要引用新的设备名就可以了。但为了保证最大限度的兼容,一般来说,新设备名总是作为一个对内核自动产生的设备名的符号链接(link)来使用的。
例如:内核产生了sda设备名,而根据信息,这个设备对应于是我的内置硬盘,那我就可以制定udev规则,让udev除了产生/dev/sda设备文件外,另外创建一个符号链接叫/dev/internalHD。这样,我在 fstab文件中,就可以用/dev/internalHD来代替原来的 /dev/sda了。下次,由于某些原因,这个硬盘在内核中变成了sdb设备名了,那也不用着急,udev还会自动产生/dev/internalHD这个链接,并指向正确的/dev/sdb设备。所有其他的文件像fstab等都不用修改。
==============================================================
基于上面的引用,读者大概都可以知道什么是udev和udev有什么用这些基本的概念了。
更进一步的udev的信息,可以通过在linux下运行:man 7 udev查看。
————————————————
版权声明:本文为CSDN博主「fjb2080」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接: