Linux 内核使用静态的Major number和Minor number来进行SCSI设备的寻址,而系统为SCSI设备保留的Major和Minor是有个数限制的。所以根据可用的Major number不同,系统可支持的SCSI磁盘数量都有个数限制,不同的内核,支持的SCSI磁盘Major数量不一样。
对于Linux 2.4内核来讲,Major number数可以是128、256、2304,其表示Minor number的字段为8个bit,所以每个Major支持 2^8=256个Minor。按惯例每个SCSI磁盘有16个保留的Minor,所以每个磁盘可以有15个分区(还有1个Minor代表整个磁盘)。这样每个磁盘16个Minor,而最多每个Major可以有2^8=256个Minor,则每个Major最多可以支持256/16=16个SCSI磁盘。
比较老的Kernel一般为SCSI设备保留8个Major,分别是8, 65, 66, 67, 68, 79, 70, 71。在RHEL2和RHEL3中,使用这8个保留的Major号,所以OS支持的SCSI磁盘个数是 8×16=128 个。而早期的SUSE,例如SLES8可以支持256个SCSI设备是因为SUSE为SCSI定义了16个保留Major,分别是128, 129, 130, 131, 132, 133, 134, 135。
一般来讲,可以用下面的公式计算Linux内核支持的最大的磁盘数目:
(number of major numbers) × (number of minor numbers) ÷ (number of partitions)
新的2.6 Kernel使用动态配置的模式,会自动分配任何可用Major number。而在 Linux 2.6 内核中,表示 major 和 minor 的数据结构是一个32bit的字段 dev_t type (defined in <linux/types.h>),表示major 和 minor 的位数分别是 12 和 20 bits,相应地,2.6内核可以支持的磁盘数目就非常地大了。因为Major并不仅仅用于磁盘(/proc/devices ),所以不能以 2^12 个Major来计算磁盘个数,但仅仅一个Major可用的Minor数就已经达到 2^20=65536,而每个SCSI磁盘16个Minor的限制仍然不变,每个Major就可以支持2^20/16=4096个,所以整个系统可以支持的磁盘个数已经非常可观了。
注:
系统预先分配定义的Major列表可以在内核源码树的 Documentation/devices.txt 文件里找到。
Major numbers 60-63, 120-127, 240-254 是保留用于实验和内部用途的。