Palm84 某所の日記

死のうは一定、しのびクマには何しよぞ...

Vista 以降の「NTシグネチャ」のアレコレ

2011.6.8 ちょこちょこ追記

知ってる「つもり」でいるとイザという時にドツボにはまりそう。

結論からまとめとくと

  • Vista 以降ではNTシグネチャを消すとWindows は起動しなくなる
  • Vista 以降ではNTシグネチャが自動修復されない
  • 「スタートアップ修復」で修復できる
  • 「スタートアップ修復」では、7/XPのデュアルブートはBOOTMGR→NTLDRのチェインロードとなる
  • NTシグネチャを消してしまうツールに注意、Vista 以降があるPCでは使ってはいけない
    • fdisk /mbr (MS-DOS, FreeDOS)
    • install-mbr (Linux など)
    • TestDisk バージョン 6.12 までの MBR Code
    • ms-sys -z, ms-sys --mbrzero (Linux など)
INDEX

「NTシグネチャ」って何?

MBR内のブートストラップの後方、パーティションテーブルの手前、0x1B8から0x1BBの4バイトのこと、Windows のブートに関わる重要な情報、ドライブ文字などが書かれてるようでおま。Windows 以外のOSではなんにも関係がないとか。

  • 自作 Windows 7
ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------------
000001B0  65 6D 00 00 00 63 7B 9A 99 1F 21 F3 00 00 80 20
000001C0  21 00 07 DF 13 0C 00 08 00 00 00 20 03 00 00 DF
000001D0  14 0C 07 FE FF FF 00 28 03 00 00 90 A0 0C 00 FE
000001E0  FF FF 07 FE FF FF 90 BF A3 0C 00 00 35 0C 00 FE
000001F0  FF FF 0F FE FF FF 1D F1 D8 18 93 91 AC 31 55 AA

正式な名前ではない模様で「Disk identifier」「Disk MBR signature」とか「volume information」なんて書かれてることもあります。シグネチャと呼ぶとブート・シグネチャと近藤勇さんしそうなので「Disk ID」とかな方がわかりやすいかも。

  • レジストリで確認
C:\Users\yassy>reg query HKLM\SYSTEM\MountedDevices /v \DosDevices\C:

HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
    \DosDevices\C:    REG_BINARY    991F21F30000500600000000
  • DISKPART コマンド (2桁区切りで逆並び)
DISKPART> select disk 0

ディスク 0 が選択されました。

DISKPART> detail disk

WDC WD6400AAKS-00A7B2 ATA Device
ディスク ID: F3211F99
種類       : ATA
状態       : オンライン
パス       : 0
ターゲット : 0
LUN ID     : 0
場所のパス : PCIROOT(0)#PCI(1F02)#ATA(C00T00L00)
現在の読み取り専用状態: いいえ
読み取り専用  : いいえ
ブート ディスク  : はい
ページ ファイル ディスク  : はい
休止状態ファイル ディスク  : いいえ
クラッシュ ダンプ ディスク  : はい
クラスター化ディスク  : いいえ

  Volume ###  Ltr Label        Fs    Type        Size     Status     Info
  ----------  --- -----------  ----  ----------  -------  ---------  --------
  Volume 1        システムで予約済み    NTFS  Partition    100 MB  正常       システム
  Volume 2    C                NTFS  Partition    101 GB  正常       ブート
  Volume 3    E   backup       NTFS  Partition     97 GB  正常
  Volume 4    D   data         NTFS  Partition    397 GB  正常

XPでは、これを消してしまうと Windows 上で変更したドライブ文字などが元に戻ってしまったりします。

Vista 以降ではXP以前とは違い、なんと起動できなくなってしまうようでありまする。
Σ(゜д゜lll)ガーン

但し、これについて問題になるのはHDの引っ越しやパーティション・イメージのコピー時などだけではないかと思います。ツール側で対応していないこともある様なので注意しておきませう。

Vista以降のWindows OS(Vista, Server 2008, 7)では、従来OS(NT, 2000, Server 2003)とはブート方式が変更されたことに伴い、起動時に「NTシグニチャ」がクリアされていることを検知した際の振る舞い(仕様)が変更されました。

従来OSでは起動時に「NTシグニチャ」がクリアされていることを検知した場合、その起動処理の中で、そのハードディスクに新たな「NTシグニチャ」を書き入れていました。いわばOS本体の中に“NTシグニチャ自動修復機能”のようなものがあったわけです。

