目次
関連ページ
このコーナーでは、Windows XP/2000 が起動しなくなったときに、その原因を突き止め、修復する方法を扱います。対象とするのは下記図1の緑色の枠内でのトラブルです。
よって、BIOSの段階での異常は扱いません。スイッチを入れても 『ピッ!』とも言わないようなトラブルは対象外です。
また、カーネルが立ち上がってからのトラブルも対象外です。XPであれば、下図のような起動画面が表示されるところまで行くのであれば、カーネルに制御が移っているので対象外になります。
(例外として、アクティブでない領域のブートセクタや拡張パーティションブートレコードのエラーをこのコーナーの範疇として取り上げていますが、その場合は、この起動画面は出ます。)
XPの起動画面(通称ピロピロ)
なぜ起動しないのかを理解するためには、まず先に正常な場合はどのように起動しているのかを知る必要があります。しかし、最初からOSマルチブートやサードパーティのブートローダーを使ったブートの仕組みを理解するのには無理があります。そこでこのページでは、物理的に1つのハードディスクドライブを搭載し、Cドライブ・Dドライブにパーティションが切られている。CドライブにWindows
XPがインストールされていて、Dドライブはデータ領域として使われているという、きわめて一般的な例を考えてみます。ファイルシステムは両ドライブともNTFSであるとします。
まず、下の図1を御覧下さい。上から順に、流れに沿って見て行きましょう。
図1
パソコンのスイッチを入れると、まずマザーボードに帰属するBIOSというプログラムが実行されます。BIOSは周辺機器の準備などの初期作業を行ったうえで、起動ドライブを探します。このときの探す順序はBIOSの設定でユーザーが設定することができます。例えばFD→CD→HDという設定になっていれば、まずフロッピードライブを探し、そこに起動ディスクがなければCDドライブを探し、そこにも起動ディスクがなければハードディスクから起動しようとします。
さて通常の場合には、FDにもCDにも起動ディスクが装填されていないので、ハードディスクから起動することになります。この時BIOSは何ギガバイトもあるハードディスクのどこを探しに行くのでしょう?答えは簡単で、一番先頭のセクタを読みに行きます。セクタというのはハードディスクを構成する最小単位の小部屋だと思ってください。HDDの場合、512バイトごとにセクタという小部屋に分かれています。。
ハードディスクの先頭セクタには、特別なプログラムとデータが用意されています。これがMBR(マスターブートレコード)です。実際にどのようなものなのか、【Disk Probe】というプログラムを使って見てみましょう。【Disk Probe】は使い方に癖があるソフトなので、以下詳しく図解していきます。
【Disk Probe】はマイクロソフト純正のプログラムで、ハードディスクに書き込まれたバイナリデータをセクタ単位で表示するエディタです。この種のアプリケーションを Sector Editor と呼びます。Windows 2000/XPのインストールCD-ROMの中の「Support\Tools」フォルダに、Support Toolsとして他のプログラムと一緒に収録されています。またインターネット経由でも入手できます。ただし、フルインストールにしないとdskprobe.exeはインストールされません。むしろインストール用ファイルを先に解凍して、dskprobe.exeのみを取り出して使うことをお勧めします。MSのサイトではXP SP2専用のようなことが書いてありますが、取り出して使えばNT系のOSならばどれでも使えるはずです。 |
【Disk Probe】を起動して、メニューの Drives | Physical Drive... を選びます。
図2
ダイアログが開くので、下の図のところをダブルクリックします。
図3
赤線のところが、PhysicalDrive0 になりましたね。間違えて大事なデータを書き換えてしまわないようにRead Only のチェックは付けたまま、Set Active ボタンをクリック。
図4
赤線部分がNo Active HandleからPhysicalDrive0に変化します。OK ボタンをクリック。
図5
メインウインドウに戻るので、Sectors | Read を選びます。
図6
一番最初のセクタを読み込みたいので、Starting Sector に0を入力。Number of Sectorsというのはそこから何セクタに渡って連続して読みこむかの設定です。とりあえず1にしておきます。Read ボタンをクリック。
図7
すると図8のように、最初のセクタが表示されました。(色分けは、あとから付けたものです) これがMBRの存在するセクタです。
図8
数字は全て16進法で表示されています。現物のディスクには2進法で記録されているわけですが、それではあまりに冗長な表示になるので、2進法と相性の良い16進法で表しているのです。
慣れない人のために16進法を説明しておくと、我々が慣れ親しんでいる10進法の0〜9までの10個の数字に加えて、A,B,C,D,E,Fの6個の文字を使うことによって16までカバーします。たとえばBは11の意味で、Fは15の意味で使われます。上の図を見ると、2つずつ数字がくっついていますね。00〜FFまで16×16すなわち256すなわち「2の8乗」通りの数を2つのくっついた数で表現できます。「2の8乗」というのは8ビットすなわち1バイトです。2つ組みの数字が上の画面では512個あります。つまり一画面で512バイトすなわち1セクタ分表示されているわけです。 |
黄色く塗りつぶした446バイトの部分がブートストラップローダと呼ばれるプログラム部分です。そのあとの赤、青、橙、緑で塗りつぶした16バイト×4の部分がパーティションテーブルです。最後の紫で塗りつぶした2バイトはブートシグニチャといわれる部分で、正統性を示す署名です。必ず55 AA(リトルエンディアンなので本当はAA 55)になるのがお約束です。
まず説明の都合上、先にパーテイションテーブルから説明します。4箇所に分かれていますね。これはハードディスクを4つの領域に分けて管理する仕組みによるものです。
図9
図9のように最大4つの領域を作ることができます。ところが4つでは足りないという人もいるんですね。そこで考えられたのが、基本領域の変わりに拡張領域を作るという方法です。
図10
拡張領域は自分自身の中に複数の論理領域(黄色い四角で示したところ)を持つことができます。 拡張領域というのは論理領域を保持するコンテナだと考えれば良いでしょう。1つ1つの論理領域は基本領域と同じように独立したパーティションとして扱うことができるので、最大4つという縛りは解消されます。(図10では青と黄色合わせて9個ですね)
図8を見てください。赤と青の部分には数字が並んでいますが、橙と緑の部分は00ばかりです。これは3番目と4番目には領域が設定されていないということを意味しています。あくまでも最大4個であって、1個でも2個でも3個でも構わないのです。今の例では2個の領域(CドライブとDドライブ)のみがあるということです。
次にもう少し詳しく、図8の赤と青の領域の数字を分析していきましょう。下のような表にしてみます。
情報の種類 | バイト数 | 赤い領域 | 青い領域 |
ブートインディケータ | 1 | 80 | 00 |
開始位置(CHS) | 3 | 01 01 00 | 00 C1 FF |
システムID | 1 | 07 | 05 |
終了位置(CHS) | 3 | EF FF FF | EF FF FF |
開始位置(LBA) | 4 | 3F 00 00 00 | 10 1D 91 05 |
総セクタ数(LBA) | 4 | D1 1C 91 05 | 00 C4 BF 03 |
まずブートインディケータですが、これは 80 か 00 の2種類の数字しかありません。80 はその領域がアクティブであることを示します。アクティブな領域は1つの領域だけに許されます。後述しますが、80が2箇所以上にあったり、80や00以外の数字が存在するとエラーになります。今の例では、赤い領域がアクティブになっていることがわかりますね。
次にシステムIDを見てください。赤は07、青は05になっています。07はパーテイションのファイルシステムがNTFSであることを意味しています。05は拡張領域であることを意味します。その他にも多くのシステムIDを表す数字がありますが、そんなものを暗記しておく必要はありません。必要があればそのときに調べればよいだけです。
もう1つ、開始位置(LBA)を見てください。赤い領域では 3F 00 00 00ですね。私達の使っているパソコンは、こういう場合、2個ずつくっついている数字を2こずつのまま、ひっくり返して最後から読むという、リトルエンディアンという方式で読み取ります。どうしてそんな面倒なことをするのかと思うでしょうが、CPUがそうやっているのだから、こちらも従うしかありません(笑)。今の場合、00 00
00 3F になります。ちなみに青い領域では、05 91 1D 10 になりますね。それぞれ10進法に直すと、63 と 93396240 になります。
16進数を10進数に直すのは、Windowsのアクセサリの中のプログラムである「電卓」を使うのが簡単です。電卓を開いたらメニューの表示から「関数電卓」を選んで下さい。百円ショップで売られているような電卓が数千円の高級品に姿が変わりましたね。あとは、16進のラジオボタンに印をつけてから『3F』と打ち込み、10進に印を付け替えてください。『63』と10進表示に変わります。 |
ここまでで色々な事がわかりました。図8の例では、63セクタ目から始まる第1パーティションがアクティブな基本領域でNTFSでフォーマットされていること、93396240セクタ目から始まる第2パーティションが拡張領域であること、それ以降の領域は存在しないこと、などです。拡張領域中にいくつ論理領域があるのかなどは、このセクタからではまだ判りません。
さて説明の都合上、順序が逆になりましたが、黄色く塗りつぶした部分、すなわちブートストラップローダの働きを説明します。ブートストラップローダはBIOSに続いて最初に実行されるプログラムで、パーティションテーブルを調べ、アクティブな基本領域の開始位置を見つけます。今の場合第63セクタ目でしたね。図1を見て欲しいのですが、その位置にブートセクタがあるのです。そのブートセクタをメモリにロードし、制御をそちらに移します。図1で言うと、黄色い領域まで進んできました。
それでは、【Disk Probe】で第63セクタ(Cドライブのブートセクタ)を見てみましょう。メニューのSectors | Read を選びます。開いたダイアログで63と入力し、Read ボタンをクリックします。
図11
すると図12のようになります。
図12
青く塗りつぶした部分はディスクパラメータと呼ばれる部分で、このパーティションの情報が記録されています。いくつかの項目を紹介すると、(NTFSの場合には)、ファイルシステム名・1セクタあたりのバイト数・1クラスタあたりのセクタ数・総セクタ数・MFT(マスターファイルテーブル)の開始クラスタ番号などが記録されているのです。興味のある方は、解説ページをご覧下さい。あるいはNTFSならば【Disk Probe】のメニューでView | NTFS BootSector を選ぶと項目が確認できます。ただし細かい項目まで暗記する必要はありません。とりあえず「パーティションの情報が記録されている場所だ」という認識だけで充分です。
赤く塗られた場所はIPL(Initial Program Loader)と呼ばれ、XPのようなNT系では特にNT-IPLと呼ばれます。NT-IPLは同一パーティションのルートディレクトリの中からNTLDRという名のファイルを探し、NTLDRに制御を渡すプログラムです。この段階で初めてファイルと言う概念が出てきましたね。ここまではずっとセクタの番地で指定して、次に制御を渡してきましたから。初心者が誤解しやすいところなのですが、MBRとかブートセクタというのはファイルではないのです。HDDに直接書き込まれたバイナリデータなのです。ファイルシステムの範疇外なのです。だから、これがどんなものであるかを確認するために、【Disk
Probe】などという見慣れないセクタビューワを使ったのです。ファイラーであるエクスプローラなどでは、MBR/ブートセクタは『見えない』のです。
余談ですが、Win98をCドライブにインストールしておいて、そのあとDドライブにWinXPをインストールしてデュアルブートにする場合、Cドライブのブートセクタは、98が一旦作ったDOS-IPLからXPが作るNT-IPLに置き換えられます。(DOS-IPLはBOOTSECT.DOSというファイルに姿を変えます。) そして本来XP由来のファイルであるNTLDRなどのブートファイル群はDドライブ(XP)ではなくCドライブ(98)のルートに作製されます。これはNT-IPLがアクティブな領域(Cドライブ)の中へしかNTLDRを探しに行かないようになっているからです。 |
最後の紫の部分は、例のお決まりのブートシグニチャです。(リトルエンディアンでAA55ですね。)
え?最初の3バイトが気になる? これはジャンプ命令です。EB 52 で「52バイト飛び越えた先にジャンプしろ」という意味で、90 はNOPといってなにもしない命令です。プログラムは先頭から順に読まれていくので、先頭2バイトのところから一気に52バイト進んで、54バイト目からプログラムが実行されていくことになります。興味のある方は逆アセンブルしてみてください。やり方は【Disk Probe】でこのセクタを名前をつけて保存します。その後コマンドプロンプトで debug [ファイル名] 続けて-u で逆アセンブルできます。やめたくなったら -q です。まあ、一般の方には関係のない情報ですが。 |
さて、図1を見るとかなり後半まで来ました。紫色で示した領域です。もう少しですから辛抱して読んでください。NTLDRはBOOT.INIの記載内容にしたがって、(マルチブートならばOS選択メニューを表示しオーナーに選択させることによって)OSをブートさせるファイルを探します。BOOT.INIではARCパスという一風変わった表現方法でパーティションが書かれています。今回の例では、以下のようになっています。
multi(0)disk(0)rdisk(0)partition(1)\Windows
これはプライマリなHDDの第1パーティションのWindowsフォルダという意味ですが、見慣れた形式で書くとC:\Windowsのことです。この位置をNTLDRはNTDETECT.COMに伝え、NTDETECT.COMはC:\Windows及びそのサブフォルダの中にNTOSKRNL.EXEというファイルを探しに行きます。(NT系OSのカーネルの実行ファイルであることを高々と宣言しているような名前のファイルですね。)実際には、NTOSKRNL.EXEはC:\Windows\system32にあります。
その後NTOSKRNL.EXEは例のピロピロと呼ばれるXPの起動画面を表示して、XPを起動していくわけです。
以上がXPのブートの説明です。パソコンのスイッチを入れると、パソコンの中では、こんなにいろいろなことが行われていたんですね。
図8および表1の記載から、2つ目のパーティションは、この例では第93396240セクタから開始している拡張領域であることがわかりました。【Disk Probe】でこの開始セクタを見てみましょう。メニューのSectors | Read を選びます。開いたダイアログで93396240と入力し、Read ボタンをクリックします。
図13
すると図14のようになります。
図14
ほとんど00ばかりなので、一部分大切なところだけを図示しています。MBRのパーティションテーブルに似ていますね。このセクタを拡張パーティションブートレコード(Extended Partition Boot Record)と呼びます。でもEPBRにはテーブルが2つしかありません。これは今回の例に限らず、常に2つと決まっています。どうして2つなのか?図15をご覧下さい。
図15
MBRには4つのテーブルしか記載することができず、それが領域を4つまでしか作れないという制限事項になっていました。EPBRではこの方式を改め、次の論理領域の場所を数珠つなぎ方式で示す方法にしています。(プログラミング用語で言うとリスト構造かな?) すなわち、自身の論理領域の情報を示すテーブルが1つと、すぐ次の論理領域の情報を示すテーブルが1つの、合わせて2つのテーブルを持つという仕組みになっています。この方法ならば、延々と続けることで理論上限りなく論理領域を作ることができますね。(実際には他の要因によって制限はあります。)
分かりにくいと思うので喩えを用います。あなたが人間ドッグを受けに行ったと思ってください。検査項目は20以上もあります。このとき間違わずになおかつダブらずに全ての被験者に全ての検査を受けさせるために、人間ドッグセンターはどのようなシステムにすれば良いでしょうか?1番最初に全ての被験者に回る順番を書いた紙を渡すというのが誰でも考えつく方法です。しかし、尿を取ったり、バリウムを飲んだり、機械の上で回されたりと色々な作業をこなさなければいけないので、できれば被験者も手ぶらの方が望ましいでしょう。そこで登場するのが数珠繋ぎ方式です。1つの検査が済んだら「次は眼底検査のところへ行ってください」と検査員が被験者に伝え、眼底検査が終わったら同様に「次は肝エコー」というように、次に行くべき場所をその場で教えるのです。最後の検査が終わったら、「これで全て終了です。」と言われて、はじめて被験者は全て終了したことを知ると言うシステムです。個々の検査員にしても、自分の次の検査名だけを覚えておけば良く、すべての検査順などは全然知らなくても問題ないわけです。上の図15は、このような概念を示したものです。
図14で、赤い領域はDドライブの本体が開始するセクタや論理領域のサイズ・ファイルシステムなどを示しています。表1と同じ仕組みです。この例では 00 00 00 3F すなわち、現在のセクタ(第93396240セクタ)を起点として63セクタ後ろからDドライブ本体(第1論理領域)が始まることを示しています。青い領域は00ばかりですね。今回の例では、次のパーティション(第2論理領域)が存在しないのだから当然です。人間ドッグならば「これで終了です。」と言われた状態ですね。もし更に他の論理領域が存在するのならば、ここにはもちろん直後の論理領域に関する情報を示す数字が並ぶことになります。
以上のことから、今回の例では、第93396240から始まる拡張領域は、論理領域を1つだけ包含する物であることが判りました。赤い領域の5バイト目が
07 であることから、その論理領域のファイルシステムがNTFSであることも判ります。
それでは【Disk Probe】で、Dドライブ本体の開始点である 93396240 + 63 = 93696303 セクタを見てみましょう。
図16
図17
図12のCドライブのブートセクタとそっくりですね。実際赤いところ(NT-IPL)は全く同じです。ただし、このパーティションにはOSが入っていないので、このIPLが実行されることはありません。青い領域(ディスクパラメータ)は、もちろんDドライブの独自の情報ですから、Cドライブのものとは一部異なります。