手動でパーティションサイズを変更する方法

●注意●
 ここで示す操作は上級者向けのものです。初心者向けではありません。ここで書かれた内容を理解できない場合は、絶対に操作しないでください。間違えると取り返しのつかない結果になる恐れがあります。



●Vista/2008/7では標準機能でパーティションサイズ変更ができるが
 Vista/2008/7では、ディスクの管理画面で、あるいはdiskpartコマンドで、データを残したままでパーティションのサイズを変更 ((拡大/縮小) することができる。しかし、Vistaより前のOSでは同じことを標準機能として行うことはできない。そのため、パーティションサイズの変更を行うためには、市販のユーティリティあるいはフリーソフトを使うのが一般的だ。
 しかし実は、パーティションサイズの変更はそれほど難しいことではなく、こうしたユーティリティを使わなくとも、パーティションのパラメータを書き換えてやるだけでできてしまう。ここではその方法を解説する。

 Windowsではパーティションのサイズを決めている場所は、基本パーティションの場合なら、MBR (パーティションテーブル) のパラメータとパーティションブートセクタのパラメータの2箇所だ。つまりパーティションサイズを変更するためには、この2箇所のパラメータを書き換えてやればよいことになる。ただし、単純に書き換えるだけでは、他の要素と矛盾や問題を起こす可能性もあるので、そうした齟齬が起きないように配慮する必要がある。
 まずこの方法でできることをはっきりさせておこう。第一に、サイズの変更はパーティションの最後の位置を移動させることで行う。最後の位置を前の方に移動させれば縮小になり、後ろの方に移動させれば拡大になる。なお、パーティションの先頭位置を移動させることはできない。パーティションの先頭位置を移動させるためには、パーティションの中のデータも移動させる必要があるため面倒であり、ここでは解説しない。
 第二に、パーティションを縮小する場合は、パーティション内にあるデータが記録されている最後の位置より前までパーティションの最後の位置を移動してはならない。実際問題として移動は可能だが、パーティションのサイズ外にはみ出したデータはアクセス不能となり失われる。
 つまり、パーティション内にあるデータのディスク上の位置を把握した上で、それよりサイズが小さくならないように設定しなければならないのだが、では、データのディスク上の位置をどうやって知ったらよいかという問題がある。Windows XPであれば、標準機能のデフラグで、パーティション内のおよそのデータ位置を知ることができるので、それを見た上で余裕を持ってサイズ設定を行えばよい。
 Vista/2008/7のデフラグではXPのようなグラフィック画面が表示されないため、データのディスク上の位置を知ることができないが、およその目安としては、データ用のパーティションの場合は、そのパーティションの空き容量の約半分程度は縮小できるだろう。OSをインストールしたパーティションの場合は、デフラグ後もシステムファイルがパーティションの後ろの位置に残ったままになる場合があるので、サイズの縮小は避けたほうが無難だ。
 第三に、パーティションを拡大する場合は、拡大できるだけの空き領域がそのパーティションの直後になければならない。直後以外の場所に空き領域があっても、それは利用できない。また、空き領域以上に拡大した場合は、重大な矛盾が起き、どんな不具合が起きるかわからないので、絶対にやってはいけない。
 そして第四に、サイズの拡大/縮小はジオメトリのシリンダサイズ単位で行う。今日の8GBを超えるサイズのHDDへのアクセスではジオメトリを使わないので、シリンダという概念がもはや実質的な意味を持っていないのだが、過去においてはパーティションはシリンダ境界で作成されるというルールがあり、アプリケーションの中にはそのルールを前提に作成されているものがないとは限らない。したがって、それに従わないと予期せぬトラブルの原因となりかねない。

●パーティションサイズの縮小方法
 サイズの縮小を行う前には必ずデフラグを実行して、データを極力ディスクの前の領域に移動する。その結果により、縮小後のパーティションサイズを決めておく。
画面1はデータパーティションの例で、デフラグの結果、データがパーティションの前半に集められ、大きな空き領域ができた。この場合ならパーティションサイズを約半分にすることができる。
なお、デフラグの画面から半分以下のサイズに縮小できるように思われる時でも、NTFSファイルシステムの場合は、実際にはパーティションの真中の位置にMFTのミラーが存在するため、サイズを半分以下にしてしまうと、MFTミラーがパーティション外になってしまう。MFTミラーをパーティション内に移動すればよいのだが、移動先が他のデータで使われていないことを確認する必要があるため面倒なので、サイズの縮小は元のサイズの半分より小さくならないようにしたほうが無難だ。FAT16/32の場合は半分以下に縮小しても大丈夫だ。
画面2はOSをインストールしたパーティションの例で、移動できないファイルがパーティションの後ろにあるため、デフラグしても空き領域がまとまらず、空き領域があるにもかかわらず、ほんのわずかしかサイズを縮小することができない。なお、ページングファイル (仮想メモリ) がパーティションの後ろに陣取っている場合は、一旦ページングファイルをなしに設定してデフラグを行ってからページングファイルを再度作れば、ページングファイルを前に移動することができる。

画面1:データパーティションのデフラグ画面。約半分のサイズに縮小可能だ。


画面2:OSをインストールしたパーティションのデフラグ画面。空き領域はあっても移動できないファイルが後ろの方にあるため、ほとんど縮小ができない。


パーティションの縮小方法−基本パーティションの場合
基本パーティションのサイズ変更は、MBR中のパーティションテーブルのサイズを規定するパラメータとパーティションブートセクタのサイズを規定するパラメータを変更することで行う。
1) Disk Probeを起動し、「Drives」メニューから「Physical Drives」をクリックする。
2) 「Available Physical Drives」ボックスから、サイズ変更したいドライブのあるHDDをダブルクリックし、「Handle 0」の「Read Only」のチェックを外し、「Set Active」ボタンをクリックし、「OK」ボタンをクリックする。
3) 「Sectors」メニューから「Read」をクリックする。
4) 「Starting Sector」が "0"、「Number of Sectors」が "1" のまま「Read」ボタンをクリックする。
5) 「View」メニューから「Partition table」をクリックする。
6) 「Partition table index」欄でサイズ変更したいパーティションをダブルクリックする (画面3)。「System ID」欄がサイズ変更したいパーティションのファイルシステムであることを確認する (ここが "Extendes" や "Extendes - LBA" になっている場合は拡張パーティションを示す)。

