Windows 7/Vista(以下Win7と略記)と、Windows 2000/XP(以下XPと略記)とを一台のハードディスクから両方ブートできるようにしたい場合、XPが先に存在している状態で、後でWin7をインストールすれば、自動的にマルチブート可能な状態になります。 しかし順序が逆の場合や、既存のOS起動パーティションのあるハードディスクを接続したり、さらにそれをコピーして一台のハードディスクにまとめる場合には、マルチブート可能な状態にするのは容易ではありません。
この文書は、まずそれぞれのOSのブートの仕方について解説し、マルチブートを可能にするための方法を示します。さらに、Win7でブートローダのパーティションをFAT32のパーティションに置く方法についても説明します。FAT32に入っているXPはWindows98のMS-DOS 7.1とのマルチブートがもともと可能でしたので、Win7,XP,MS-DOS7.1の3つが選択ブートできることになります。
bcdeditを使ってブートマネージャに対し起動ドライブの変更を行う操作は、ハードウェア環境の変更とみなされて、Windowsの再認証(アクティベーション)が発生する場合があります。ブートマネージャの編集はアクティベーション前に行うことを推奨します。
Windows 2000/XPのブートのプロセスは次のようになっています。
XPではブートのためのパーティションとOS本体が同一パーティションに存在するのがあたりまえでしたが、Win7では新規インストール時から別々にパーティションが作られるのがデフォルトになっています。これは別のWin7とのマルチブートを容易にしたり、システム保守や再セットアップのためにOSパーティション以外から起動することを目的としていると考えられます。
このブートのためのパーティションは、実は最小限のWin7起動領域であって、WindowsPE3.0と呼ばれるものが入っています。普通にインストールするとこのブート用WindowsPEパーティションは数百MB確保されています。プリインストール版では6~8GB程度確保されていることが多いです(これにはメーカ製の再セットアッププログラムも入っている)。 ファイルシステムは通常はNTFSですが、実はFAT32でも構わないようです。
このブートのためのアクティブパーティションは、必ずアクティブパーティションでなければなりませんが、ここから呼び出される起動OS本体は、Win7でもXPでもよいことになっており、別のパーティションに存在していてもよいことになっています。しかもWin7ではOS本体のインストール先がアクティブパーティションでなくても、そこがC:ドライブとなるようになっています。 (XPやそれ以前のWindows・DOSでは、アクティブパーティションからC:が割り振られるため、インストール先がD:以降になって混乱することがしばしばありました。)
ブートのためのパーティションと、OS本体のパーティションがそれぞれ次の条件を満たしていれば、Win7とXPとが起動できるようになります。
以下では、先にWin7がインストールされている状態のハードディスクに後から別のハードディスクの既存XPパーティションを持って来て、それらをまとめるという状況を想定して、具体的な手順を説明します。 まずWin7のほうのディスクドライブから起動するように起動優先順位をBIOS設定で変更し、Win7を起動できるように準備しておきます。
既に説明した、ブートのためのアクティブパーティションは、単独では非常に小さい容量であることが普通です。したがってそこにWindowsXPをコピーしてくることは困難です。いっぽうWin7本体パーティションと同一の場合は容量的には不足はないかもしれませんが、Windows フォルダやProgram Filesフォルダの名前が通常は同じですから、コピーによって内容が破壊されてしまいます。 (XPのインストール時にsystemフォルダ名を一般的でない物にカスタマイズしてあった場合は 問題ないですが、まずそうなっていることはないでしょう)
というわけで、ブートのためのパーティションにXPを丸ごとコピーすることはせず、間接的にXPを起動できるように改変してゆくことにします。 そのためには次の事柄やファイルがブートパーティションに必要となります。
1.はWin7からドライブレターを割り当てを可能とするために必要となります。ドライブとして見えないとファイルのコピーができません。パーティションIDを変更するにはdiskpartコマンドを使います。対象のドライブをselectし、対象のpartitionをselectしてから
set id=07
とします。しかしdiskpartコマンドの使用は、慣れていないとなかなか難しいと思います。MS-DOS起動が用意できれば、拙作ソフトfdskでパーティションIDを変更するのが簡単です。
パーティションIDをNTFSにすると、Win7からドライブレターを割り振ることができるようになります。例えばドライブレターX:を割り当てたとします。
次に Win7のエクスプローラで、隠し,システム属性の全てのファイルが表示されるようにしてから、NTLDR、NTDETECT.COM、BOOTFONT.BIN 、BOOT.INIのファイルをXPパーティションからX:にコピーして置きます。BOOT.INIはコピーしただけではダメで、WindowsXPのパーティションが何番目のディスクの何番目パーティションにあるかのARC pathの記述(参考)を修正しなければなりません。例えば上の図のディスク構成の場合ならば
などとします。これはディスク1(0から始まる数なので2番目)のパーティション1(これは1から始まる数なので先頭)にあることを意味します。これで2.から 3.が用意できました。
4.のWin7のBCDファイルは既に存在していますが、内容はWin7のみを起動するものとなっているので、XPも起動できるように編集する必要があります。 Windows XPのブートパーティションにドライブレターを割り当てます。ここではD:が割り当て済みであるとします。管理者権限下のコマンドプロンプトで、以下の手順のように、Win7付属のBCDEDITコマンドを実行します。 ドライブレターD:は、実際のものと置き換えてください。 なおダブルクォーテーション内の文字列は、ブートメニューに現れるもので、任意です。全角文字も使用できます。
これでBCDファイルの修正は完了です。再起動すると、Win7起動前にブート選択メニューが現れるようになっているはずです(次の図)。ただし日本語でなく英語で表示される場合もあります。
ここで Windows XP partitionを選択すれば、Windows XPが起動します。
なおXPから見るとWin7のHDDを初めてみつけることになるので、デバイスドライバのインストールが動き出ます。
以下は別のディスク構成のときの応用編です。より複雑な操作を必要とし、注意点も多くなります。上で述べた方法では、Win7のブートパーティションとWin7本体のパーティションの関係は変わりませんでした。しかしそれが変化するようなディスク構成にすると、Win7が起動しなくなります。そうなっても対処できるように、まずWin7の修復ディスク(DVD,CD,USBメモリ)をあらかじめ作成しておく必要があります。これはインストールDVDでも代用できます。そのときはインストールに入らずに修復を選ぶことになります。修復ディスクの作成方法は、いろいろなサイトにあるので作成方法の説明は省略します。
ブートのためのパーティションは一般的に小容量であるため、後からWin7やXP本体を入れる空きはありません。しかし後からそれを構築するぶんには、容量は任意です。そこでXPのパーティションに所定のファイルをコピーして、ブートのためのパーティションに作り替えることを考えます。ブートパーティションとして必要な要件は既に述べたとおりです。
まず、XPとWin7パーティションの両方がシステムに接続されている状態で XPのほうを起動します(BIOSでの起動優先順序を切り替える方法は機種固有の話ですのでそれができることは前提としています)。たとえば次の図のように各ドライブがあったとして話を進めます。ブートのためのパーティションは、既に述べたようにパーティションIDを07hにしてから、ドライブレターをX:に割り当てているものとします。
XPのエクスプローラではシステムファイルや隠しファイルが表示される状態にしておいてください。以降のコピー作業の対象はシステム属性隠し属性のファイルばかりです。Win7をブートしていたパーティション(上の図ではX:)にあるBOOTMGRファイル、BOOTフォルダ以下のファイル(BCDなど)を全て、XPのパーティション(C:)にコピーします。あと一つの作業はXPのパーティションのブートセクタのコードをWin7用に書き換えることですが、XP自身からは行えませんので後回しにします。
BIOSによる起動優先順序を変更して Win7を起動します。Win7は修復用ディスクからの回復コンソール起動でかまいません。コマンドプロンプトで BOOTSECTというコマンドが使えるか確認します。BOOTSECTとだけコマンドを打って使用方法が表示されるなら、BOOTSECT.EXEが存在し、PATHを通して使える状態になっています。さてここでWin7から見たXPのドライブのドライブレターがE:だったとします。そして
というパラメータをつけてコマンドを実行します。E:は実際のドライブレターに合わせてください。ドライブレターを間違って、意図したドライブ以外に適用しないよう注意してください。NT60というパラメータの意味は、NT6.0つまりVista仕様のBOOTMGRを呼び出すブートコードにするという指示です。この作業を実施したあとはXPの起動ができなくなってしまいますので、これまでのプロセスでやり残しがないかどうか作業の前に確認してください。*なおここで /NT52というパラメータにすると、XP仕様のNTLDRを呼び出すブートコードに戻すことができます。XP単独起動に戻すときはそのようにします。
Win7(Windows PE 3.0)のBOOTSECTコマンドの代わりに、別途DOSを起動して拙作BOOTSECT for DOS/FATを使うこともできます(XPのパーティションがFAT32の場合のみ、NTFSは不可)。 BOOTSECTコマンドが見つけられないがDOSが使えるという人はこちらを使ってください。ドライブレターで指定しない方式なので間違いは起こりにくいと思います。
ここで再びXPの入っているディスクドライブから起動するように、BIOSの起動優先順位設定を変更します。今度はブートセクタがBOOTMGR用に置き換わっており、別ディスクにあるWin7本体パーティションを指しているBCDファイルがコピーされているため、このパーティションからWin7が起動します。もうXPのパーティションというよりはブートのためのパーティションがここに移った(コピーされた)と言ってもよいでしょう。
このように、Win7を起動させるBOOTMGRのBCDファイルは、どこにコピーしても、もとのWin7を起動するように作られています。Win7本体があるディスクドライブがどこかに接続されていればよいのです。BIOSによる起動優先順位の設定にかかわりません。ディスクとパーティションは、ディスクシグネチャと、パーティションを記述したUUIDによって識別されるので、どこに接続されていてもよいのです。BOOTMGRのあるパーティションだけが起動優先順位トップのアクティブパーティションとなっていることだけに注意を払えばよいのです。このような仕様はXP時代とは異なっており、ディスクの増設がしやすくなったとも言えます。
この状態で、XPのパーティション=BOOTパーティションから起動したブートメニューが出てWin7とXPとを選択できるようになりますが、Win7側は起動てもXP側が起動できない状態になっています。ということは、既に4.で述べた状態と同じですから、同様にしてBCDEDITを使って {NTLDR}の記述を作ってやればよいということになります。ただし今度は、ブートのためのパーティション=XPのパーティションというように同一ディスクドライブ上にありますから、上の図の場合であれば、起動したいOSのARC pathは以下のように記述する必要があります。すなわちrdisk(0)の部分が異なります。
以上のようにXP用のBOOT.INIを記述すれば、XP側も起動できるようになります。まとめると、まずXPが起動できていたのをWin7だけが起動できるようにし、次にXPも起動できるようにするという手順になります。
XPのときにDOS7.1(Win98/ME)とXPのデュアルブートにしてあった状態で、上記の方法でWin7もブートできるようにした場合は、まずWin7とXPの起動選択メニューが出て(これはBCDファイルの記述内容に従って出る)、XP側を選択したあとに、XPとDOS7.1の選択メニューが出る(これはBOOT.INIの記述内容に従って出る)という二段階操作になります。
ここでDOS側を選択すると、DOSがブートできます。ここでXPを選択した場合は当然XPが起動しますし、もし他の非アクティブパーティションにXP本体がある場合(C:以外でインストールされているかもしれない)は、BOOT.INIに書かれているとおりのXPが起動します。この部分の仕様は従来通りです。
ところでWindows2000/XP からDOSをブートするときに必要なファイル「BOOTSECT.DOS」は、リロケータブルな仕様になっていません。XPのドライブをコピーしてディスク上の位置が変わると動作しなくなります。既に述べたような方法ではXPのパーティションのディスク位置もサイズも変化していないので問題ありませんが、そうでない場合はBOOTSECT.DOSを適切に作り替える必要があります。