(Linux)最大16パーティションの壁

Linuxをインストールするマシンに、16個以上のパーティションがある場合、次のようなエラーが出てパーティションの作成に失敗するときがある。

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

エラー表示されたときのパーティションの様子

Vine Linux 3.2でfdiskを実行したときの表示例
[root@localhost root]# fdisk /dev/hda
 
このディスクのシリンダ数は 30401 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
(例. DOS FDISK, OS/2 FDISK)
 
警告: 16 以降の領域を削除します
 
コマンド (m でヘルプ): p
 
Disk /dev/hda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
 
デバイス ブート始点 終点  ブロック ID システム
/dev/hda1 *      1   255   2048256  b Win95 FAT32
/dev/hda2      256 30401 242147745  f Win95 拡張領域 (LBA)
/dev/hda5      256  2424  17422461  b Win95 FAT32
/dev/hda6     2425  3699  10241406  b Win95 FAT32
/dev/hda7     3700  4974  10241406  b Win95 FAT32
/dev/hda8     4975  6886  15358108+ 7 HPFS/NTFS
/dev/hda9     6887  8798  15358108+ 7 HPFS/NTFS
/dev/hda10    8799 10710  15358108+ 7 HPFS/NTFS
/dev/hda11   10711 11985  10241406 83 Linux
/dev/hda12   11986 13260  10241406 83 Linux
/dev/hda13   13261 13515   2048256 82 Linux スワップ
/dev/hda14   13516 19889  51199123+ 7 HPFS/NTFS
/dev/hda15   19890 22439  20368271+ 7 HPFS/NTFS
/dev/hda16   22440 24989  20368271+ 7 HPFS/NTFS
 
コマンド (m でヘルプ):

17~19のパーティションはどこいったんだ...
「16以降のパーティションを削除しました」 ... このメッセージ辺りに問題がありそうです。
最近は、最大パーティション数が16に制限される動きでもあるのだろうか

別のディストリビューションでfdiskを実行すると

Fedora Core 5でfdiskを実行したときの表示例
[root@localhost ~]# fdisk /dev/sda
 
The number of cylinders for this disk is set to 30401.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)
Warning: omitting partitions after #15.
They will be deleted if you save this partition table.
 
Command (m for help): 

ここで、「 w 」コマンドで編集結果をセーブすると、16以降は削除されてしまうのだろうか...

fdiskのソースコードを読んでみる

Vine Linux の配布サイトより、util-linux-2.11z-0vl1.src.rpm をダウンロードしてソースコードをちょっと解析してみる

fdisk.h で最大のパーティション数を定義しています

#define MAXIMUM_PARTS 60

fdisk.c では、最大パーティション数を超えた場合に警告表示をして、表示を切り捨てる仕様のようです

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;
}

ソースコードを見た限りでは、19個程度のパーティション切りでは問題ないように見えます。

しかし、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.

fdisk.c をざっとみたところで、hdx と sdx にパーティション数を扱い分けている記述は見つからない。

ソースコードのパッケージファイルに、RedHatが自らのディストリビューション用にカスタマイズした内容が治められたファイルを見てみる

util-linux-2.11z-miscfixes.patch
--- util-linux-2.11r/fdisk/fdisk.h.sopwith Thu Sep 13 19:05:35 2001
+++ util-linux-2.11r/fdisk/fdisk.h Thu Jun 27 07:52:12 2002
@@ -5,7 +5,7 @@
-#define MAXIMUM_PARTS 60
+#define MAXIMUM_PARTS 16

もうずっと前に、パーティション数が 60 から 16 に変更されているようだ

いつの間に変更されたんだ...

失敗例:パーティション タイプを0xffにして回避しようとする

ためしに、第19パーティション /dev/hda19 のファイルシステム属性を 0x07 (NTFS) から 0xff (undefined) に変更する。MS-DOS版のRanish Partition Managerで属性を変更した。

