原创文章,转载请著名出处,谢谢!
作者:清林,博客名:飞空静渡
二、设备的命名问题
我们来看下系统对设备的命名有什么问题。举个大家经常遇到的问题来说,例如你有 2个 usb移动硬盘,那么当你插入第 1个 usb移动硬盘时,这个移动硬盘就有可能命名了 /dev/sdb(假设你的 /dev/sda是系统里的 sata硬盘)。当你再插入第 2个 usb移动硬盘时,这个移动硬盘就有可能命名为 /dev/sdc了。但是,当你重启系统的时候,你可以保证 /dev/sdb就是你前面的第一个移动硬盘吗,这个很难说,这个有时候是,有时候不是,这要看你插在哪个 usb接口。
一般,当我们将一个设备加入系统的时候,我们的系统就会为这个设备所属的类型找到下一个可用的主次设备号(这个主次设备号是有对应的固定的名称的,前面已经看到)。例如我们的第一个 usb移动硬盘的主次设备号是 8:16( /dev/sdb),那么我们再插入第二个 usb移动硬盘时,那么就会分配下个可用的主次设备号即是 8: 32( /dev/sdc)给第二个 usb移动硬盘。
对于其它的可以热插拔的设备来说,也存在这些类似的情况。
在 linux的 2.5内核后,增加进来了 sysfs,使得我们可以容易辨别哪个设备名(或主次设备号)对应的是哪个设备。对于硬盘,你可以运行:
sudo hdparm -i /dev/sda
下面使我的电脑的输出:
可以看到我的是 MAXTOR生产的,序列号是 5RY0G1PT。根据上面的信息,我们可以確定一个设备。
三、主次设备号的限制
在linux系统中,是用 8位(即一个字节)来表示主设备号和次设备号的,即是说主次设备号的范围都是 0到 255。随着新设备的增加,可用的主设备号就会变得越来越少(块设备和字设备可共用一个主设备号,系统会区别对待它们)。
但是,如有人需要大量的设备,那么这些设备号就有可能不够用了。举例来说,有一个厂商,他的系统需要 4000个硬盘。而系统呢,我们前面看到过那个定义表,系统只为每个硬盘保留 16个次设备号,这就限制了每个硬盘只有 16个分区。如果 4000个硬盘,每个硬盘 16个分区的话,那么就有 64000个分区,而系统里只保留 16个硬盘每个硬盘 16个分区,总共也只能表示 16* 16= 256个分区,即是说 64000个分区就得需要 64000/256= 250个主设备号。如果我们不算其它的设备,那么一个字节( 8位)可以表示 256个主设备号,那么应该是够用的,但是前面也说过了,其它的设备号都是有保留的,都是保留给其它的设备使用了,我们的磁盘系统不能够去占用其它系统的主设备号。如果我们非得要占用,那么用户空间必须要知道被保留的主设备号被当前的磁盘系统给占用了。
由于这个限制呢,很多人都要求扩大表示主次设备号的字节数,这样就可以表示更多的设备。然而最大的问题仍然是:怎么通知用户空间,哪个主次设备号已经被使用了。
即 使扩充了主次设备号的表示数量,要求为不同的系统保留一个范围的主次设备号仍然存在,以后仍然会要求扩大主次设备号的表示数量。这就要求我们必须有一种外 部的命名机制,即使将来我们用完了这些主次设备号。就是这样,如果我们的内核可以只为那些连接到系统里的设备动态的分配主次设备号,那么我们要求的固定的 主次设备号也不是必需的,因而我们的主次设备号也不会用完。但这又是刚才我在上面提到的那个问题,就是用户空间根本不知道哪个设备被分配了哪个主次设备号 (就是 sdb和 sdc到底代表的是哪个设备)。
很少内核会去分配次设备号的,在 2.2内核后, usb的子系统会为 usb设备分配次设备号,但最大的问题还是哪个设备被分配了哪个设备号,一个方案是查看系统的内核日志来確定。在 2.5内核加入 sysfs后,这个问题就变得容易了。
参考文章:《udev – A Userspace Implementation of devfs》
来源:http://blog.youkuaiyun.com/fjb2080/archive/2009/11/24/4863661.aspx