Vista以降のOSでは仕様が変更され、OS本体から“NTシグニチャ自動修復機能”は取り去られてしまいました。起動時に「NTシグニチャ」がクリアされていることを検知した場合、起動処理はそこで中止し、ユーザに「スタートアップ(環境の)修復」の実行を促す形となりました。ユーザが「スタートアップ修復」をおこなうと、その過程で新たな「NTシグニチャ」が当該ディスクに書き込まれます。

  • 自作 Windows XP
ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------------
000001B0  00 00 00 00 00 2C 44 63 41 44 42 44 00 00 80 01
000001C0  01 00 07 FE FF FE 3F 00 00 00 03 9A 20 03 00 00
000001D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE
000001E0  FF FE 07 FE FF FE 42 9A 20 03 76 16 71 02 00 FE
000001F0  FF FE 0F FE FF FE B8 B0 91 05 BF 98 9A 0D 55 AA
  • DELLの Windows 7
ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------------
000001B0  65 6D 00 00 00 63 7B 9A 00 00 00 90 00 00 00 01
000001C0  01 00 DE FE 3F 07 3F 00 00 00 C9 F5 01 00 80 08
000001D0  01 08 07 FE FF FF 00 F8 01 00 00 F0 03 01 00 FE
000001E0  FF FF 07 FE FF FF 00 E8 05 01 7A C3 92 0C 00 FE
000001F0  FF FF 0F FE FF FF 00 B0 98 0D 00 A8 9F 2C 55 AA

スタートアップ修復(自動修復)

Linux 使える方なら...

Windows PE の regedit コマンドなどでIDを確認、で Linux の dd コマンドで MBRをバックアップ、バイナリ編集して dd で書き戻し、とかでもイケるかもしれない。

VMware Player 上で確認したところ、書き戻し直後の起動でスタートアップ修復を促す画面が出ましたが、通常起動を選択して起動できました。

NTシグネチャの修復は「スタートアップ修復」で可能。スタートアップ修復は「システム回復オプション」に含まれる。システム回復オプションとはいわゆる Windows RE(Windows 回復環境)のこと。

起動関連の問題が発生した場合に自動起動したりする模様 Windows RE を起動させると「自動修復」機能が動くようです(サーバー版除く)。自動起動できない場合は以下のいずれかの方法で。

というか、自動でだめな場合は「スタートアップ修復」のみでは修復不可ということかも。後述の「失敗する場合」の確認が必要かも

  1. Windows インストールDVDでブートして「コンピューターを修復する」
  2. Windows 7 の「システム修復ディスク」でブート
  3. 起動時にブートメニューを出して「コンピューターの修復」を選択(Vista では標準ではインストールされないがメーカー製PCの多くはインストール済)
    • NTシグネチャ消去時には起動できるのかどうか?多分だめ
  4. インストールファイルがHD上にあるなら PE でブートして Setup.exe を実行

「スタートアップ修復」に失敗する場合は

あるいは、自動修復実行後も起動できない場合とかも。

「スタートアップ修復」に失敗する場合は下記も試すべし

  1. アクティブ設定の確認
  2. BootRecコマンドの実行(インストールDVD or Windows RE をブート)
    • bootrec /fixmbr - MBR(のブートストラップ)修復
    • bootrec /fixboot - PBR(へBOOTMGR-IPL)書き込み
    • bootrec /rebuildbcd - BCD(BOOTMGR設定)ファイル修復
  3. 起動確認
  4. だめなら再度「スタートアップ修復」で確認
こんなマルチブート環境では問題が出るかも

ちょっと特殊な環境かな

  • 一例 : 1stブートローダーから1回の選択で下記をブートさせている
    • C:\ NTLDR から XPブート
    • D:\ BOOTMGR から 7ブート

こんな場合に「スタートアップ修復」を使うと問題が出るようであります。1stブートローダーから Windows を選択後に Windows のブートメニューが表示され再度選択が必要になってしまうというかんじ。

「『スタートアップ修復』の処理中に複数のWindowsシステムドライブを検出した場合に“マイクロソフト的な初期状態”に変更されてしまう」と書きましたが、これはマルチブート環境を二段階ブートに統一してあって、複数のWindowsのうちどれが壊れようが消されようが、他のWindowsは一切影響受けずに問題なく起動が可能な(理想的な)マルチブート環境に構築してあったとしても、「スタートアップ修復」をおこなうと“そういう状況”は一切無視され、一つのWindowsパーティションから別のWindowsがパーティションが呼び出されるという、Windows OSどうしの独立性の低い(依存性の高い)、マイクロソフト的なマルチブート環境に勝手に作り変えられてしまうということです。

実験してみたお

