Linuxで認識できるディスクの最大パーティション数は幾つなのか

Home > Software > ソフトウエア開発・サーバ管理のメモ帳 > このページ

Last Update 2023/09/14

 

 

Linuxで扱えるディスクの最大パーティション数には次のような制限があるという

パーティション数制限の【都市伝説】
Format Type Disk Type 最大パーティション数
GPT 128
MBR (DOS) IDE 63 ?
SCSI (SATA) 16 ?

10年以上前のことだが、20パーティションほどに区切ったハードディスクに新たなパーティションを追加しLinuxをインストールしようとしたところ、16パーティション以上が強制削除されてしまった苦い経験がある

現在でもこのような「理不尽な」制限は存在するのか。そもそもパーティションの最大数の制限は幾つなのか、改めて徹底調査してみた

 

はじめに、最近のLinuxの代表例としてUbuntu22.04で最大パーティション数が「16に引き下げられていない」ことを確認。次に、最大パーティション数が16だったと記憶している2000年代前半のVine Linux 4で「状況が確実に再現する」ことを再確認した

この制限がどこから来ているのか、Fedora系とRedHat系のそれぞれで、fdiskのソースコードを年代別に調査してみたところ、「制限のあった年代」がほぼ判明した

今回調べた内容をもとに、最大パーティション数の制限を一覧表に取りまとめた

今回調査して判明したパーティション数制限の詳細
Format Type Disk Type Debian系 RedHat系
2000年〜2005年頃 2005年頃〜現在
GPT 128 128
MBR (DOS) IDE 60 60 (system)
16 (fdisk)
60
SCSI (SATA) 60 16 60

 

 

もくじ

 

 

VMWareでのテスト環境、仮想ディスクの準備

今回利用した仮想マシンはVMware Player 16.2.5

そしてVMWare内でUbuntu22.04を起動し、fdiskで次の2種類のテスト用仮想ディスクを作成

この2種類の仮想ディスクを、(VMWare内にインストールした)Linuxの各バージョンで読み取った

最近のLinuxディストリ(Ubuntu 22.04)での状況確認

fdiskで16パーティションを超えるSATAとIDEディスクを扱う

SATA, IDEディスクともに、16パーティション以上を正しく認識している

$ cat /etc/os-release  | grep -e VERSION=
VERSION="22.04.3 LTS (Jammy Jellyfish)"
$ uname -a
Linux Ubuntu2204-vm 6.2.0-32-generic #32~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 18 10:40:13 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
$ fdisk -v
fdisk from util-linux 2.37.2

$ sudo fdisk /dev/sdd    ※ SATAディスクのパーティション一覧を表示する

fdisk (util-linux 2.37.2) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。


コマンド (m でヘルプ): p
ディスク /dev/sdd: 1 GiB, 1073741824 バイト, 2097152 セクタ
Disk model: VMware Virtual S
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x14116609

デバイス   起動 開始位置 最後から  セクタ サイズ Id タイプ
/dev/sdd1           2048  2097151 2095104  1023M  5 拡張領域
/dev/sdd5           4096    36863   32768    16M 83 Linux
/dev/sdd6          38912    71679   32768    16M 83 Linux
/dev/sdd7          73728   106495   32768    16M 83 Linux
/dev/sdd8         108544   141311   32768    16M 83 Linux
/dev/sdd9         143360   176127   32768    16M 83 Linux
/dev/sdd10        178176   210943   32768    16M 83 Linux
/dev/sdd11        212992   245759   32768    16M 83 Linux
/dev/sdd12        247808   280575   32768    16M 83 Linux
/dev/sdd13        282624   315391   32768    16M 83 Linux
/dev/sdd14        317440   350207   32768    16M 83 Linux
/dev/sdd15        352256   385023   32768    16M 83 Linux
/dev/sdd16        387072   419839   32768    16M 83 Linux
/dev/sdd17        421888   454655   32768    16M 83 Linux
/dev/sdd18        456704   489471   32768    16M 83 Linux
/dev/sdd19        491520   524287   32768    16M 83 Linux
/dev/sdd20        526336   559103   32768    16M 83 Linux
/dev/sdd21        561152   593919   32768    16M 83 Linux

コマンド (m でヘルプ): q

$ sudo fdisk /dev/sda    ※ IDEディスクのパーティション一覧を表示する

fdisk (util-linux 2.37.2) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。


コマンド (m でヘルプ): p
ディスク /dev/sda: 1 GiB, 1073741824 バイト, 2097152 セクタ
Disk model: VMware Virtual I
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xa9d78f78

デバイス   起動 開始位置 最後から  セクタ サイズ Id タイプ
/dev/sda1           2048  2097151 2095104  1023M  5 拡張領域
/dev/sda5           4096    36863   32768    16M 83 Linux
/dev/sda6          38912    71679   32768    16M 83 Linux
/dev/sda7          73728   106495   32768    16M 83 Linux
/dev/sda8         108544   141311   32768    16M 83 Linux
/dev/sda9         143360   176127   32768    16M 83 Linux
/dev/sda10        178176   210943   32768    16M 83 Linux
/dev/sda11        212992   245759   32768    16M 83 Linux
/dev/sda12        247808   280575   32768    16M 83 Linux
/dev/sda13        282624   315391   32768    16M 83 Linux
/dev/sda14        317440   350207   32768    16M 83 Linux
/dev/sda15        352256   385023   32768    16M 83 Linux
/dev/sda16        387072   419839   32768    16M 83 Linux
/dev/sda17        421888   454655   32768    16M 83 Linux
/dev/sda18        456704   489471   32768    16M 83 Linux
/dev/sda19        491520   524287   32768    16M 83 Linux
/dev/sda20        526336   559103   32768    16M 83 Linux
/dev/sda21        561152   593919   32768    16M 83 Linux

コマンド (m でヘルプ): 

dmesgでのシステム認識状況は

Linuxカーネルも、SATA, IDEディスクともに正しくパーティション数を認識している

