(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
エラー表示されたときのパーティションの様子
[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を実行すると
[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 では、最大パーティション数を超えた場合に警告表示をして、表示を切り捨てる仕様のようです
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.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