画面3:サイズ変更したいパーティションのパラメータを表示する。

7) 「Drive」メニューから「Volume Information」をクリックする。
8) 「Sectors / Track」と「Tracks / Cylinder」の値をメモして、「OK」ボタンをクリックする (画面4)。「Sectors / Track」×「Tracks / Cylinder」の値がシリンダサイズ (セクタ数) になる。

画面4:「Sectors / Track」×「Tracks / Cylinder」でシリンダサイズを計算する。

9) 「Total Sectors」の値をサイズ変更後の値に書き換える。このとき、対象のパーティションがHDDの最初の基本パーティションの場合は、8) で計算したシリンダサイズの倍数−63を入力する。対象のパーティションがHDDの2番目以降の基本パーティションの場合は、8) で計算したシリンダサイズの倍数を入力する (画面5)。なお、ここで入力したセクタ数×512がバイト数になる。入力したセクタ数もメモしておこう。
10) 「Sectors」メニューから「Write」をクリックする。
11) 「Starting sector to write data」に "0" が入っているまま「Write it」ボタンをクリックする。
12) 確認メッセージに対して「はい」をクリックする。
13) 「Relative Sector」の右にある「Go」ボタンをクリックする。
14) 対象パーティションのファイルシステムがNTFSなら、「View」メニューから「NTFS BootSector」をクリックする。また対称パーティションのファイルシステムがFAT16なら、「View」メニューから「FAT-16 BootSector」をクリックする。対称パーティションのファイルシステムがFAT32の場合は、「View」メニューから「Bytes」をクリックする。
15) NTFSの場合は、「Total sectors」の欄に、9) で入力したセクタ数−1の値を入力する (画面6)。FAT16の場合は、「Large sectors」の欄に、9) で入力した値を入力する (画面7)。FAT32の場合は、「FAT32-BootSector」画面がないためちょっと面倒だが、直接バイトデータを入力する (画面8)。入力する場所はオフセット20〜23の4バイト (DWORD)。なお、このDWORDデータは16進数リトルエンディアンで入力する。例えばセクタ数が10進で "24097437" の場合なら、これを16進に変換すると "16FB29D" になるので、オフセット20〜23に "9D B2 6F 01" と入力する (10進と16進の変換はアクセサリの電卓でできる)。