※ SATAディスク /dev/sddの認識ログ
scsi 2:0:0:0: Direct-Access     ATA      VMware Virtual S 0001 PQ: 0 ANSI: 5
sd 2:0:0:0: [sdd] 2097152 512-byte logical blocks: (1.07 GB/1.00 GiB)
sd 2:0:0:0: [sdd] Write Protect is off
sd 2:0:0:0: [sdd] Mode Sense: 00 3a 00 00
sd 2:0:0:0: [sdd] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
sd 2:0:0:0: [sdd] Preferred minimum I/O size 512 bytes
sdd: sdd1 < sdd5 sdd6 sdd7 sdd8 sdd9 sdd10 sdd11 sdd12 sdd13 sdd14 sdd15 sdd16 
sdd17 sdd18 sdd19 sdd20 sdd21 >
sd 2:0:0:0: [sdd] Attached SCSI disk

※ IDEディスク /dev/sdaの認識ログ
sd 0:0:0:0: Attached scsi generic sg0 type 0
sd 0:0:0:0: [sda] 2097152 512-byte logical blocks: (1.07 GB/1.00 GiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DP
O or FUA
sd 0:0:0:0: [sda] Preferred minimum I/O size 512 bytes
sda: sda1 < sda5 sda6 sda7 sda8 sda9 sda10 sda11 sda12 sda13 sda14 sda15 sda16 
sda17 sda18 sda19 sda20 sda21 >
sd 0:0:0:0: [sda] Attached SCSI disk

 

 

2000年代初頭のLinuxディストリ(Vine Linux 4)での状況確認

Linuxのインストール時

Linuxのインストール時に制限に引っかかった場合は、次のようなメッセージが表示され、インストールできなかった

Error informing the kernel about modifications to partition /dev/sda16 無効な引数です

This means Linux won't know about any changes you made to /dev/sda16 until you reboot

An unhandled exception has occured

fdiskで16パーティションを超えるSATAとIDEディスクを扱う

SATA, IDEディスクともに、16パーティション以上は認識できていない

$ cat /etc/vine-release
Vine Linux 4.0 (Latour)
$ uname -a
Linux localhost.localdomain 2.6.16-0vl60 #1 SMP Fri Oct 27 03:39:46 JST 2006 i686 i686 i386 GNU/Linux
$ fdisk -v
fdisk v2.12p

$ sudo fdisk /dev/sdb    ※ SATAディスクのパーティション一覧を表示する

このディスクのシリンダ数は 4112 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
Warning: omitting partitions after #15.
They will be deleted if you save this partition table.

コマンド (m でヘルプ): p

Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 2 sectors/track, 4112 cylinders
Units = シリンダ数 of 510 * 512 = 261120 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sdb1               5        4113     1047552    5  拡張領域
/dev/sdb5               9          73       16384   83  Linux
/dev/sdb6              77         141       16384   83  Linux
/dev/sdb7             145         209       16384   83  Linux
/dev/sdb8             213         278       16384   83  Linux
/dev/sdb9             282         346       16384   83  Linux
/dev/sdb10            350         414       16384   83  Linux
/dev/sdb11            418         482       16384   83  Linux
/dev/sdb12            486         551       16384   83  Linux
/dev/sdb13            555         619       16384   83  Linux
/dev/sdb14            623         687       16384   83  Linux
/dev/sdb15            691         755       16384   83  Linux

コマンド (m でヘルプ): q

$ sudo fdisk /dev/hda    ※ IDEディスクのパーティション一覧を表示する

このディスクのシリンダ数は 1885 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
Warning: omitting partitions after #15.
They will be deleted if you save this partition table.

コマンド (m でヘルプ): p

Disk /dev/hda: 1073 MB, 1073741824 bytes
139 heads, 8 sectors/track, 1885 cylinders
Units = シリンダ数 of 1112 * 512 = 569344 bytes

 デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1               2        1886     1047552    5  拡張領域
/dev/hda5               4          34       16384   83  Linux
/dev/hda6              35          65       16384   83  Linux
/dev/hda7              67          96       16384   83  Linux
/dev/hda8              98         128       16384   83  Linux
/dev/hda9             129         159       16384   83  Linux
/dev/hda10            161         190       16384   83  Linux
/dev/hda11            192         222       16384   83  Linux
/dev/hda12            223         253       16384   83  Linux
/dev/hda13            255         284       16384   83  Linux
/dev/hda14            286         315       16384   83  Linux
/dev/hda15            317         347       16384   83  Linux

コマンド (m でヘルプ):

dmesgでのシステム認識状況は

Linuxカーネルは、SATAディスクは16パーティション以上を認識していない一方、IDEディスクは正しくパーティション数を認識している

※ SATAディスク /dev/sdbの認識ログ
sd 0:0:0:0: Attached scsi disk sda
Vendor: VMware,   Model: VMware Virtual S  Rev: 1.0
Type:   Direct-Access                      ANSI SCSI revision: 02
SCSI device sdb: 2097152 512-byte hdwr sectors (1074 MB)
sdb: Write Protect is off
sdb: Mode Sense: 61 00 00 00
sdb: cache data unavailable
sdb: assuming drive cache: write through
SCSI device sdb: 2097152 512-byte hdwr sectors (1074 MB)
sdb: Write Protect is off
sdb: Mode Sense: 61 00 00 00
sdb: cache data unavailable
sdb: assuming drive cache: write through
sdb: sdb1 < sdb5 sdb6 sdb7 sdb8 sdb9 sdb10 sdb11 sdb12 sdb13 sdb14 sdb15 >
sd 0:0:1:0: Attached scsi disk sdb

※ IDEディスク /dev/hdaの認識ログ
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
PIIX4: IDE controller at PCI slot 0000:00:07.1
PIIX4: chipset revision 1
PIIX4: not 100% native mode: will probe irqs later
ide0: BM-DMA at 0x1060-0x1067, BIOS settings: hda:DMA, hdb:pio
ide1: BM-DMA at 0x1068-0x106f, BIOS settings: hdc:DMA, hdd:pio
Probing IDE interface ide0...
hda: VMware Virtual IDE Hard Drive, ATA DISK drive
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
hda: max request size: 128KiB
hda: 2097152 sectors (1073 MB) w/32KiB Cache, CHS=2080/16/63, UDMA(33)
hda: hda1 < hda5 hda6 hda7 hda8 hda9 hda10 hda11 hda12 hda13 hda14 hda15 hda16
hda17 hda18 hda19 hda20 hda21 >

partedではどうなのか

カーネルで16を超えるパーティションを正しく認識できているIDEディスクについては、partedも正しく認識できている

$ sudo parted /dev/hda
GNU Parted 1.6.25.1
Copyright (C) 1998 - 2005 Free Software Foundation, Inc.
このプログラムは GPL に基づいたフリーソフトウェアです。
日本語訳に関しては Hiroshi Takekawa  までおねがいします。

本プログラムは有用とは思いますが、頒布にあたっては、市場性及び特定目的適合性についての暗黙の保証を含めて、いかなる保証も行ないません。詳細についてはGNU
一般公有使用許諾書をお読みください。
/dev/hda を使用
(parted) p
/dev/hdaの Disk geometry: 0kB - 1074MB
ディスクラベルの種類: msdos
番号    開始    終了    サイズ  タイプ    ファイルシステム フラグ
1       1049kB  1074MB  1073MB  拡張
5       2097kB  19MB    17MB    論理
6       20MB    37MB    17MB    論理
7       38MB    55MB    17MB    論理
8       56MB    72MB    17MB    論理
9       73MB    90MB    17MB    論理
10      91MB    108MB   17MB    論理
11      109MB   126MB   17MB    論理
12      127MB   144MB   17MB    論理
13      145MB   161MB   17MB    論理
14      163MB   179MB   17MB    論理
15      180MB   197MB   17MB    論理
16      198MB   215MB   17MB    論理
17      216MB   233MB   17MB    論理
18      234MB   251MB   17MB    論理
19      252MB   268MB   17MB    論理
20      269MB   286MB   17MB    論理
21      287MB   304MB   17MB    論理
(parted)

しかし、カーネルで16を超える部分が認識できていないSATAディスクについては、partedはエラーを吐き出しながらも正しく認識だけはしているようです

この状態では何が起こるかわからず、実質的に利用不可能と考えて良いと思います

$ sudo parted /dev/sdb
GNU Parted 1.6.25.1
Copyright (C) 1998 - 2005 Free Software Foundation, Inc.
このプログラムは GPL に基づいたフリーソフトウェアです。
日本語訳に関しては Hiroshi Takekawa  までおねがいします。

本プログラムは有用とは思いますが、頒布にあたっては、市場性及び特定目的適合性についての暗黙の保証を含めて、いかなる保証も行ないません。詳細についてはGNU
一般公有使用許諾書をお読みください。
/dev/sdb を使用
(parted) p


You found a bug in GNU Parted.
This may have been fixed in the last version of GNU Parted that you can find at:        http://ftp.gnu.org/gnu/parted/
If this has not been fixed or if you don't know how to check, please email:
        bug-parted@gnu.org
or (preferably) file a bug report at:
        http://parted.alioth.debian.org/bugs/
Your report should contain the version of this release (1.6.25.1) along with thefollowing message and preferably additional information about your setup.
Refer to the web site of parted
        http://www.gnu.org/software/parted/parted.html
for more informations of what could be useful for bug submitting!

Assertion (cyl_size > 0) at disk_dos.c:583 in function
probe_partition_for_geom() failed.

無視(I)/Ignore/取消(C)/Cancel? C


/dev/sdbの Disk geometry: 0kB - 1074MB
ディスクラベルの種類: msdos
番号    開始    終了    サイズ  タイプ    ファイルシステム フラグ
1       1049kB  1074MB  1073MB  拡張
5       2097kB  19MB    17MB    論理
6       20MB    37MB    17MB    論理
7       38MB    55MB    17MB    論理
8       56MB    72MB    17MB    論理
9       73MB    90MB    17MB    論理
10      91MB    108MB   17MB    論理
11      109MB   126MB   17MB    論理
12      127MB   144MB   17MB    論理
13      145MB   161MB   17MB    論理
14      163MB   179MB   17MB    論理
15      180MB   197MB   17MB    論理
16      198MB   215MB   17MB    論理
17      216MB   233MB   17MB    論理
18      234MB   251MB   17MB    論理
19      252MB   268MB   17MB    論理
20      269MB   286MB   17MB    論理
21      287MB   304MB   17MB    論理
(parted)

 

 

Debian系 パーティション数制限の一覧とソースコード検索

リリース年 ディストリ ver util-linux ver MAXIMUM_PARTS
2005年 Ubuntu 5.04 (kernel 2.6.10) 2.12p 60
2009年 Debian 5.0 (kernel 2.6.26) 2.13.1.1-1 60
2015年 Debian 8.0 (kernel 3.16.0) 2.25.2-6 60
2022年 Ubuntu 22.04 (kernel 5.15〜6.2) 2.37.2 60

2005年リリースのディストリより、およそ5年毎に調べてみた結果、パーティション数に独自の制限を設けているものは見当たらなかった

Ubuntuは直近バージョンの22.04と、最も古い5.04を除いてソースパッケージの配布サイトを見つけられなかったので、上位のDebian5.0と8.0を途中の年代のサンプルとした

 

Ubuntu 5.04(2005年リリース)

ソースコードは Ubuntu 5.04 (Hoary Hedgehog) Source CD より、ubuntu-5.04-src-1.iso をダウンロードする

ディストリのパッチファイルも含め、MAXIMUM_PARTSが書き換えられている場所は発見できなかった

# isoファイルをマウントし、util-linux関連ファイルを検索
Ubuntu 5.04 Src-1$ find ./ -name 'util-linux*' -print
./pool/main/u/util-linux
./pool/main/u/util-linux/util-linux_2.12p-2ubuntu2.dsc
./pool/main/u/util-linux/util-linux_2.12p-2ubuntu2.diff.gz
./pool/main/u/util-linux/util-linux_2.12p.orig.tar.gz

# ファイルを、Homeディレクトリ内に作成したワークディレクトリに展開
$ mkdir ~/util-linux_2.12p
$ tar xvf ./pool/main/u/util-linux/util-linux_2.12p.orig.tar.gz -C ~/util-linux_2.12p/
$ gzip -cd ./pool/main/u/util-linux/util-linux_2.12p-2ubuntu2.diff.gz > ~/util-linux_2.12p/util-linux_2.12p-2ubuntu2.diff
$ cd ~/util-linux_2.12p

# キーワード検索
util-linux_2.12p$ grep -e 'MAXIMUM_PARTS' -R *
src/fdisk/cfdisk.c:#define MAXIMUM_PARTS 60
src/fdisk/cfdisk.c:partition_info p_info[MAXIMUM_PARTS];
src/fdisk/cfdisk.c:int logical_sectors[MAXIMUM_PARTS];
src/fdisk/cfdisk.c:    if (num_parts == MAXIMUM_PARTS) {
src/fdisk/cfdisk.c:	    } while (pn < 4 && logical < MAXIMUM_PARTS-4);
src/fdisk/fdisk.h:#define MAXIMUM_PARTS	60
src/fdisk/fdisk.c:} ptes[MAXIMUM_PARTS];
src/fdisk/fdisk.c:	for (i = 0; i < MAXIMUM_PARTS; i++)
src/fdisk/fdisk.c:		if (partitions >= MAXIMUM_PARTS) {
src/fdisk/fdisk.c:			   this program uses arrays of size MAXIMUM_PARTS.
src/fdisk/fdisk.c:	if (!free_primary && partitions >= MAXIMUM_PARTS) {
src/fdisk/fdisk.c:	} else if (partitions >= MAXIMUM_PARTS) {
src/fdisk/fdiskaixlabel.h:extern char changed[MAXIMUM_PARTS];

 

Debian 5.0(2009年リリース)

Debianの各バージョンのutil-linuxパッケージは http://archive.debian.org/debian/pool/main/u/util-linux/ からダウンロードできる。特定のDebianのバージョンで、どのバージョンのutil-linuxが使われているかは、(例えばDebian5.0の場合は)http://archive.debian.org/debian/dists/lenny/main/binary-i386/に格納されているSourcesファイルにパッケージ一覧が書かれているので、それを参考とする

Debian 5.0 lenny の場合
$ mkdir util-linux_2.13.1.1
$ tar xvf util-linux_2.13.1.1.orig.tar.gz -C ./util-linux_2.13.1.1/
$ gzip -cd util-linux_2.13.1.1-1.diff.gz > ./util-linux_2.13.1.1/util-linux_2.13.1.1-1.diff
$ cd util-linux_2.13.1.1/

util-linux_2.13.1.1$ grep -e 'MAXIMUM_PARTS' -R *
util-linux-ng-2.13.1.1/fdisk/cfdisk.c:#define MAXIMUM_PARTS 60
util-linux-ng-2.13.1.1/fdisk/cfdisk.c:partition_info p_info[MAXIMUM_PARTS];
util-linux-ng-2.13.1.1/fdisk/cfdisk.c:int logical_sectors[MAXIMUM_PARTS];
util-linux-ng-2.13.1.1/fdisk/cfdisk.c:    if (num_parts == MAXIMUM_PARTS) {
util-linux-ng-2.13.1.1/fdisk/cfdisk.c:	    } while (pn < 4 && logical < MAXIMUM_PARTS-4);
util-linux-ng-2.13.1.1/fdisk/fdisk.h:#define MAXIMUM_PARTS	60
util-linux-ng-2.13.1.1/fdisk/fdisk.c:} ptes[MAXIMUM_PARTS];
util-linux-ng-2.13.1.1/fdisk/fdisk.c:	for (i = 0; i < MAXIMUM_PARTS; i++)
util-linux-ng-2.13.1.1/fdisk/fdisk.c:		if (partitions >= MAXIMUM_PARTS) {
util-linux-ng-2.13.1.1/fdisk/fdisk.c:			   this program uses arrays of size MAXIMUM_PARTS.
util-linux-ng-2.13.1.1/fdisk/fdisk.c:	if (!free_primary && partitions >= MAXIMUM_PARTS) {
util-linux-ng-2.13.1.1/fdisk/fdisk.c:	} else if (partitions >= MAXIMUM_PARTS) {

 

Debian 8.0(2015年リリース)

Debian 8.0 jessie の場合
$ mkdir util-linux_2.25.2
$ tar -xvf util-linux_2.25.2.orig.tar.xz -C util-linux_2.25.2/
$ tar -xvf util-linux_2.25.2-6.debian.tar.xz -C util-linux_2.25.2/
$ cd util-linux_2.25.2

util-linux_2.25.2$ grep -e 'MAXIMUM_PARTS' -R *
util-linux-2.25.2/libfdisk/src/dos.c:#define MAXIMUM_PARTS	60
util-linux-2.25.2/libfdisk/src/dos.c:	struct pte	ptes[MAXIMUM_PARTS];	/* partition */
util-linux-2.25.2/libfdisk/src/dos.c:		if (cxt->label->nparts_max >= MAXIMUM_PARTS) {
util-linux-2.25.2/libfdisk/src/dos.c:			   this program uses arrays of size MAXIMUM_PARTS.
util-linux-2.25.2/libfdisk/src/dos.c:	if (!free_primary && cxt->label->nparts_max >= MAXIMUM_PARTS) {
util-linux-2.25.2/libfdisk/src/dos.c:	} else if (cxt->label->nparts_max >= MAXIMUM_PARTS) {

 

Ubuntu 22.04(2022年リリース)

この記事を書いた時点(2023年8月)での最新のステーブル・バージョンであるUbuntu 22.04にも、ディストリが独自にutil-linuxの最大パーティション数の制限を書き換えているようなことはなかった

linux-utils (fdisk) に加え、parted にもパーティション数の制限書き換えがないか確認してみる

直近数年間にリリースされたバージョンのソースコードは https://packages.ubuntu.com/ からダウンロードできる

util-linux-2.37.2$ grep -e 'MAXIMUM_PARTS' -R *
libfdisk/src/dos.c:#define MAXIMUM_PARTS	60
libfdisk/src/dos.c:	struct pte	ptes[MAXIMUM_PARTS];	/* partition */
libfdisk/src/dos.c:		if (cxt->label->nparts_max >= MAXIMUM_PARTS) {
libfdisk/src/dos.c:			   this program uses arrays of size MAXIMUM_PARTS.
libfdisk/src/dos.c:	if (cxt->label->nparts_max >= MAXIMUM_PARTS) {

parted-3.4$ grep -e 'MAX_NUM_PARTS' -R *
libparted/arch/linux.c:#define MAX_NUM_PARTS		64
libparted/arch/linux.c:                return MAX_NUM_PARTS;
libparted/arch/linux.c:                return MAX_NUM_PARTS;

 

 

RedHat系 パーティション数制限の一覧とソースコード検索

リリース年 ディストリ ver util-linux ver MAXIMUM_PARTS
2000年 Vine Linux 2.0 2.9z 60
2002年 Vine Linux 2.5 2.11n 16
2004年 Vine Linux 3.0 2.11z 16
2005年 CentOS 4.0 2.12a 16
2006年 Vine Linux 4.0 2.12p 16
2009年 Vine Linux 5.0 2.14 60
2011年 CentOS 6.0 2.17 60
2019年 CentOS 8.0 2.32 60

2009年以前にリリースされたものでは、最大パーティション数の制限値が60から16まで引き下げられていたことがわかった

最新版のディストリビューションでは、この制限値引き下げは行われていないが、将来に渡ってこれが維持されるかはわからない

fdisk実行時に「警告: 16 以降の領域を削除します」などのメッセージが表示されたら要注意である

 

Vine Linux 2.0(2000年リリース)

$ wget http://ftp.kddilabs.jp/pub/Linux/packages/Vine/Vine-2.0/SRPMS/SRPMS/util-linux-2.9z-2.src.rpm
$ 7z x util-linux-2.9z-2.src.rpm
$ 7z x util-linux-2.9z-2.src.cpio -o./util-linux-2.9z
$ cd util-linux-2.9z/
util-linux-2.9z$ tar -xvf util-linux-2.9z.tar.gz

util-linux-2.9z$ grep -e 'MAXIMUM_PARTS' -R *
util-linux-2.9z/fdisk/fdisksunlabel.c:	for (i = 1; i < MAXIMUM_PARTS; i++)
util-linux-2.9z/fdisk/cfdisk.c:#define MAXIMUM_PARTS 60
util-linux-2.9z/fdisk/cfdisk.c:partition_info p_info[MAXIMUM_PARTS];
util-linux-2.9z/fdisk/cfdisk.c:int logical_sectors[MAXIMUM_PARTS];
util-linux-2.9z/fdisk/cfdisk.c:    if (num_parts == MAXIMUM_PARTS) {
util-linux-2.9z/fdisk/cfdisk.c:	    } while (pn < 4 && logical < MAXIMUM_PARTS-4);
util-linux-2.9z/fdisk/fdisksgilabel.h:extern char changed[MAXIMUM_PARTS];
util-linux-2.9z/fdisk/fdisksunlabel.h:extern char changed[MAXIMUM_PARTS];
util-linux-2.9z/fdisk/fdisk.h:#define MAXIMUM_PARTS	60
util-linux-2.9z/fdisk/fdisk.c:	changed[MAXIMUM_PARTS],		/* marks changed buffers */
util-linux-2.9z/fdisk/fdisk.c:	*buffers[MAXIMUM_PARTS]		/* pointers to buffers */
util-linux-2.9z/fdisk/fdisk.c:	offsets[MAXIMUM_PARTS] = {0, 0, 0, 0};
util-linux-2.9z/fdisk/fdisk.c:struct	partition *part_table[MAXIMUM_PARTS]	/* partitions */
util-linux-2.9z/fdisk/fdisk.c:	*ext_pointers[MAXIMUM_PARTS]		/* link pointers */
util-linux-2.9z/fdisk/fdisk.c:		if (partitions >= MAXIMUM_PARTS) {
util-linux-2.9z/fdisk/fdisk.c:			   this program uses arrays of size MAXIMUM_PARTS.
util-linux-2.9z/fdisk/fdisk.c:	for (i = 1; i < MAXIMUM_PARTS; i++)
util-linux-2.9z/fdisk/fdisk.c:	if (partitions >= MAXIMUM_PARTS) {
util-linux-2.9z/fdisk/fdiskaixlabel.h:extern char changed[MAXIMUM_PARTS];

 

Vine Linux 2.5(2002年リリース)

$ wget http://ftp.kddilabs.jp/pub/Linux/packages/Vine/Vine-2.5/i386/SRPMS.main/SRPMS/util-linux-2.11n-4vl5.src.rpm
$ 7z x util-linux-2.11n-4vl5.src.rpm
$ 7z x util-linux-2.11n-4vl5.src.cpio -o./util-linux-2.11n
$ cd util-linux-2.11n/
util-linux-2.11n$ tar -xvf util-linux-2.11n.tar.bz2

util-linux-2.11n$ grep -e 'MAXIMUM_PARTS' -R *
util-linux-2.11n/fdisk/cfdisk.c:#define MAXIMUM_PARTS 60
util-linux-2.11n/fdisk/cfdisk.c:partition_info p_info[MAXIMUM_PARTS];
util-linux-2.11n/fdisk/cfdisk.c:int logical_sectors[MAXIMUM_PARTS];
util-linux-2.11n/fdisk/cfdisk.c:    if (num_parts == MAXIMUM_PARTS) {
util-linux-2.11n/fdisk/cfdisk.c:	    } while (pn < 4 && logical < MAXIMUM_PARTS-4);
util-linux-2.11n/fdisk/fdisk.h:#define MAXIMUM_PARTS	60
util-linux-2.11n/fdisk/fdisk.c:} ptes[MAXIMUM_PARTS];
util-linux-2.11n/fdisk/fdisk.c:	for (i = 0; i < MAXIMUM_PARTS; i++)
util-linux-2.11n/fdisk/fdisk.c:		if (partitions >= MAXIMUM_PARTS) {
util-linux-2.11n/fdisk/fdisk.c:			   this program uses arrays of size MAXIMUM_PARTS.
util-linux-2.11n/fdisk/fdisk.c:	if (partitions >= MAXIMUM_PARTS) {
util-linux-2.11n/fdisk/fdiskaixlabel.h:extern char changed[MAXIMUM_PARTS];
util-linux-2.11n-miscfixes.patch:-#define MAXIMUM_PARTS	60
util-linux-2.11n-miscfixes.patch:+#define MAXIMUM_PARTS	16

 

Vine Linux 3.0(2004年リリース)

$ wget http://ftp.kddilabs.jp/pub/Linux/packages/Vine/Vine-3.0/SRPMS/SRPMS/util-linux-2.11z-0vl1.src.rpm
$ 7z x util-linux-2.11z-0vl1.src.rpm
$ 7z x util-linux-2.11z-0vl1.src.cpio -o./util-linux-2.11z
$ cd util-linux-2.11z/
util-linux-2.11z$ tar -xvf util-linux-2.11z.tar.bz2

util-linux-2.11z$ grep -e 'MAXIMUM_PARTS' -R *
util-linux-2.11y-fdisksegv-103954.patch:! 	if (!free_primary && partitions >= MAXIMUM_PARTS) {
util-linux-2.11y-fdisksegv-103954.patch:! 	if (partitions >= MAXIMUM_PARTS) {
util-linux-2.11z/fdisk/cfdisk.c:#define MAXIMUM_PARTS 60
util-linux-2.11z/fdisk/cfdisk.c:partition_info p_info[MAXIMUM_PARTS];
util-linux-2.11z/fdisk/cfdisk.c:int logical_sectors[MAXIMUM_PARTS];
util-linux-2.11z/fdisk/cfdisk.c:    if (num_parts == MAXIMUM_PARTS) {
util-linux-2.11z/fdisk/cfdisk.c:	    } while (pn < 4 && logical < MAXIMUM_PARTS-4);
util-linux-2.11z/fdisk/fdisk.h:#define MAXIMUM_PARTS	60
util-linux-2.11z/fdisk/fdisk.c:} ptes[MAXIMUM_PARTS];
util-linux-2.11z/fdisk/fdisk.c:	for (i = 0; i < MAXIMUM_PARTS; i++)
util-linux-2.11z/fdisk/fdisk.c:		if (partitions >= MAXIMUM_PARTS) {
util-linux-2.11z/fdisk/fdisk.c:			   this program uses arrays of size MAXIMUM_PARTS.
util-linux-2.11z/fdisk/fdisk.c:	if (!free_primary && partitions >= MAXIMUM_PARTS) {
util-linux-2.11z/fdisk/fdiskaixlabel.h:extern char changed[MAXIMUM_PARTS];
util-linux-2.11z-miscfixes.patch:-#define MAXIMUM_PARTS	60
util-linux-2.11z-miscfixes.patch:+#define MAXIMUM_PARTS	16

 

CentOS 4.0(2005年リリース)

$ wget https://vault.centos.org/4.0/os/SRPMS/util-linux-2.12a-16.EL4.6.src.rpm
$ 7z x util-linux-2.12a-16.EL4.6.src.rpm
$ 7z x util-linux-2.12a-16.EL4.6.src.cpio -o./util-linux-2.12a
$ cd util-linux-2.12a/
util-linux-2.12a$ tar -xvf util-linux-2.12a.tar.gz

util-linux-2.12a$ grep -e 'MAXIMUM_PARTS' -R *
util-linux-2.11y-fdisksegv-103954.patch:! 	if (!free_primary && partitions >= MAXIMUM_PARTS) {
util-linux-2.11y-fdisksegv-103954.patch:! 	if (partitions >= MAXIMUM_PARTS) {
util-linux-2.12a/fdisk/cfdisk.c:#define MAXIMUM_PARTS 60
util-linux-2.12a/fdisk/cfdisk.c:partition_info p_info[MAXIMUM_PARTS];
util-linux-2.12a/fdisk/cfdisk.c:int logical_sectors[MAXIMUM_PARTS];
util-linux-2.12a/fdisk/cfdisk.c:    if (num_parts == MAXIMUM_PARTS) {
util-linux-2.12a/fdisk/cfdisk.c:	    } while (pn < 4 && logical < MAXIMUM_PARTS-4);
util-linux-2.12a/fdisk/fdisk.h:#define MAXIMUM_PARTS	60
util-linux-2.12a/fdisk/fdisk.c:} ptes[MAXIMUM_PARTS];
util-linux-2.12a/fdisk/fdisk.c:	for (i = 0; i < MAXIMUM_PARTS; i++)
util-linux-2.12a/fdisk/fdisk.c:		if (partitions >= MAXIMUM_PARTS) {
util-linux-2.12a/fdisk/fdisk.c:			   this program uses arrays of size MAXIMUM_PARTS.
util-linux-2.12a/fdisk/fdisk.c:	if (!free_primary && partitions >= MAXIMUM_PARTS) {
util-linux-2.12a/fdisk/fdisk.c:	} else if (partitions >= MAXIMUM_PARTS) {
util-linux-2.12a/fdisk/fdiskaixlabel.h:extern char changed[MAXIMUM_PARTS];
util-linux-2.12a-partlimit.patch:-#define MAXIMUM_PARTS	60
util-linux-2.12a-partlimit.patch:+#define MAXIMUM_PARTS	16

 

Vine Linux 4.0(2006年リリース)

$ wget http://ftp.kddilabs.jp/pub/Linux/packages/Vine/Vine-4.0/SRPMS/SRPMS/util-linux-2.12p-0vl5.src.rpm
$ 7z x util-linux-2.12p-0vl5.src.rpm
$ 7z x util-linux-2.12p-0vl5.src.cpio -o./util-linux-2.12p
$ cd util-linux-2.12p/
util-linux-2.12p$ tar -xvf util-linux-2.12p.tar.gz

util-linux-2.12p$ grep -e 'MAXIMUM_PARTS' -R *
util-linux-2.11y-fdisksegv-103954.patch:! 	if (!free_primary && partitions >= MAXIMUM_PARTS) {
util-linux-2.11y-fdisksegv-103954.patch:! 	if (partitions >= MAXIMUM_PARTS) {
util-linux-2.12a-partlimit.patch:-#define MAXIMUM_PARTS	60
util-linux-2.12a-partlimit.patch:+#define MAXIMUM_PARTS	15
util-linux-2.12p/fdisk/cfdisk.c:#define MAXIMUM_PARTS 60
util-linux-2.12p/fdisk/cfdisk.c:partition_info p_info[MAXIMUM_PARTS];
util-linux-2.12p/fdisk/cfdisk.c:int logical_sectors[MAXIMUM_PARTS];
util-linux-2.12p/fdisk/cfdisk.c:    if (num_parts == MAXIMUM_PARTS) {
util-linux-2.12p/fdisk/cfdisk.c:	    } while (pn < 4 && logical < MAXIMUM_PARTS-4);
util-linux-2.12p/fdisk/fdisk.h:#define MAXIMUM_PARTS	60
util-linux-2.12p/fdisk/fdisk.c:} ptes[MAXIMUM_PARTS];
util-linux-2.12p/fdisk/fdisk.c:	for (i = 0; i < MAXIMUM_PARTS; i++)
util-linux-2.12p/fdisk/fdisk.c:		if (partitions >= MAXIMUM_PARTS) {
util-linux-2.12p/fdisk/fdisk.c:			   this program uses arrays of size MAXIMUM_PARTS.
util-linux-2.12p/fdisk/fdisk.c:	if (!free_primary && partitions >= MAXIMUM_PARTS) {
util-linux-2.12p/fdisk/fdisk.c:	} else if (partitions >= MAXIMUM_PARTS) {
util-linux-2.12p/fdisk/fdiskaixlabel.h:extern char changed[MAXIMUM_PARTS];

 

Vine Linux 5.0(2009年リリース)

$ wget http://ftp.kddilabs.jp/pub/Linux/packages/Vine/Vine-5.0/SRPMS/SRPMS.main/util-linux-ng-2.14.1-2vl5.src.rpm
$ 7z x util-linux-ng-2.14.1-2vl5.src.rpm
$ 7z x util-linux-ng-2.14.1-2vl5.src.cpio -o./util-linux-ng-2.14
$ cd util-linux-ng-2.14/
util-linux-ng-2.14$ tar -xvf util-linux-ng-2.14.1.tar.bz2

util-linux-ng-2.14$ grep -e 'MAXIMUM_PARTS' -R *
util-linux-ng-2.14.1/fdisk/cfdisk.c:#define MAXIMUM_PARTS 60
util-linux-ng-2.14.1/fdisk/cfdisk.c:partition_info p_info[MAXIMUM_PARTS];
util-linux-ng-2.14.1/fdisk/cfdisk.c:int logical_sectors[MAXIMUM_PARTS];
util-linux-ng-2.14.1/fdisk/cfdisk.c:    if (num_parts == MAXIMUM_PARTS) {
util-linux-ng-2.14.1/fdisk/cfdisk.c:	    } while (pn < 4 && logical < MAXIMUM_PARTS-4);
util-linux-ng-2.14.1/fdisk/fdisk.h:#define MAXIMUM_PARTS	60
util-linux-ng-2.14.1/fdisk/fdisk.c:} ptes[MAXIMUM_PARTS];
util-linux-ng-2.14.1/fdisk/fdisk.c:	for (i = 0; i < MAXIMUM_PARTS; i++)
util-linux-ng-2.14.1/fdisk/fdisk.c:		if (partitions >= MAXIMUM_PARTS) {
util-linux-ng-2.14.1/fdisk/fdisk.c:			   this program uses arrays of size MAXIMUM_PARTS.
util-linux-ng-2.14.1/fdisk/fdisk.c:	if (!free_primary && partitions >= MAXIMUM_PARTS) {
util-linux-ng-2.14.1/fdisk/fdisk.c:	} else if (partitions >= MAXIMUM_PARTS) {

 

CentOS 5.0(2011年リリース)

$ wget https://vault.centos.org/6.0/os/SRPMS/Packages/util-linux-ng-2.17.2-6.el6.src.rpm
$ 7z x util-linux-ng-2.17.2-6.el6.src.rpm
$ 7z x util-linux-ng-2.17.2-6.el6.src.cpio -o./util-linux-ng-2.17
$ cd util-linux-ng-2.17/
util-linux-ng-2.17$ tar -xvf util-linux-ng-2.17.2.tar.bz2

util-linux-ng-2.17$ grep -e 'MAXIMUM_PARTS' -R *
util-linux-ng-2.17.2/fdisk/cfdisk.c:#define MAXIMUM_PARTS 60
util-linux-ng-2.17.2/fdisk/cfdisk.c:partition_info p_info[MAXIMUM_PARTS];
util-linux-ng-2.17.2/fdisk/cfdisk.c:long long logical_sectors[MAXIMUM_PARTS];
util-linux-ng-2.17.2/fdisk/cfdisk.c:    if (num_parts == MAXIMUM_PARTS) {
util-linux-ng-2.17.2/fdisk/cfdisk.c:	    } while (pn < 4 && logical < MAXIMUM_PARTS-4);
util-linux-ng-2.17.2/fdisk/fdisk.h:#define MAXIMUM_PARTS	60
util-linux-ng-2.17.2/fdisk/fdisk.c:} ptes[MAXIMUM_PARTS];
util-linux-ng-2.17.2/fdisk/fdisk.c:	for (i = 0; i < MAXIMUM_PARTS; i++)
util-linux-ng-2.17.2/fdisk/fdisk.c:		if (partitions >= MAXIMUM_PARTS) {
util-linux-ng-2.17.2/fdisk/fdisk.c:			   this program uses arrays of size MAXIMUM_PARTS.
util-linux-ng-2.17.2/fdisk/fdisk.c:	if (!free_primary && partitions >= MAXIMUM_PARTS) {
util-linux-ng-2.17.2/fdisk/fdisk.c:	} else if (partitions >= MAXIMUM_PARTS) {

 

CentOS 8.0(2019年リリース)

$ wget https://vault.centos.org/8.0.1905/BaseOS/Source/SPackages/util-linux-2.32.1-8.el8.src.rpm
$ 7z x util-linux-2.32.1-8.el8.src.rpm
$ 7z x util-linux-2.32.1-8.el8.src.cpio -o./util-linux-2.32
$ cd util-linux-2.32/
util-linux-2.32$ tar -xvf util-linux-2.32.1.tar.xz

util-linux-2.32$ grep -e 'MAXIMUM_PARTS' -R *
util-linux-2.32.1/libfdisk/src/dos.c:#define MAXIMUM_PARTS	60
util-linux-2.32.1/libfdisk/src/dos.c:	struct pte	ptes[MAXIMUM_PARTS];	/* partition */
util-linux-2.32.1/libfdisk/src/dos.c:		if (cxt->label->nparts_max >= MAXIMUM_PARTS) {
util-linux-2.32.1/libfdisk/src/dos.c:			   this program uses arrays of size MAXIMUM_PARTS.
util-linux-2.32.1/libfdisk/src/dos.c:	if (!free_primary && cxt->label->nparts_max >= MAXIMUM_PARTS) {
util-linux-2.32.1/libfdisk/src/dos.c:	} else if (cxt->label->nparts_max >= MAXIMUM_PARTS) {

 

 

パーティション数制限あり/なしのfdiskソースコード比較

パーティション制限なしの場合(Ubuntu 22.04)

util-linuxソースパッケージをくわしく観察すると、MBRでのパーティションはfdiskでは 1から59まで、partedでは1から63までとなっている

util-linux-2.37.2  ->  /libfdisk/src/dos.c
#define MAXIMUM_PARTS    60

// 〜 途中省略 〜

static void read_extended(struct fdisk_context *cxt, size_t ext)
{
size_t i;
struct pte *pex, *pe;
struct dos_partition *p, *q;
struct fdisk_dos_label *l = self_label(cxt);

l->ext_index = ext;
pex = self_pte(cxt, ext);
if (!pex) {
DBG(LABEL, ul_debug("DOS: uninitialized pointer to %zu pex", ext));
return;
}
pex->ex_entry = pex->pt_entry;

p = pex->pt_entry;
if (!dos_partition_get_start(p)) {
fdisk_warnx(cxt, _("Bad offset in primary extended partition."));
return;
}

DBG(LABEL, ul_debug("DOS: Reading extended %zu", ext));

while (IS_EXTENDED (p->sys_ind)) {
        if (cxt->label->nparts_max >= MAXIMUM_PARTS) {
    /* This is not a Linux restriction, but
        this program uses arrays of size MAXIMUM_PARTS.
        Do not try to `improve' this test. */
    struct pte *pre = self_pte(cxt,
                cxt->label->nparts_max - 1);
    fdisk_warnx(cxt,
    _("Omitting partitions after #%zu. They will be deleted "
        "if you save this partition table."),
        cxt->label->nparts_max);

    if (pre) {
        clear_partition(pre->ex_entry);
        partition_set_changed(cxt,
                cxt->label->nparts_max - 1, 1);
    }
    return;
}

 

パーティション制限ありの場合(Vine Linux 2.5)

util-linux-2.11n-4vl5.src.rpm -> fdisk/fdisk.h
/*
   fdisk.h
*/

#define DEFAULT_SECTOR_SIZE	512
#define MAX_SECTOR_SIZE	2048
#define SECTOR_SIZE	512	/* still used in BSD code */
#define MAXIMUM_PARTS	60
            
util-linux-2.11n-4vl5.src.rpm -> fdisk/fdisk.c
if (partitions >= MAXIMUM_PARTS) {
    /* This is not a Linux restriction, but
       this program uses arrays of size MAXIMUM_PARTS.
       Do not try to `improve' this test. */
    struct pte *pre = &ptes[partitions-1];

    fprintf(stderr,
        _("Warning: deleting partitions after %d\n"),
        partitions);
    clear_partition(pre->ext_pointer);
    pre->changed = 1;
    return;
}
util-linux-2.11n-4vl5.src.rpm -> util-linux-2.11n-miscfixes.patch
--- util-linux-2.11n/fdisk/fdisk.h.miscfixes	Thu Sep 13 19:05:35 2001
+++ util-linux-2.11n/fdisk/fdisk.h	Wed Dec 26 16:57:41 2001
@@ -5,7 +5,7 @@
 #define DEFAULT_SECTOR_SIZE	512
 #define MAX_SECTOR_SIZE	2048
 #define SECTOR_SIZE	512	/* still used in BSD code */
-#define MAXIMUM_PARTS	60
+#define MAXIMUM_PARTS	16
util-linux-2.11n-4vl5.src.rpm -> README.fdisk

DOS and Linux both allow you to access several partitions on a single disk; on DOS these are treated as if they were separate disks or drives, and under Linux they are treated as different "devices".

You can have up to 64 partitions on a single IDE disk, or up to 16 partitions on a single SCSI disk, at least as far as Linux is concerned; in practice you will rarely want so many.