あくまで一例なんで参考程度にしといてください。。。

  • 確認環境 :
    • VMware Player 3
    • Windows 7 Enterprise 評価版 x86 SPなし

まずは、dd.exe でMBR(など)をバックアップ

dd if=\\?\Device\Harddisk0\Partition0 of=mbr2050.bin bs=512 count=2050
  • 元のNTシグネチャ
ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------------
000001B0  65 6D 00 00 00 63 7B 9A 15 6C 99 D1 00 00 80 20
000001C0  21 00 07 DF 13 0C 00 08 00 00 00 20 03 00 00 DF
000001D0  14 0C 07 FE FF FF 00 28 03 00 00 00 80 07 00 FE
000001E0  FF FF 07 FE FF FF 00 28 83 07 00 D0 7C 0C 00 00
000001F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA

Ubuntu LiveCD でブートして install-mbr 実行。NTシグネチャは 00 00 00 00 になってしまいました。パーティションテーブルの直前446バイト目まで上書きされました。

ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------------
000001B0  00 02 90 C7 12 00 80 00 00 00 00 00 A8 01 80 20
000001C0  21 00 07 DF 13 0C 00 08 00 00 00 20 03 00 00 DF
000001D0  14 0C 07 FE FF FF 00 28 03 00 00 00 80 07 00 FE
000001E0  FF FF 07 FE FF FF 00 28 83 07 00 D0 7C 0C 00 00
000001F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA

HDから再起動すると「windows ブート マネージャー」のエラー画面が出ます。起動時にF8(F5)キーを押してもブートメニューは出ないので何も起動できません。

システム修復ディスクのCDからブートするとキーボードなどの選択後に自動修復機能が動くようです。



この後、通常起動可能になりました。

ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------------
000001B0  00 02 90 C7 12 00 80 00 5E F4 D7 3F A8 01 80 20
000001C0  21 00 07 DF 13 0C 00 08 00 00 00 20 03 00 00 DF
000001D0  14 0C 07 FE FF FF 00 28 03 00 00 00 80 07 00 FE
000001E0  FF FF 07 FE FF FF 00 28 83 07 00 D0 7C 0C 00 00
000001F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
  • NTシグネチャ書き込み
    • 変更、丸っきり元の状態に「復元」するのではなく「修復」ということかな
  • システムで予約済み領域にバックアップ(?) \Boot\BCD.Backup.0001 作成
  • ブートストラップは書き込みなし(install-mbrのものと同じまま)

※ Windows 標準のブートストラップに戻すには bootrec または bootsect コマンド(※ PE2.1, Vista SP1以降)の実行が必要。

bootrec /fixmbr または bootsect /nt60 sys /mbr を実行するとMBRのブートストラップ部分440バイトが上書きされました。

ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------------
000001B0  65 6D 00 00 00 63 7B 9A 5E F4 D7 3F A8 01 80 20
000001C0  21 00 07 DF 13 0C 00 08 00 00 00 20 03 00 00 DF
000001D0  14 0C 07 FE FF FF 00 28 03 00 00 00 80 07 00 FE
000001E0  FF FF 07 FE FF FF 00 28 83 07 00 D0 7C 0C 00 00
000001F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
MBR446バイトをクリアすると
  • ブートストラップがないのでHDからは何も起動しない
  • REを起動させると自動修復が実行されたがブートストラップがない為、何も起動しない(GRUBなどでPBRのからの起動は可)
  • NTシグネチャは書き込みされたがMBRにブートストラップがない為、何も起動しない(GRUBなどでPBRのからの起動は可)
  • bootrec /fixmbr 実行でMBRから起動可能になった
修復後に問題発生?

要確認かな。

元々異常があったのかもしれませんが、HD上のRE(「コンピューターの修復」)が起動できなくなりました。F8キー連打でメニューは出ますが選択してもエラーとなってしまうのです。

いちお解決しましたが...

ブートストラップを上書きするツールについて

XP マシン用にはよく使ってたツールのあれこれ。Linux と マルチブートしているユーザは覚えておくべきかも。

使うと危険なツール

下記コマンドはMBRの446バイトを上書き、NTシグネチャをクリアしてしまいます。Vista 以降のPCで使ってしまうと
起動しないお!Σ(゜д゜lll)ガーン となりまつ。

  • fdisk /mbr (MS-DOS, FreeDOS)
  • install-mbr (Linux など)
  • TestDisk バージョン 6.12 までの MBR Code (※ バージョン 6.13 では修正されてるかも?)
  • ms-sys -z, ms-sys --mbrzero (Linux など)

Ubuntu のフォーラムを覘いてみますと install-mbr で「やってもうた!」な例があるみたいですね。