Fedora Core 5 インストーラを再度起動する。

パーティションの設定画面(disk druid)で、/dev/sda19 が 「free」と報告されている。

0xff 属性は不可視なのか...

いったん不可視にしたパーティションを元に戻せることを確認するため、再びファイルシステム属性を 0x07 にしようと Partition Manager を起動して先ほどのパーティションを表示する。 パーティションが消えている。

いつの間にかパーティションが開放されている。 (原因不明)

パーティションがぶっ飛びました

パーティション復元の挑戦 (1)市販 ファイナルデータ2006 特別復元版

ドライブを指定して、パーティションを検索させる。復元できそうな領域が二つ見つかる。
クリックしてみると、「フォーマット形式 : FAT32」

パーティションサイズはいい加減だわ、その上システム属性は「NTFSでなくFAT32」。
論理パーティションの先頭からダンプして、FATテーブルがあるのか、I ノード・テーブルがあるのか、それすら分からないとは...

全く使い物になりません。

パーティション復元の挑戦 (2)Linuxのparted

partedには16パーティションの制限は無いようなので、これを使って復元作業をしてみる。まずは、現在の状況を調べる

[root@localhost root]# parted /dev/hda
GNU Parted 1.6.25
Copyright (C) 1998 - 2005 Free Software Foundation, Inc.
このプログラムは GPL に基づいたフリーソフトウェアです。
日本語訳に関しては Hiroshi Takekawa <sian@big.or.jp> までおねがいします。
 
本プログラムは有用とは思いますが、頒布にあたっては、市場性及び特定目的適合性についての暗黙の保証を含めて、いかなる保証も行ないません。詳細についてはGNU
一般公有使用許諾書をお読みください。
/dev/hda を使用
(parted) print
/dev/hdaの Disk geometry: 0kB - 250GB
ディスクラベルの種類: msdos
番号 開始  終了    サイズ  タイプ      ファイルシステム フラグ
1  32kB    2097MB  2097MB  プライマリ  fat32            boot
2  2097MB  250GB   248GB   拡張        lba
5  2097MB  20GB    18GB    論理        fat32
6  20GB    30GB    10GB    論理        fat32
7  30GB    41GB    10GB    論理        fat32
8  41GB    57GB    16GB    論理        ntfs
9  57GB    72GB    16GB    論理        ntfs
10 72GB    88GB    16GB    論理        ntfs
11 88GB    99GB    10GB    論理        ext3
12 99GB    109GB   10GB    論理        ext3
13 109GB   111GB   2097MB  論理        linux-swap
14 111GB   164GB   52GB    論理        ntfs
15 164GB   185GB   21GB    論理        ntfs
16 185GB   206GB   21GB    論理        ntfs
17 206GB   216GB   10GB    論理        ntfs
18 216GB   227GB   10GB    論理        ntfs
(parted)

第19パーティションはやはり消去されてしまっているようだ。

ファイルのバックアップをとった後に、パーティション15~18をいったん削除して、ひとつの大きなパーティションにする。第19パーティション(だった)領域に掛からないように、少し小さめのサイズとする。

[root@localhost root]# parted /dev/hda
GNU Parted 1.6.25
Copyright (C) 1998 - 2005 Free Software Foundation, Inc.
このプログラムは GPL に基づいたフリーソフトウェアです。
日本語訳に関しては Hiroshi Takekawa <sian@big.or.jp> までおねがいします。
 
