欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

udev(三):主次设备号 有大用

udev(三):主次设备号

          原创文章,转载请注明出处,谢谢!

        作者:清林,博客名:飞空静渡

   

        在linux的2.5内核开始,所有在系统里的无论是物理设备还是虚拟设备,都会通过sysfs以一种体系结构在用户空间里显示。当任何设备加入系统或从系统中移除,/sbin/hotplug都会通知用户空间。由于这两个特点,就可以在用户空间中在/dev目录里实现一个非常灵活和方便的命名机制。为什么这么说udev在用户空间中呢,这是因为相对于以前udev取代的devfs来说的,devfs是基于内核机制的,而udev是基于用户空间的。
根据udev的文档里说,udev相对于devfs有以下一些优点:
         1、对设备的永久的命名(这个后面解释 :))。
         2、通知外部系统设备已经改变。
         3、灵活的设备命名策略。
         4、运行内核动态使用主次设备号(这个后面有讲)。
         5、命名机制可以脱离内核。

         一、系统里的设备的主次设备号


         首先,我们先看一下/dev目录里都有些什么。
用过linux的人都知道,在/dev目录里,存放的是系统里的各种设备文件。每个设备对应一个设备文件,而我们呢,就是通过这个设备文件访问和使用这个设备的。比如说,我们有两个sata硬盘,那么在/dev目录就会有/dev/sda和/dev/sdb这样的设备文件,或者你的硬盘是IDE的,那么可能就是/dev/hda和/dev/hdb了。

         来,我们再来看下什么是主次设备号。
         我们在使用设备是是通过/dev下的设备文件来使用文件,例如,我们要从第一个硬盘中读取一个扇区的字节,我们首先就会调用open打开/dev/hda,然后用read来读取,但我们的系统可不是通过设备名来操做的,我们的系统是通过主次设备号来认识和操作我们的设备的。
         我的系统是ubuntu9.10,我有两个sata的硬盘和两个sata的usb移动硬盘,在/dev/目录下,运行 ls -l来查看我们的设备,看看情况,下面是我的设备的截图的一部分。


sata硬盘的主次设备号


 

         大家可以看到我的sda的主设备号是8,次设备号是0,而sdb、sdc和sdd的硬盘的主次设备号分别是8:16,8:32和8:48,而sda1是分区,主次设备号是8:1。为什么会有这样的主次设备号呢,这又是怎么定义的呢。各种设备的主次设备号,应该说都是由Linux Assigned Names And Numbers Authority(LANANA)来定义的。当前最新的定义在这里网址上(http://www.lanana.org/docs/device-list/devices-2.6+.txt)。大家可以下下来看,这是09年4月最新的。我们来看这张表,查找到第8项,看看下面的内容,我贴出来(为了方便,以后我就叫这张为定义表):

 

8 block SCSI disk devices (0-15)
                           0 = /dev/sda First SCSI disk whole disk
                           16 = /dev/sdb Second SCSI disk whole disk
                           32 = /dev/sdc Third SCSI disk whole disk
                           ...
                           240 = /dev/sdp Sixteenth SCSI disk whole disk

                           Partitions are handled in the same way as for IDE
                           disks (see major number 3) except that the limit on
                           partitions is 15.


         我们看到,第8项的定义是block,即是块设备,并且是scsi disk devices(scsi硬盘设备),后面的(0-15)即是说可以挂载0到15的16个scsi硬盘。我们可以看到,每个硬盘又可以有16个分区,即8:0是/dev/sda,8:1是/dev/sda1 ...,8:16是/dev/sdb ...。对比我们前面的那张图就明白了设备的主次设备号了,呵呵。其它的设备的主次设备号可以参考表中的其它部分。
         linux就是通过这些主次设备号去访问和操作这些设备的,在linux的2.4或更早一些的内核中,主设备号是1-255,次设备号也是1-255的范围内,但随着新设备的加入,这显然是不够用的,所以在2.6内核后,就扩展了主次设备号。我们可以看下我们上面说的定义表,在255后面就是---LARGE MAJORS!!!!!---了,再后面就是一些必须在系统里的链接等等。

 

         参考文章:《udev – A Userspace Implementation of devfs》


来自   https://blog.csdn.net/fjb2080/article/details/4860912

普通分类: