Introduction
A few years ago the Linux kernel used to support a Pata or IDE disk with 63 partitions and a SCSI/Sata/USB disk with 15 partitions. Later this was standardised that every hard disk was to have 15 partitions maximum.
Well just like an old woman Linux could not make up its mind and now with the new 2.6.28 kernel the maximum number of partition in a hard disk has been changed again. It is so bad that no one seems to know what is the current limit.
The old limit was set by two parameters known as the major and minor numbers where together provide 256 block devices for each type of controller. The IDE channels have 4 devices of hda, hdb, hdc and hdd so each hard disk plus it disk name make up 64 devices names (hda, hda1 to hda63). A maximum 4 hard disks give a total of 256 devices names.
Sata/SCSI/USB hard disks achieve this by a maximum of 16 disks. Again the 256 is a product of 16 disk x16 device names.
The current break through apparent is due to the major and minor numbers no longer static but can be dynamically changed according to the user usage.
The pain with partitioning
The pain is due to the change being so new that Linux basic partitioning tools like fdisk, cfdisk and sfdisk do not know what to do and so they respond in different ways. The new change can play havoc with some installers that have not yet been modified to match the new change.
Here are a few reactions I have encountered
(i) sfdisk can apparently handle a maximum 130 partitions in a hard disk but the created partition table is rejected by cfdisk.
(ii) fdisk has never been able to show more than 60 partitions. The Red Hat version family distros used to display only 15 but now all of them will display 60 maximum.
(iii) cfdisk used to be able to partition up to 63 partitions but the last 3 may not be reliable. It is still the same.
The safest number of partitions that can be accepted by all three partitioning tools are around 56 partitions. This is from trial and error with the current kernel. I expect the situation will improve with time.
Fun with partitioning
I think it is fun to generate a large number of partitions in a hard disk by a script. First I tried with Python with this script
Basicall I bought a 1.5Tb hard disk hooked up as sdb. It has 182041 cylinders so I just make up commands in sfdisk to create 182 partition each 1000 cylinder large (about 8Gb). The above script generate an output file called "try" which I ran as a Bash script.Code:f=file('try','w') f.write('sfdisk /dev/sdb << EOF\n') f.write(',1000,L\n') f.write(',1000,L\n') f.write(',1000,L\n') f.write(',,E\n') i=0 y=',1000,L\n' cylin=182041 while cylin > 1000: cylin=cylin-1000 f.write(y) i=i+1 f.write(',,L\n') f.write('EOF\n') print 'No. of partitions = ',i f.close()
Sfdisk only accepted the instructions for the first 130 partitions and ignore the rest of the commands.
As reported earlier cfdisk and fdisk didn't like this partition table with 130 partitions but I managed get Ubuntu to format the 130th partition and put files in it. Thus I know it works.
To play safe I decided to use fdisk and wrote a script for it. Funny enough the partition table generation works only for cfdisk if the number of partition terminates at 56 and not beyond. Here I wrote in Python script to generate an output file called "gen56" list as follow
To run it I just issue the commandCode:d 1 d 2 d 3 d 4 n p 1 1 10000 n p 2 10001 20000 n p 3 20001 30000 n e 4 n 30001 32000 n 32001 34000 n 34001 36000 n 36001 38000 n 38001 40000 n 40001 42000 n 42001 44000 n 44001 46000 n 46001 48000 n 48001 50000 n 50001 52000 n 52001 54000 n 54001 56000 n 56001 58000 n 58001 60000 n 60001 62000 n 62001 64000 n 64001 66000 n 66001 68000 n 68001 70000 n 70001 72000 n 72001 74000 n 74001 76000 n 76001 78000 n 78001 80000 n 80001 82000 n 82001 84000 n 84001 86000 n 86001 88000 n 88001 90000 n 90001 92000 n 92001 94000 n 94001 96000 n 96001 98000 n 98001 100000 n 100001 102000 n 102001 104000 n 104001 106000 n 106001 108000 n 108001 110000 n 110001 112000 n 112001 114000 n 114001 116000 n 116001 118000 n 118001 120000 n 120001 122000 n 122001 124000 n 124001 126000 n 126001 128000 n 128001 130000 n 130001 132000 n 132001 134000 w q
The code actually deletes all the previous 4 primaries and regenerate 3 primaries and one extended partition to put in 2000 cylinders each. I have increased the 3 primaries (first 3 partitions) to 10,000 cylinders. If a user deletes an extended partition all the logical partition inside will be gone so nuking the 4 primaries will clear a hard disk completely.Code:fdisk /dev/sdb < gen56
The partition table now looks like this
The last partition I created in cfdisk manually to store my personal data.Code:root@DL:/media/16GB_1STFAT/Sam-office/office cabinet/Linux/64partitions# fdisk -l /dev/sdb Disk /dev/sdb: 1500.3 GB, 1500301910016 bytes 255 heads, 63 sectors/track, 182401 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x58e84b8a Device Boot Start End Blocks Id System /dev/sdb1 1 10000 80324968+ 83 Linux /dev/sdb2 10001 20000 80325000 83 Linux /dev/sdb3 20001 30000 80325000 83 Linux /dev/sdb4 30001 182401 1224161032+ 5 Extended /dev/sdb5 30001 32000 16064968+ 83 Linux /dev/sdb6 32001 34000 16064968+ 83 Linux /dev/sdb7 34001 36000 16064968+ 83 Linux /dev/sdb8 36001 38000 16064968+ 83 Linux /dev/sdb9 38001 40000 16064968+ 83 Linux /dev/sdb10 40001 42000 16064968+ 83 Linux /dev/sdb11 42001 44000 16064968+ 83 Linux /dev/sdb12 44001 46000 16064968+ 83 Linux /dev/sdb13 46001 48000 16064968+ 83 Linux /dev/sdb14 48001 50000 16064968+ 83 Linux /dev/sdb15 50001 52000 16064968+ 83 Linux /dev/sdb16 52001 54000 16064968+ 83 Linux /dev/sdb17 54001 56000 16064968+ 83 Linux /dev/sdb18 56001 58000 16064968+ 83 Linux /dev/sdb19 58001 60000 16064968+ 83 Linux /dev/sdb20 60001 62000 16064968+ 83 Linux /dev/sdb21 62001 64000 16064968+ 83 Linux /dev/sdb22 64001 66000 16064968+ 83 Linux /dev/sdb23 66001 68000 16064968+ 83 Linux /dev/sdb24 68001 70000 16064968+ 83 Linux /dev/sdb25 70001 72000 16064968+ 83 Linux /dev/sdb26 72001 74000 16064968+ 83 Linux /dev/sdb27 74001 76000 16064968+ 83 Linux /dev/sdb28 76001 78000 16064968+ 83 Linux /dev/sdb29 78001 80000 16064968+ 83 Linux /dev/sdb30 80001 82000 16064968+ 83 Linux /dev/sdb31 82001 84000 16064968+ 83 Linux /dev/sdb32 84001 86000 16064968+ 83 Linux /dev/sdb33 86001 88000 16064968+ 83 Linux /dev/sdb34 88001 90000 16064968+ 83 Linux /dev/sdb35 90001 92000 16064968+ 83 Linux /dev/sdb36 92001 94000 16064968+ 83 Linux /dev/sdb37 94001 96000 16064968+ 83 Linux /dev/sdb38 96001 98000 16064968+ 83 Linux /dev/sdb39 98001 100000 16064968+ 83 Linux /dev/sdb40 100001 102000 16064968+ 83 Linux /dev/sdb41 102001 104000 16064968+ 83 Linux /dev/sdb42 104001 106000 16064968+ 83 Linux /dev/sdb43 106001 108000 16064968+ 83 Linux /dev/sdb44 108001 110000 16064968+ 83 Linux /dev/sdb45 110001 112000 16064968+ 83 Linux /dev/sdb46 112001 114000 16064968+ 83 Linux /dev/sdb47 114001 116000 16064968+ 83 Linux /dev/sdb48 116001 118000 16064968+ 83 Linux /dev/sdb49 118001 120000 16064968+ 83 Linux /dev/sdb50 120001 122000 16064968+ 83 Linux /dev/sdb51 122001 124000 16064968+ 83 Linux /dev/sdb52 124001 126000 16064968+ 83 Linux /dev/sdb53 126001 128000 16064968+ 83 Linux /dev/sdb54 128001 130000 16064968+ 83 Linux /dev/sdb55 130001 132000 16064968+ 83 Linux /dev/sdb56 132001 134000 16064968+ 83 Linux /dev/sdb57 134001 182401 388781001 83 Linux
To demonstrate the change of major and minor numbers I post the following terminal commands/output
The red and purple figures are the major and minor numbers. In kernels older than 2.6.28 the major number does not change for a hard disk. Now a switch is done after the 15th partition.Code:root@DL:/media/16GB_1STFAT/Sam-office/office cabinet/Linux/64partitions# ls -l /dev/sdb brw-rw---- 1 root disk 8, 16 2009-03-08 22:15 /dev/sdb root@DL:/media/16GB_1STFAT/Sam-office/office cabinet/Linux/64partitions# ls -l /dev/sdb1 brw-rw---- 1 root disk 8, 17 2009-03-08 22:15 /dev/sdb1 root@DL:/media/16GB_1STFAT/Sam-office/office cabinet/Linux/64partitions# ls -l /dev/sdb15 brw-rw---- 1 root disk 8, 31 2009-03-08 22:15 /dev/sdb15 root@DL:/media/16GB_1STFAT/Sam-office/office cabinet/Linux/64partitions# ls -l /dev/sdb16 brw-rw---- 1 root disk 259, 0 2009-03-08 22:15 /dev/sdb16 root@DL:/media/16GB_1STFAT/Sam-office/office cabinet/Linux/64partitions# ls -l /dev/sdb57 brw-rw---- 1 root disk 259, 41 2009-03-08 22:15 /dev/sdb57
How to use the 15+ partitions
The Linux with 2.6.28 kerenl seems to be able to cope with it.
I first tried an old distro Fedora 10 with a 2.6.27 kernel. The installer claimed it cannot seek partitions beyond sdb15. A forced installation beyond this point resulted in an error so I eventually installed it in sdb15.
DreamLinux 3.5 has a 2.6.28.5 kernel. Its installer was quite happy to let me specifying sdb56 for its installation. That works perfectly. I am using it to post this thread.
I also downloaded Zenwalk 6.0 but its installer refused to allow me to use sdb for installation. However when it offered sda partitions for installation I found sdb partitions also listed so I selected sdb55 for its installation. Zenwalk is based on Slackware which is a die-hard believer in Lilo that failed to get installed (as usual). I actually left with Zenwalk installed but without a boot loader. However Slackware is the easiest distro to boot. I fired it up with these commands in a Grub prompt
So if Linux can be installed in sdb55 and sdb56 then we are back to the good old days with at least 63 partition possible in each hard disk.Code:root (hd1,54) kernel /boot/vmlinuz ro root=/dev/sdb55 boot
Conclusions
Don't think I have found the maximum number of partitions supported by kernel 2.6.28 and later but 60 should be a safe number to work with as it is recognised by all the partitioning tools. I stopped at sdb56 because I used a script to create the partitions. Manually I have done it to 63 partition before.
This is uncharted territory so proceed with caution. The developer of turning the major/minor numbers from static to dynamic also is apparently unsure what could happen.
Have fun in breaking free from the 15-partition barrier!




Reply With Quote