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でのテスト環境、仮想ディスクの準備
- 最近のLinuxディストリ(Ubuntu 22.04)での状況確認
- 2000年代初頭のLinuxディストリ(Vine Linux 4)での状況確認
- Debian系 各バージョンでのfdiskソースコード解読
- RedHat系 各バージョンでのfdiskソースコード解読
- パーティション数制限あり/なしのfdiskソースコード比較
VMWareでのテスト環境、仮想ディスクの準備
今回利用した仮想マシンはVMware Player 16.2.5
そしてVMWare内でUbuntu22.04を起動し、fdiskで次の2種類のテスト用仮想ディスクを作成
- SATAディスク
dos(MBR)パーティションテーブル
論理パーティションを17個(No.5〜21)作成 - IDEディスク
dos(MBR)パーティションテーブル
論理パーティションを17個(No.5〜21)作成
この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.