画面6:NTFSパーティションの場合


画面7:FAT16の場合


画面8:FAT32の場合

16) 「Sectors」メニューから「Write」をクリックする。
17) 「Starting sector to write data」はそのまま「Write it」ボタンをクリックする。
18) 確認メッセージに対して「はい」をクリックする。
19) Disk Probeを閉じ、再起動して、パーティションサイズが変更されていることを確認する。再起動時にCheckDiskが起動する場合は、キャンセルすることなく最後まで実行させる。再起動時にChekDiskが起動しなかった場合は、念のためにコマンドプロンプトで "chkdsk X: /f" (Xは対象のドライブ名) を実行する。

パーティションの縮小方法−論理パーティションの場合
論理パーティションのサイズ変更では、基本パーティションでのMBR中のパーティションテーブルの代わりに拡張パーティションテーブルのパラメータを変更する。最初の論理パーティションであれば、最初の拡張パーティションテーブルとパーティションブートセクタのパラメータを変更することになる。
厄介なのは、2番目以降の論理パーティションの場合だ。この場合は、チェーンの前の拡張パーティションテーブルのパラメータ、自分の拡張パーティションテーブルのパラメータ、パーティションブートセクタのパラメータの3箇所を変更しなければならない。
1) Disk Probeを起動し、「Drives」メニューから「Physical Drives」をクリックする。
2) 「Available Physical Drives」ボックスから、サイズ変更したいドライブのあるHDDをダブルクリックし、「Handle 0」の「Read Only」のチェックを外し、「Set Active」ボタンをクリックし、「OK」ボタンをクリックする。
3) 「Sectors」メニューから「Read」をクリックする。
4) 「Starting Sector」が "0"、「Number of Sectors」が "1" のまま「Read」ボタンをクリックする。
5) 「View」メニューから「Partition table」をクリックする。
6) 「Partition table index」欄で拡張パーティションをダブルクリックする (画面9)。「System ID」欄が "Extendes" または "Extendes - LBA" になっていることを確認する。

画面9:拡張パーティションのパラメータを表示する。

7) 「Relative Sector」の右にある「Go」ボタンをクリックする。
8) サイズ変更したいパーティションが最初の論理パーティションの場合は、この画面が変更するパラメータになる (画面10)。
サイズ変更したいパーティションが2番目の論理パーティションの場合は、「Partition table index」欄で "Partition 2" をダブルクリックする。この画面11がチェーンの前の変更を要するパーティションテーブルだ。さらに、「Relative Sector」の右にある「Go」ボタンをクリックする。これが自分の拡張パーティションテーブルのパラメータ (画面12) で、ここも変更する必要がある。3番目以降の論理パーティションの場合も、同様の操作を繰り返して、1つ前の拡張パーティションテーブル、自分の拡張パーティションテーブルを見つける。

画面10:最初の論理パーティションの拡張パーティションテーブル


画面11:最初の論理パーティションの拡張パーティションテーブルで2番目の論理パーティションのパラメータを表示する。


画面12:2番目の論理パーティションの拡張パーティションテーブル

