1. NT/2K/XPの構成
最初に。Windows 2000とWindows XPは、それぞれ内部的にはNT5.0であり、NT5.1です(OSの設定ファイル等にそう書いてある)。基本的な構成はNT4.0と共通なので、差し当たり共通で語るときは「NT系」と表記することにします。
NT系は、DOSや9xと同じく、起動のためには(BIOSから認識される順で)1台目のHDDの基本パーティションが必要です。NT系の本体は別のパーティションに置くことができますが、ブート部分は1台目の基本パーティションから離れられません。
- NT系のブート部分は、1台目の基本パーティションのルートに置かれる以下のファイルと、そのブートセクタ(PBR)から成ります。このパーティションは、そのOSが対応しているファイルシステムである必要があります(したがって、NT4.0の場合、FAT32は不可。SP4以前では2K以降のNTFS5も不可)。
ntldr ブートローダー(NTLDR)本体 Boot.ini NTLDRの設定ファイル(テキストファイル) ntdetect.com ハードウェア構成を調べてNTLDRに報告するプログラム bootfont.bin 日本語の場合。日本語フォントファイル [参考情報] Microsoft: Intel x86-Based System Boot Sequence and Files
(これらのファイルの機能はNT系で共通。サポートオンラインには日本文もあるが、機械翻訳で読むにたえないので、英文を掲げる。以下の場合も同じ) - ブート時には、PBRのブートコードがNTLDRを起動し、NTLDRがBoot.iniに従って本体のカーネルを起動します。NT系の本体は、ブート部分と同じ基本パーティション以外にも、他の基本パーティションか拡張パーティション内の論理ドライブ(2台目以降にある場合を含む)に置くことができます(いずれにせよBoot.iniの中で指定する)。
これらの構成は、NT系のインストール時に決定されます。インストール時にインストール先のパーティションを選ぶ場面がありますが、ここで指定できるのは本体の位置で、ブート部分はその時点で上記の条件に合うパーティション(C:と認識されているところ)に自動的にインストールされます(注1)。
(注1) |
|
[参考情報] | Microsoft: | セットアップ中のWindows NTのパーティション作成のルール (パーティションのサイズの制限以外は、NT系で共通) |
NT系のブートは、本体の起動プロセスにNT4.0と2K/XPで違いがあるので、引っ越し時の作業が変わってきます。また、起動できるためのHDD内のブート部分の位置制限にもそれぞれ違いがあります。
起動プロセスの違い | ブート部分の位置制限(注2) | ||
---|---|---|---|
NT4.0 | Boot.iniで本体(システムフォルダ)のパーティション位置を正確に指定する必要あり。 | レジストリ中の本体のパーティション情報はブートに不可欠ではない。 | 2GB(FAT16の場合)(注3) 4GB(NTFS、SP4までの場合) 8GB(NTFS、SP5−SP6aの場合。ただし、XPのNTLDRから起動すれば本体は制限なし) |
2K | レジストリ中の本体のパーティション位置が正確である必要あり(ずれがあるとログインできない状態になる)。 | 8GB(NTFS、SP4でも。ただし、XPのNTLDRから起動すれば本体は制限なし) | |
XP | 8GB以上(実質的な制限なし) |
(注2) | パーティションの開始位置の制限。バグというか仕様。数字は目安であって、実際にはBIOSやHDDによって異なる(より小さくなる)。8GBにしても、必ずしも単純に1024シリンダという問題ではない。したがって、ぎりぎりでパーティションを作ると引っ掛かる可能性がある。 |
(注3) | インストール中にインストール先のパーティションを作成すると、NTFSを指定しても一旦FAT16で作成して最後にNTFSにconvertするので2GBの制限に引っ掛かる。これを回避するには予めNTFSでフォーマットしたパーティションを作っておく必要がある。 |
[参考情報] | Microsoft: | セットアップ時作成されるブートパーティションは4GB まで 4GB以上のパーティションがある場合にWindows NT 4.0のブートに失敗する Windows 2000またはWindows XPを削除してWindows NT 4.0を再インストールする際の問題 (これらはNT4.0の仕様に起因する) |
なお、NT系と9xの本体には、「Program Files」等の名前が重複するフォルダがあるため、それぞれ独立のパーティションにインストールすることが基本です。
2. ブートセクタ(PBR)
NT系のPBRは、パーティションをフォーマットした際に(ブートコード部分を含めて)自動的に書き込まれます。したがって、基本パーティションであれば、ntldr等をルートにコピーすれば起動可能な状態になります。
問題は、PBRに問題が起こったときの修復がDOS/9xのSYSほど簡単ではないことです。対処法は、ざっと以下のとおりです。
- OSの修復機能を使う。
- 「回復コンソール」を使う方法と、「修復セットアップ」を行う方法がありますが、回復コンソールの方が楽です。さらに言えば、ブート部分(PBR+ntldr等)は上位互換性があるので(XPのブート部分は2K/NT4.0本体を、2Kのブート部分はNT4.0本体を起動可。逆は不可)、新しい方を使えば問題ありません。
- <回復コンソールを使う:2K/XP(注4)の場合>
- 2K/XPのインストールCD-ROMから起動。
<2Kのとき>- 最初の3択でRキー、(キーボードの判別を挟んで)次の2択でCキー。
- 最初の3択でRキー。
- ログインする「Windowsインストール」(2K/XPのシステムフォルダ)を選択。
- 回復コンソールが起動するので、FIXBOOTを実行。
[基本情報] Microsoft: Windows 2000回復コンソールについて
Windows XP回復コンソールについて(注4) NT4.0にも回復コンソールはあるが、インストールCD-ROMから起動できないので、ブートセクタに問題がある=HDDからOSが起動不能の状態では使えない。
- 「システム修復ディスク」(ERD: Emergency Repair Disk)を予め用意しておきます(必ず必要というわけではないが、必要な場合が多い)。
- ERDの作成には、
<NT4.0のとき>- コマンドプロンプトからrdisk.exeを実行し、「修復ディスクの作成」を実行。
- 「アクセサリ」→「システムツール」→「バックアップ」を起動し、「システム修復ディスク」を実行。
- このERDにはシステムフォルダ内の「Repair」フォルダにある「setup.log」というテキストファイルがコピーされます。この「setup.log」には、インストール時点でのOSのブート部分と本体(システムフォルダ)の状態が記録されている部分があります。例として、以下のようなものです。
[Paths]
TargetDirectory = "\WINNT"
TargetDevice = "\Device\Harddisk0\partition1"
SystemPartitionDirectory = "\"
SystemPartition = "\Device\Harddisk0\partition1"TargetDirectory = 本体のシステムフォルダ(「WINNT」はNT4.0/2Kのデフォルト) TargetDevice = 本体のあるパーティション。「Harddisk」は何番目のHDDか(初期値は0)、「partition」はHDD中のパーティションの位置(初期値は1)を示す。法則的には下記のBoot.iniのARCパスと同じ。したがって、「\Device\Harddisk0\partition1」は1番目のHDDの1番目のパーティションを指している。 SystemPartitionDirectory = ブート部分(ntldr等)のパス SystemPartition = ブート部分のあるパーティション。法則は本体の場合と同じ。
- ERDの作成には、
- NT4.0/2KのインストールCD-ROMから起動。
<NT4.0のとき>- 最初の4択でRキー。
- 最初の3択でRキー、(キーボードの判別を挟んで)次の2択でもRキー、次の2択はMキー。
- 修復対象を指定するチェックボックスが出るので、「ブートセクタの検査」だけ残して(注5)「続行」でEnterキー。
- 「システム修復ディスク」の有無が出るので、Enterキー。ここで「システム修復ディスク」を使わず、インストーラに場所を探させてもいいですが、必ずしも成功しません(成功しなかった場合、これ以上進めない)。
[参考情報] Microsoft: Windows NTで作成したシステム修復ディスクの使用
Windowsの手動修復と高速修復の違い
(2Kの修復セットアップに関する説明)@IT: 修復セットアップ完全マスター
(2Kの修復セットアップに関する説明)(注5) 「スタートアップ環境の検査」もチェックしておけば、ntldr等のファイルも修復する。
- 2K/XPのインストールCD-ROMから起動。
- ディスクエディタを使ってバックアップ・コピーからPBRを書き写す。
- ファイルシステムにはPBRのバックアップ・コピーが保存されているので、これを利用すればDisk Probe(注6)等のディスクエディタを使ってPBRの回復が可能です(他のNT系等から作業することが前提)。
[基本情報] Microsoft: NTFSパーティション上のNTFSブートセクタの回復 (注6) Disk ProbeはMicrosoft製のディスクエディタ。NT4.0のResource Kitからあったツールで、新しいものはWindows XP Service Pack 2 Support Toolsとしてダウンロードできる(Disk Probeをインストールするにはインストール時には「Complete」を選ぶ必要がある)。同梱のdskprtrb.docに基本的な使い方の説明がある。
- ファイルシステムにはPBRのバックアップ・コピーが保存されているので、これを利用すればDisk Probe(注6)等のディスクエディタを使ってPBRの回復が可能です(他のNT系等から作業することが前提)。
- 専用ツールを使ってPBRを書き込む。
- BootPart(注7)にはNT系のブートセクタを書き込む機能があります。
(注7) BootPartはBoot.iniに関する作業用のツール。NT系のコマンドプロンプトかDOSで動く。BootPart 2.60: Boot Partitions for WinNTからダウンロードできる。
- BootPart(注7)にはNT系のブートセクタを書き込む機能があります。
- NT系でフォーマットする。
- 実は、これが一番単純かつ確実だったりします。ただし、他のNT系等から、パーティション内の一切合切のファイルを一旦退避させることが前提になります。
3. Boot.ini
NT系のブートローダー(NTLDR)は、NT系以外のOSも起動できる、それなりに使える起動切り替えソフトでもあります。
[基本情報] | Microsoft: | Windows XPでマルチブートシステムを作成する方法 Windows 2000とWindowsベースの他のオペレーティングシステムとの間でサポートされるデュアル ブート構成 (Microsoftでは、NT系のブート部分(ntldr等)のあるパーティションを「システムパーティション」、本体(システムフォルダ)のあるパーティションを「ブートパーティション」と表記している) |
|
The NTLDR Hacking Guide NT OS Loader + Linux mini-HOWTO Windows NTのOSローダーによるマルチOSブートの試み Windows XP/2000の起動トラブル WindowsNT/2000 と Linux の共存 DIRECT BOOT INTO WinNT/Win95/DOS/Linux from the NT Boot Loader |
Boot.iniは、NTLDRの設定ファイルで、その内容は例えば以下のようなものです。
[boot loader]
timeout=10
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP
Professional" /fastdetect
multi(0)disk(0)rdisk(0)partition(2)\WINNT="Microsoft Windows 2000
Professional" /fastdetect
C:\="Microsoft Windows"
C:\fc4.bin="Fedora Core 4"
この[boot loader]の部分のうち、「timeout」は起動時の選択メニューのタイムアウトの時間(秒)を示します(ただし、[operating systems]にエントリが1つしかない場合、選択メニューは出ないので、意味はない)。「default」は選択しなかったときに起動するエントリを示します。
[operating systems]の部分がNTLDRの選択メニューに出るエントリですが、ブート機能的には2つに分かれます。
A. NT系のカーネルを呼び出して起動する
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP
Professional" /fastdetect
multi(0)disk(0)rdisk(0)partition(2)\WINNT="Microsoft Windows 2000
Professional" /fastdetect
それぞれXP及び2Kのエントリですが、「multi(0)disk(0)rdisk(0)partition(1)」の部分はARCパスというものです。
mutil(0)disk(0) | 通常は共通。 |
---|---|
rdisk(0) | 何番目のHDDか(初期値は0)を示す。BIOSから認識される順。 |
partition(1) | HDD中のパーティションの位置(初期値は1)を示す。法則としては、基本パーティション同士はMBRのパーティションテーブルのエントリの順。論理ドライブは拡張パーティションの先頭からの順。基本パーティションが論理ドライブに優先する(基本パーティションが拡張パーティションより後方にある場合でも、この基本パーティションの方が先)。 |
ARCパスに続くフォルダ名は、NT系本体のシステムフォルダを指すので、この例の場合、以下を示しています。
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS= | 1台目のHDD中の1番目のパーティションにある「windows」フォルダ(XPのシステムフォルダ) |
---|---|
multi(0)disk(0)rdisk(0)partition(2)\WINNT= | 1台目のHDD中の2番目のパーティションにある「winnt」フォルダ(2Kのシステムフォルダ) |
[基本情報] | Microsoft: | BOOT.INIファイルの用途 BOOT.INIとARCパスの名前付け規約と使用法 (やや古いが、ARCパスの規則はNT系で共通) |
これらのエントリは、インストール時に自動的に設定される場合でも(注8)、手動で編集する場合でも意味は同じです。
(注8) |
|
パーティション構成を変更した場合は、位置のズレを調整してやる必要があります(注9)。ここで問題になるのは、ARCパスはMBRのパーティションテーブルのエントリの順によることで、物理的な並びと一致しないことがあることです。
(注9) | XPの回復コンソールでは、このような場合にBootcfgコマンドが仕様可能。 |
[参考情報] | Microsoft: | Bootcfgコマンドとその使用法について |
例として、2K/XPの「ディスクの管理」で見た状態で、以下のような構成のHDDがあるとします(1番目の基本パーティション=C:にXPが、2番目の基本パーティション=G:に2Kが入っている。なお、ドライブレターはXP上で割り当てた便宜的なもの)。
これではパーティションテーブルのエントリの順は分かりませんが、ptedit.exe(注10)で見ると、以下のようになっています。
(注10) | ptedit.exeはPartitionMagicの開発元のPowerQuest(Symantecに買収された)製のツール。DOSで動くptedit.exeとWindows上で動くptedit32.exeがある。PartitionMagicに入っているが、2005年7月現在、SymantecのFTPサイトからダウンロードできる。 |
パーティションテーブルでは、1番目のエントリにC:が、2番目のエントリにG:があり、3番目のエントリに拡張パーティションがあります(4番目のエントリは空き)。ここで、1番目の基本パーティションの後ろの空き部分に、基本パーティション(他と区別しやすいようにファイルシステムはFAT32として)をPartitionMagicで作成してみます。この結果を「ディスクの管理」で見た状態です。
物理的な並びでは、新しい基本パーティション(H:になっている)が2番目の基本パーティションになり、G:は3番目の基本パーティションになります。これでG:にある2Kが影響を受けるはずですが、ptedit.exeで見ると、パーティションテーブルではH:は4番目のエントリに入っています(Typeが「0B」=FAT32になっている)。
つまり、新しい基本パーティションは空いていたエントリに書き込まれたわけで、物理的な並びとは違いますが、これはこれで問題ありません。ARCパス的にはG:はこれまで通り2番目のパーティションということになるので、ARCパスを修正する必要もありません。ただし、ここで「ディスクの管理」を使って何か変更すると(「アクティブ」を付け替えるだけでも)、「ディスクの管理」はエントリの順を物理的な並びに合うよう修正します。
これはH:を初めから「ディスクの管理」で作成した場合でも同じで、「ディスクの管理」はパーティションテーブルを修正します。こうなると、G:は3番目のパーティションということになり、ARCパスを修正する必要が生じます。ちなみに、この状態でH:をPartitionMagicで削除すると、パーティションテーブルでは2番目のエントリが空きになります。
つまり、わざわざ後ろのエントリを前に詰めたりしないわけです。この状態で新しい基本パーティションをPartitionMagicで作成すると、物理的な位置にかかわらず、この2番目のエントリに入れられます。結果的に、このようなエントリへの出し入れの繰り返しで、パーティションテーブルは幾らで複雑な状況になり得ます。
これはPartitionMagicに限らず他のツールでもあることで、それ自体は問題ではありません(このNTLDRの関係以外、問題になったことは未だかつてない)。ただ、NTLDRを使う以上、物理的な並びとパーティションのエントリの順が揃っている方が混乱を避けるには無難でしょう(揃えるには、初めから「ディスクの管理」で作業するか、他のツールで作業後に「ディスクの管理」で何か変更すればよい)。
その他、ARCパスに関して問題が起こり得る例として、拡張パーティション内の論理ドライブにNT系本体を置いている状態で、新たに基本パーティションを作成する場合があります。この場合、新しい基本パーティションがARCパス的には(物理的には拡張パーティションより後方にあるときでも)先に来るので、ARCパスを修正する必要があります。
[参考情報] | Microsoft: | Windows NTシステムファイルを指すARCパスが変更される (ARCパスの問題なのでNT系で共通) |
なお、XPの「ディスクの管理」を使うと、そのパーティションの作成/削除の結果がARCパスに影響する場合、自動的にBoot.iniを修正します(「Partition」の数字を変更する)。また、PartitionMagicも同様にBoot.iniを修正します。ただし、常にそれが良いわけではないので、Boot.iniのバックアップをとっておくに越したことはありません。
B. NT系以外のOSのPBRを読み込んで起動させる
C:\="Microsoft Windows"
C:\fc4.bin="Fedora Core 4"
これらは9xとLinux(この例ではFedore Core 4)のエントリです。全然別のOSですが、NTLDR上は扱いは基本的に同じで、これらのOSのPBRを読み込んで起動させます。予めOSのブート部分があるパーティションのPBRをファイル化し、これをBoot.iniで指定しておけば、NTLDRは起動時にそのファイルをロードします。PBRには当該パーティションの情報=BPB(BIOS Parameter Block)が入っているので、PBRごと読み込んでブートコードを実行すれば、当該OSが起動できるわけです。
C:\= | 9xのエントリであるが、C:のルートというパスの指定しかない。DOSや9x(のブート部分)のある基本パーティションにNT系(のブート部分)をインストールすると、インストーラは元のPBRを「bootsect.dos」というバイナリファイルの形で保存し、Boot.iniにこのエントリを追加する。このように指定した場合、C:のルートの「bootsect.dos」というファイルをロードする。DOSや9xとのデュアルブートのための機能。 |
---|---|
C:\fc4.bin= | Linuxのエントリであるが(Linuxかどうかはこれでは分からないが)、C:のルートの「fc4.bin」というファイル名まで指定している。このようにファイル名まで指定した場合(手動でBoot.iniを編集)、任意のファイル(この例ではC:のルートの「fc4.bin」)をロードさせることができる。これを利用すれば、DOSや9xに限らず、他のOSのPBRをロードし、そのOSを起動させることができる。 |
機能としては基本的にこれだけで、基本パーティションの「アクティブ」指定を変えたり、パーティションの「隠し」を切り替えたりする機能はありませんが、複数のDOSや9xを使うようなことでもない限り(注11)、問題にはなりません。
(注11) |
|
[参考情報] | Microsoft: | Windows NT、Windows 95/98、およびMS-DOSをトリプルブートする方法 Boot.iniファイルで使用できるスイッチオプションについて Windows 2000のBoot.iniファイルで使用可能なスイッチオプション Windows XPおよびWindows Server 2003のBoot.iniファイルで使用可能なスイッチオプション |
ここで使うOSのPBRファイルの作成には、debugを使う以外にも、幾つか方法があります。
- BootPartを使う場合
- コマンドプロンプトから「bootpart」と実行。すると、BootPartから見たパーティション構成が表示されます。
- Linuxのパーティション(ファイルシステムが「type=83」で、左端で「7」と表示されている。なお、BootPartでは、普通はパーティションとしてカウントされない拡張パーティションもカウントされるため、順番が独特になる)のPBRを作成する場合、「bootpart 7 fc4.bin Fedora Core 4」と実行(ファイル名を「fc4.bin」、エントリの表示を「Fedora Core 4」と指定。これらは任意)。これでPBRをファイル化しつつ、Boot.iniにエントリを追加してくれます。
これでfc4.binというファイルがカレント・フォルダ(この場合はC:のルート)に作成され、Boot.iniにこのファイルがパス付きで指定されたエントリが追加されます。 - ちなみに、これで作成されたファイルをDisk Probeで見ると、以下のとおりです。
ASCII文字コードでBootPart独自の文字とメッセージが見えるように、PBRをそのままファイル化したものではないです。
- コマンドプロンプトから「bootpart」と実行。すると、BootPartから見たパーティション構成が表示されます。
- Disk Probeを使う場合
- ドライブレターを割り当てているパーティション(NT系が認識できるファイルシステムに限定)のときと、割り当てていないパーティションのときで、手順が変わってきます。
- <ドライブレターを割り当てているパーティションのとき>
- dskprobe.exe(デフォルトではProgram Files\Support Tools\にインストールされる)を起動。
- ツールバーの「Drives」から「Logical Volume」を選択。
- 「Open Logical Volume」のダイアログボックスが開くので、「Logical Volumes」から目的のパーティションのドライブレターを選び、ダブルクリック。これが下の「Handle 0」に入るので、「Set Active」をクリックし、上の「OK」をクリック。
- 元の画面に戻るので、ツールバーの「Sectors」から「Read」を選択。
- 「Read Sectors」のダイアログボックスが開くので、「Starting Sector」は0、「Number of Sectors」は1(両方デフォルト)の状態で「Read」をクリック。
- これでPBRがバイナリで表示されます。
- ツールバーの「File」から「Save As」を選択し、適当なファイル名を付けて保存します。
- <割り当てていないパーティションのとき>
- 予め目的のパーティションの(HDDの先頭からの)開始セクタ(LBAの数字。10進数)を調べておきます。簡単な方法としては、上記のBootPartでパーティションを一覧表示させたとき、右端で「Lba Pos=」として表示されている数字がこれです。したがって、上のLinuxの例では108108063です。
- dskprobe.exeを起動。
- ツールバーの「Drives」から「Physical Drive」を選択。
- 「Open Physical Drive」のダイアログボックスが開くので、「Available Physical Drives」から目的のHDD(1台目であれば「PhysicalDrive0」)をダブルクリック。これが下の「Handle 0」に入るので、「Set Active」をクリックし、上の「OK」をクリック。
- 元の画面に戻るので、ツールバーの「Sectors」から「Read」を選択。
- 「Read Sectors」のダイアログボックスが開くので、「Starting Sector」に目的のパーティションの開始セクタを入力、「Number of Sectors」は1(デフォルト)の状態「Read」をクリック。
- これでPBRがバイナリで表示されます。上のLinuxの例では、以下のとおりです。
こちらはASCII文字コードでLinuxのブートローダーであるGRUBの文字とメッセージが見えます。PBRはセクタの最後の2Byteが「55AA」になっている点に注意。これが違うようであれば、少なくともセクタを間違えています。 - ツールバーの「File」から「Save As」を選択し、適当なファイル名を付けて保存します。
- Linux上で作成する場合
- 目的のパーティションがLinux上でどう表記されるか確認するため、シェルからLinuxのFDISKを実行します(ATAの1台目のHDDであれば「fdisk /dev/hda」でFDISKに入り、「p」を実行)。
Disk /dev/hda: 60.0 GB, 60011642880 bytes 240 heads, 63 sectors/track, 7752 cylinders Units = シリンダ数 of 15120 * 512 = 7741440 bytes デバイス Boot Start End Blocks Id System /dev/hda1 * 1 976 7378528+ 7 HPFS/NTFS /dev/hda2 977 1444 3538080 7 HPFS/NTFS /dev/hda3 1445 7752 47688480 f W95 Ext'd (LBA) /dev/hda5 1445 5401 29914888+ 7 HPFS/NTFS /dev/hda6 5402 7150 13222408+ 7 HPFS/NTFS /dev/hda7 7151 7614 3507808+ 83 Linux /dev/hda8 7615 7752 1043248+ 6 FAT16
- Linuxのパーティションの場合は、「/dev/hda7」であるので、以下を実行すればPBRのファイルが作成されます(「of=」に続く部分は適当なファイル名を指定。この例では「fc4.bin」)。
dd if=/dev/hda7 of=fc4.bin bs=512 count=1
- 目的のパーティションがLinux上でどう表記されるか確認するため、シェルからLinuxのFDISKを実行します(ATAの1台目のHDDであれば「fdisk /dev/hda」でFDISKに入り、「p」を実行)。
なお、当該パーティションの開始位置等をパーティション操作ソフトで変更した場合、既に保存してあるPBRファイル中のBPBの情報とは食い違うことになります。この解決法としては、以下があります。
- PBRファイルを改めて作成する(シンプルに)。
- PBRファイル中のBPBの情報を修正する。方法は2通りある。
- Disk ProbeでPBRファイル中のBPBを直接編集する。
- Partition Saving(注12)を使う(Bootsect.dos用)。
(注12) 「Partition Saving」はDOSベースのツール。Partition Savingのページからダウンロードできる。具体的な手順は、Manualの12- Updating BOOTSECT.DOS fileにある。作者がフランスの人らしいので、英文にやや癖がある。
4. 「Signature」と「volume GUID」
NT系では、個々のHDDを識別するために、HDDのMBR内に4Byteの値を書き込みます。この値は色々な呼ばれ方をされていますが(注13)、Microsoftの文書やツールでは単に「disk signature」や「Signature」と表記されているので、差し当たり「Signature」と表記することにします。
(注13) | 「署名」、「NTシグネチャ」、「DiskID」等。ちなみに、Microsoftでは日本語訳を「署名」としている例があるが(後掲のNT4.0のメッセージ等)、日本語の「署名」にこのような意味はないので、誤訳(辞書に載っていた言葉を適当に当てた類の)と考えられる。しいて意訳すれば、「ディスク識別番号」ぐらいか。 |
Disk Probeで見ると、下記のパーティションテーブル直前の01B8からの4Byteで、この例では「c026c026」です(リトルエンディアンなので、Byteごとに逆に読む)。ちなみに、前掲のBootPartでもこれが表示されています。
NT系では、この「Signature」を利用して個々のパーティションの情報をレジストリに記録しています(したがって、NT系は一度使ったパーティションを「覚えている」)。ただし、NT4.0と2K/XPの場合で、起動プロセスに違いがあるので、意味合いが変わってきます。
A. NT4.0の場合
NT4.0では、インストール後や新しいHDDを接続後、初めてディスクアドミニストレータを起動すると、以下のメッセージが出てきます(この中では「Signature」は「署名」と表記されている)。
既にMBRに「Signature」がある場合は、これは出てきません。これで「はい」を選択しないと、そのHDDはディスクアドミニストレータから操作できないので、そう選択するしかないわけですが、これで「Signature」が書き込まれます。
これを受けて、レジストリのHKEY_LOCAL_MACHINE\SYSTEM\
にDISK
というキーが作成され、この直下のInformation
というバイナリ値にパーティションの情報が記録されます。ただし、これが無くてもNT4.0本体の起動に影響はないので(そもそもインストール後、ディスクアドミニストレータを使うまで存在しない)、これ以上は追求しません。
B. 2K/XPの場合
2K/XPの場合、インストールの時点で「Signature」がサイレントに(自動的に、ユーザーに知らせたり許可を求めることなく)書き込まれ、OS本体の起動プロセスに関係してきます。すなわち、レジストリ中でログイン関係のファイルの場所がドライブレター付きで指定されているため、本体(システムフォルダ)のあるパーティション情報が変わると問題が起こります(単純に起動できなくなるというより、OSも自動的に回復しようとするが、それが必ずしも成功しない)。また、「Signature」の書き込まれていないHDDを接続すると、「Signature」をサイレントに書き込むので、これが問題をややこしくします。
[参考情報] | Microsoft: | Unable to Log on if the Boot Partition Drive Letter Has Changed How to restore the system/boot drive letter in Windows (基本的にNT系で共通) |
例として、「ディスクの管理」で見た状態で、以下のようなパーティション構成のHDDがあるとします(1番目の基本パーティションにC:、2番目の基本パーティションにG:を割り当てている)。
パーティションの情報は、XP/2KではHKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
の直下のバイナリ値に記録されています。レジストリエディタ(regedit.exe)でこれを見ると、以下のとおりです。HDDのC:からG:までの記述がありますが(A:はFDD、H:は光学ドライブ)、Microsoftの文書では、これを「volume GUID」(注14)と表記しています。
(注14) | 「volume」とは、この文脈ではパーティションのこと。「GUID」とは、「Globally Unique Identifier」すなわちIDのこと。「volume」の1文字目が小文字であることから、定式化した表記ではおそらくない。 |
この状態をDiskmap.exe(注15)で見ると、以下のとおりです。
(注15) | Diskmap.exeとは、Windows 2000 Resource Kitのコマンドライン・ツール。Microsoftの管理タスクのWindows 2000リソースキットツールからダウンロードできる。なお、NT系のコマンドプロンプト専用なので、緊急用にDOSで使うことはできない。 |
上に「Signature」が表示されています(最初の「0x」は16進数の意味)。その下にパーティションの一覧があり、「StartingOffset」はパーティションの(HDD先頭からの)開始Byte、「Starting Sector」は開始セクタ(論理ドライブの場合、そのすぐ外側の拡張パーティションの先頭からになるので常に63)、一番下にMBRのパーティションテーブルが表示されています。一覧の1番上がC:の基本パーティション、2番目がG:の基本パーティションです。これを16進数で表示すると、以下のようになります。
前掲のレジストリ中の「volume GUID」を、1番目と2番目の基本パーティションについて整理すると、以下のようになります(データはリトルエンディアンなのでByteごとに逆に読む。なお、前半、後半という区切りは便宜的なもの)。
名前 (ドライブレター) |
「volume GUID」 | ||
---|---|---|---|
(前半) | (後半) | ||
1番目の基本パーティション | \DosDevices\C: | c0 26 c0 26 | 00 00 00 7e 00 |
2番目の基本パーティション | \DosDevices\G: | c0 26 c0 26 | 01 c2 5a 00 00 |
「volume GUID」のうち、前半は明らかに「Signature」です。後半はパーティションの開始Byte(Diskmap.exeによる表示中の「StartingOffset」。ともに16進数)(注16)と一致します。これはD:からF:についても同じです。つまり、レジストリのパーティション情報=「volume GUID」は、「Signature」とパーティションの開始位置から成るということです。
(注16) | セクタ単位でないのがやや不思議であるが、後半最初の1Byte(下2桁)は常に00になるので(パーティションはシリンダ単位で、シリンダはヘッド単位で構成されるが、1ヘッド=63セクタ、1セクタ=512Byteであるので、1ヘッド=63x512Byte=32256Byteすなわち16進数では7E00Byte。したがって、その倍数であるシリンダも16進数では下2桁は常に00になる)、これは無視して続く4Byte(上8桁)だけを見れば、開始セクタの2倍とも言いうる。ただ、16進数の下2桁を削って(16^2で割る)さらに2で割ることは16^2x2=512で割ることと同義であり、1セクタ=512Byteであるので、至極当然のことであるが。 |
[参考情報] | Understanding MultiBooting and Booting Windows from an Extended Partition: | Fixing Windows 2000/XP Drive Letters |
したがって、原理的に、「volume GUID」は当該パーティションの長さの変化や他のパーティションの有無には影響されませんが、HDDの「Signature」の違いやパーティション開始位置の変化には影響されます。結果的に、パーティションを別のHDDにコピーしたり、同じHDDの中でも移動したりした場合、システムフォルダのあるパーティションと、そのパーティションのドライブレターがずれて、起動できなくなります。
対処法としては、大きく分けて3つあります。
- 「volume GUID」をOSに再作成させる
<「Signature」をクリアする>- MBRの「Signature」がクリアされた(0になった)場合、OSはそれまでの「volume GUID」をあきらめて再作成します。クリアする方法としては、ディスクエディタでMBRを直接修正(「Signature」の部分を0で埋める)してもいいですが、9xのDOSから「FDISK /MBR」を実行するのが簡単です(NT系の回復コンソールのFIXMBRは「Signature」をクリアしないので、この用途には使えない)。
- この方法は、当該パーティションが1番目の基本パーティションの場合は大抵うまく行きますが、2番目以降の場合で2K/XPが認識できるファイルシステムの他のパーティションが(HDDの先頭方向に)あると、起動中にそのパーティションを読みに行ってしまって、うまく行きません。このような場合、そのパーティションを一旦「隠し」にすればうまく行くことがあります(2K/XPは、基本的に「隠し」設定を無視するが、起動中はそうでもないらしい)。
- 一旦「Signature」をクリアした後で起動に失敗した場合、その失敗したときに作成された「volume GUID」が残っているので、次に何を試すにしても、再度クリアした上で行う必要があります。
- 他のNT系から、「Signature」がクリアされたHDD上のパーティションにドライブレターを割り当てていた場合、結果的にその設定もリセットされます。
- ドライブレターがずれた結果、本来のシステムフォルダのあるパーティション以外のパーティションを起動時に読みに行っている場合、OSが勝手にそのパーティションにシステムフォルダ(と同名のフォルダ)とその中に「System32」フォルダを作っていることがあります。逆にいえば、そこに必要なファイル群があれば起動できる可能性があるので、本来の「System32」フォルダの中身を一旦そこにコピーします(他のNT系等から作業することが前提)。
- これで2K/XPがとりあえず起動するようになれば、レジストリのMountedDevices直下の「volume GUID」を全部(である必然性はないが)削除してしまいます。これで再起動すると、OSは「volume GUID」を再作成します。この後は「Signature」をクリアする場合と同じです。
- これでうまく行けば、OSが勝手に作ったシステムフォルダ(と同名のフォルダ)を削除します。
- 「volume GUID」の名前を(2K/XPを一旦起動させた後で)手動で修正する。
- 本来のシステムフォルダのあるパーティション以外のパーティションにOSが勝手にシステムフォルダ(と同名のフォルダ)とその中に「System32」フォルダを作っている場合、本来の「System32」フォルダの中身を一旦そこにコピーします。
- これで2K/XPがとりあえず起動するようになれば、レジストリを修正して本来の「System32」フォルダを読みに行くようにします。本来のシステムフォルダのあるパーティションが、例えばD:であるはずなのに、他のパーティション(OSが勝手にフォルダを作成したところ)がD:になっている場合、そのD:になっているパーティションの「volume GUID」の「名前」(「\DosDevices\D:」となっているはず)のドライブレター部分を空いている他の適当なもの、例えばX:に修正した(「\DosDevices\X:」とする)上で、本来D:であるはずのパーティションの「volume GUID」の「名前」のドライブレター部分をD:に修正します(「\DosDevices\D:」とする)。
- これで再起動してうまく行けば、OSが勝手に作ったシステムフォルダ(と同名のフォルダ)を削除します。
- 「volume GUID」を(2K/XPの起動前に)ツールを使って修正する。
- 普通のレジストリエディタは稼働中のNT系のレジストリファイルを対象にしますが、稼働中でないNT系のレジストリファイルを他のNT系のregedit.exeで読み込んで修正する方法は存在します。
[参考情報] @IT: レジストリ・ハイブをロードしてオフラインでレジストリを閲覧・編集する (注17) 具体的な手順は、Manualの11- Updating Windows 2000/XP registryにある。
- 普通のレジストリエディタは稼働中のNT系のレジストリファイルを対象にしますが、稼働中でないNT系のレジストリファイルを他のNT系のregedit.exeで読み込んで修正する方法は存在します。
Appendix. エラーメッセージ
次のファイルが存在しないかまたは壊れているため、Windows を
起動できませんでした:
<Windows root>\system32\hal.dll.
上記のファイルをインストールし直してください。
XPのNTLDRが出すメッセージ。典型的には、Boot.ini中のシステムフォルダのARCパスの指定が間違っている場合に出ます。対処法はパーティション構成を確認してBoot.iniを修正することです。
[参考情報] | Microsoft: | コンピュータ起動時のエラー メッセージ"無効なBoot.iniファイルです"または"Windowsを起動できません" |
次のファイルが存在しないかまたは壊れているため、Windows 2000 を起動できま
せんでした:
<Windows 2000 root>\system32\ntoskrnl.exe.
上記のファイルをインストールし直してください。
上記の2K版。
コンピュータ ディスク ハードウェア構成の問題のため、Windows を起動で
きませんでした。
選択されたブート ディスクを読み取れませんでした。ブート パスとディスク
ハードウェアを確認してください。
ハードウェア ディスク構成については Windows のマニュアルを、
追加情報についてはハードウェアのマニュアルを確認してください。
XPのNTLDRが出すメッセージ。典型的には、Boot.ini中のARCパスで指定されたパーティションが実際には存在しない場合に出ます。対処法は上記と同じ。
コンピュータ ディスク ハードウェア構成の問題のため、Windows 2000 を起動で
きませんでした。
選択されたブート ディスクを読み取れませんでした。ブート パスとディスク
ハードウェアを確認してください。
ハードウェア ディスク構成については Windows 2000のマニュアルを、
追加情報についてはハードウェアのマニュアルを確認してください。
上記の2K版。
NTLDR is missing
Press Ctrl+Alt+Del to restart
NT系のPBRのブートコードが出すメッセージ(ファイルシステムがNTFSの場合)。文字通り、そのパーティションのルートにNTLDRがない場合に出ます。
[参考情報] | Microsoft: Windows 2000での"NTLDR Is Missing"エラーメッセージのトラブルシューティング方法 |
STOP: c000021a unknown Hard Error
Unknown Hard Error
- XPの起動中に出るブルースクリーン。「unknown Hard Error」は色々な場合に出ますが、XPを起動しようとしたとき、このXP本体(システムフォルダ)のあるパーティションが「隠し」設定になっている場合にも出ます(注18)。
(注18) 2Kの場合、2K本体のあるパーティションが「隠し」設定の場合でも問題なく起動する。NT4.0の場合、起動に失敗する(メッセージは出ない)。 - このような状態は、「アクティブ」設定を切り替える際に積極的に「隠し」状態も変えようとするソフト(PartitionMagic等。デフォルトでは「アクティブ」になる基本パーティションを「表示」に、それ以外の同じHDD上の基本パーティションを「非表示」=「隠し」にしようとする)と、「隠し」を考慮しないソフト(9xのDOSのFDISK等)を併用して作業した場合に起こり得ます。
- 対処法は、問題のパーティションを(PartitionMagic等で)「表示」にすることです。