本プログラムは有用とは思いますが、頒布にあたっては、市場性及び特定目的適合性についての暗黙の保証を含めて、いかなる保証も行ないません。詳細についてはGNU
一般公有使用許諾書をお読みください。
/dev/hda を使用
(parted) print
/dev/hdaの Disk geometry: 0kB - 250GB
ディスクラベルの種類: msdos
番号 開始  終了    サイズ  タイプ      ファイルシステム フラグ
1  32kB    2097MB  2097MB  プライマリ  fat32            boot
2  2097MB  250GB   248GB   拡張        lba
5  2097MB  20GB    18GB    論理        fat32
6  20GB    30GB    10GB    論理        fat32
7  30GB    41GB    10GB    論理        fat32
8  41GB    57GB    16GB    論理        ntfs
9  57GB    72GB    16GB    論理        ntfs
10 72GB    88GB    16GB    論理        ntfs
11 88GB    99GB    10GB    論理        ext3
12 99GB    109GB   10GB    論理        ext3
13 109GB   111GB   2097MB  論理        linux-swap
14 111GB   164GB   52GB    論理        ntfs
15 164GB   216GB   52GB    論理        ntfs
(parted)

もとあった第19パーティションと同じ位置にパーティションを新規作成する。

[root@localhost root]# parted /dev/hda
GNU Parted 1.6.25
Copyright (C) 1998 - 2005 Free Software Foundation, Inc.
このプログラムは GPL に基づいたフリーソフトウェアです。
日本語訳に関しては Hiroshi Takekawa <sian@big.or.jp> までおねがいします。
 
本プログラムは有用とは思いますが、頒布にあたっては、市場性及び特定目的適合性についての暗黙の保証を含めて、いかなる保証も行ないません。詳細についてはGNU
一般公有使用許諾書をお読みください。
/dev/hda を使用
(parted) unit chs
(parted) print
/dev/hdaの Disk geometry: 0,0,0 - 30401,80,62
BIOS シリンダ、ヘッド、セクタ geometry: 30401,255,63. 1シリンダは 8225kB。
ディスクラベルの種類: msdos
番号 開始 終了 タイプ ファイルシステム フラグ
1  0,1,0     254,254,62   プライマリ fat32 boot
2  255,0,0   30400,254,62 拡張       lba
5  255,1,0   2423,254,62  論理       fat32
6  2424,1,0  3698,254,62  論理       fat32
7  3699,1,0  4973,254,62  論理       fat32
8  4974,1,0  6885,254,62  論理       ntfs
9  6886,1,0  8797,254,62  論理       ntfs
10 8798,1,0  10709,254,62 論理       ntfs
11 10710,1,0 11984,254,62 論理       ext3
12 11985,1,0 13259,254,62 論理       ext3
13 13260,1,0 13514,254,62 論理       linux-swap
14 13515,1,0 19888,254,62 論理       ntfs
15 19889,1,0 26262,254,62 論理       ntfs
(parted) mkpart logical ntfs 27539,1,0 30300,254,62
(parted) print
/dev/hdaの Disk geometry: 0,0,0 - 30401,80,62
BIOS シリンダ、ヘッド、セクタ geometry: 30401,255,63. 1シリンダは 8225kB。
ディスクラベルの種類: msdos
番号 開始 終了 タイプ ファイルシステム フラグ
1  0,1,0     254,254,62   プライマリ fat32 boot
2  255,0,0   30400,254,62 拡張       lba
5  255,1,0   2423,254,62  論理       fat32
6  2424,1,0  3698,254,62  論理       fat32
7  3699,1,0  4973,254,62  論理       fat32
8  4974,1,0  6885,254,62  論理       ntfs
9  6886,1,0  8797,254,62  論理       ntfs
10 8798,1,0  10709,254,62 論理       ntfs
11 10710,1,0 11984,254,62 論理       ext3
12 11985,1,0 13259,254,62 論理       ext3
13 13260,1,0 13514,254,62 論理       linux-swap
14 13515,1,0 19888,254,62 論理       ntfs
15 19889,1,0 26262,254,62 論理       ntfs
16 27539,1,0 30300,254,62 論理       ntfs
(parted)

次のようにマウントすれば、ちゃんとアクセスすることが出来る。

[root@localhost root]# mount -t ntfs /dev/hda16 /mnt/hda16