9) 「Drive」メニューから「Volume Information」をクリックする。
10) 「Sectors / Track」と「Tracks / Cylinder」の値をメモして、「OK」ボタンをクリックする。「Sectors / Track」×「Tracks / Cylinder」の値がシリンダサイズ (セクタ数) になる。
11) サイズ変更したいパーティションが最初の論理パーティションの場合は、拡張パーティションテーブル画面 (画面10) の「Total Sectors」の値をサイズ変更後の値に書き換える。このとき、10) で計算したシリンダサイズの倍数−63を入力する。
対象のパーティションが2番目以降の論理パーティションの場合は、前の論理パーティションの拡張パーティションテーブルで2番目の論理パーティションのパラメータを表示させ (画面11)、「Total Sectors」の値に 10) で計算したシリンダサイズの倍数を入力する。ここで、一旦 12) から 14) の保存操作を行っておく。次に、自分の拡張パーティションテーブルを表示させ (画面12)、前の論理パーティションの拡張パーティションテーブルで「Total Sectors」に入力した値−63を「Total Sectors」に入力する。
12) 「Sectors」メニューから「Write」をクリックする。
13) 「Starting sector to write data」はそのまま「Write it」ボタンをクリックする。
14) 確認メッセージに対して「はい」をクリックする。
15) 「Relative Sector」の右にある「Go」ボタンをクリックする。
16) 対象パーティションのファイルシステムがNTFSなら、「View」メニューから「NTFS BootSector」をクリックする。また対称パーティションのファイルシステムがFAT16なら、「View」メニューから「FAT-16 BootSector」をクリックする。対称パーティションのファイルシステムがFAT32の場合は、「View」メニューから「Bytes」をクリックする。
17) NTFSの場合は、「Total sectors」の欄に、11) で自分の拡張パーティションテーブルの「Total Sectors」に入力したセクタ数−1の値を入力する。FAT16の場合は、「Large sectors」の欄に、11) で自分の拡張パーティションテーブルの「Total Sectors」に入力したセクタ数を入力する。FAT32の場合は、「FAT32-BootSector」画面がないためちょっと面倒だが、直接バイトデータを入力する。入力する場所はオフセット20〜23の4バイト (DWORD)。なお、このDWORDデータは16進数リトルエンディアンで入力する。例えばセクタ数が10進で "24097437" の場合なら、これを16進に変換すると "16FB29D" になるので、オフセット20〜23に "9D B2 6F 01" と入力する (10進と16進の変換はアクセサリの電卓でできる)。
18) 「Sectors」メニューから「Write」をクリックする。
19) 「Starting sector to write data」はそのまま「Write it」ボタンをクリックする。
20) 確認メッセージに対して「はい」をクリックする。
21) Disk Probeを閉じ、再起動して、パーティションサイズが変更されていることを確認する。再起動時にCheckDiskが起動する場合は、キャンセルすることなく最後まで実行させる。再起動時にChekDiskが起動しなかった場合は、念のためにコマンドプロンプトで "chkdsk X: /f" (Xは対象のドライブ名) を実行する。

●パーティションサイズの拡大
パーティションを拡大する場合は、最大でどこまで拡大できるかをはっきりさせておく必要がある。拡張可能な最大パーティションサイズは次の方法で計算できる。
1) 対象のパーティションが基本パーティションで、その後ろにまったくパーティションがない場合は、HDDの最後のセクタまで拡大することができる。最大パーティションサイズは、Disk Proveの「Drive」メニューから「Volume Information」で表示される「Total Sectors」の値から対象パーティションの先頭にあるパーティションブートセクタのセクタ値を引いた値が拡張可能な最大サイズになる。なお、将来HDDをダイナミックディスクに変換する場合は、パーティションの後ろにダイナミックディスクで使用する領域を残しておく必要があるが、ダイナミックディスクに変換する予定がなければ、全領域をパーティションで利用してもかまわない。
2) 対象のパーティションが基本パーティションで、その後ろに基本パーティションがある場合は、後ろの基本パーティションのパーティションブートセクタのセクタ値から対象パーティションの先頭にあるパーティションブートセクタのセクタ値を引いた値が拡張可能な最大サイズになる。
3) 対象のパーティションが基本パーティションで、その後ろに拡張パーティションがある場合は、後ろの拡張パーティションの最初の拡張パーティションテーブルのセクタ値から対象パーティションの先頭にあるパーティションブートセクタのセクタ値を引いた値が拡張可能な最大サイズになる。
4) 対象のパーティションが論理パーティションで、その後ろにまったく論理パーティションがない場合は、拡張パーティションのサイズから対象パーティションの先頭にあるパーティションブートセクタのセクタ値を引いた値が拡張可能な最大サイズになる。
5) 対象のパーティションが論理パーティションで、その後ろに論理パーティションがある場合は、後ろの論理パーティションの拡張パーティションテーブルのセクタ値から対象パーティションの先頭にあるパーティションブートセクタのセクタ値を引いた値が拡張可能な最大サイズになる。

以上の方法で計算した拡張可能な最大パーティションサイズの範囲内で拡張後のパーティションサイズを決めておき、その値を使って、上記の「●パーティションサイズの縮小方法」の方法で、パーティションテーブルおよびパーティションブートセクタの値を変更すれば、パーティションを拡大することができる (詳細は省略する)。