ハードディスクの MBR/BPB を破壊してしまったときの復旧方法に関するメモ

このページはかなり ad hoc で不正確な内容が含まれるため、参考にする際は注意してください。また基本的に NTFS のことしか書いていません。また、大体Windows XPの頃の記事なのでWindows 7以降では一部異なるかも。

  • MBR(Master Boot Record)とは、ディスクの最初のセクタにあって最低限のブートローダやパーティションテーブルなどが入っている。
  • BPB(BIOS Paramater Block)とは、NTFS パーティションの最初のセクタのこと。そのパーティションのセクタ数、MFT の位置などが入っている。PBS と呼ばれることもあるかも?

MBR だけとんだ場合

データが問題なく読めている場合、何もしてはいけない。起動ドライブなどで OS が起動しなくて困るときは、DOS 窓から ERD を作ってそれから起動するのがよい。

format a:
attrib -s -h -r c:\nt*
attrib -s -h -r c:\boot*
copy c:\ntldr a:
copy c:\ntdetect.com a:
copy c:\boot.ini a:
attrib +s +h +r c:\nt*
attrib +s +h +r c:\boot*

boot.ini にはどのドライブから起動するかが書いてあるので、そのままではうまく行かないことがある。典型的な boot.ini はこんな感じ。

[boot loader]
timeout=30
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

SCSI の場合は multi のところから異なるらしいが、見たことがない。ふつうは rdisk(n) の部分だけいじればいい。0台めから数えて、BIOS に何台目として認識されているかを書く。プライマリマスタ、プライマリスレーブ、S-ATA0、に3台つながっていて、S-ATA0 から起動するときは rdisk(2) になる。ハードディスクが接続されていないインタフェイスが途中にあることは無視することになるから、増設するときは注意が必要になる。なお、 partition(n) はいじったことがないが、これは1から始まるらしい(多分 partition(0) は全体)。

cf. http://homepage2.nifty.com/winfaq/w2k/boot.html#800
cf. http://support.microsoft.com/kb/102873

万が一に備えて boot.ini のバックアップを取っておくといいと思うが、とっていなかった場合は状況によって回復コンソールからファイルを見ることができる場合もある(下記参照)。

fixmbr について

MBR を復旧させるために Windows(2000,XP)インストールディスクの回復コンソールを使って fixmbr を叩くという話がよく出てくるが、これはトラブルの元になるのでバックアップを取ってからでなければやってはいけない。ぐぐると簡単に復旧できた例が出てくるが、うまく行かないケースも多いし、より深刻なトラブルを招く。

以下どうしても必要な場合。まず修復する Windows 環境の Administrator のパスワードを要求されるが、特に XP では普段 Administrator という名前のユーザで使用せずに、Administrators 権限を持った別のユーザで使用していて Administrator のパスワードが不明な場合もあると思う。そのときはまずパスワードをクリアする必要がある。

cf. http://home.eunet.no/~pnordahl/ntpasswd/

S-ATA でも多くのドライバがあるので何とかなるケースが多いと思う。パスワードは安全に復旧させるために空文字列にし、具体的なパスワード設定は復旧後にすること。

回復コンソールでは、

map

でハードディスクとデバイス名とのマッピングを表示することができるが、fixmbr の引数として Partition1 を指定すると、パーティションが破壊されるから絶対にやってはいけない。必ず Partition0 を指定すること。

Partition1 を指定して破壊してしまったときは、おそらくパーティションの最初から 440 バイト(場合によって 512 バイト?)が破壊される。バックアップデータがある場合はここを書き戻してやると復旧することがある。BPB に関する下記資料を参照。

MBR/BPB のデータから修復を試みるための参考資料

  • 2006-09-02 追記

MBR について

           0  1  2  3  4  5  6  7   8  9  a  b  c  d  e  f
000001b0  00 00 00 00 00 2c 44 63  90 90 90 90 90 80 80 01  |.....,Dc........|
000001c0  01 00 07 fe bf 8c 3f 00  00 00 0e 12 a0 00 00 00  |......?.........|
000001d0  81 8d 0f fe ff ff 4d 12  a0 00 d4 6e af 0d 00 00  |......M....n....|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|

の部分がパーティションテーブル。AT 互換機は1つのディスクに4つの物理パーティションを持つことができる。0x1be から 16 バイトごとに4つ。最後の 0x55aa はマーカー(固定)。だから

Partition Table
1st Partition80 01 01 00 07 fe bf 8c 3f 00 00 00 0e 12 a0 00
2nd Partition00 00 81 8d 0f fe ff ff 4d 12 a0 00 d4 6e af 0d
3rd Partition00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
4th Partition00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

となっている。つまりこのディスクには2つしかパーティションがない。

ABCD
1st Partition8001 01 0007fe bf 8c3f 00 00 000e 12 a0 00
2nd Partition0000 81 8d0ffe ff ff4d 12 a0 00d4 6e af 0d

A が 0x80 のとき、そのパーティションから起動可能。Bがパーティションの種類で、0x07 が NTFS、0x0f が拡張パーティションとなる。0x0f で示されたパーティションの中には再び MBR があり、入れ子構造をとる。Cはパーティション開始セクタ、Dは終了セクタを示す。ともにリトルエンディアンなので、

開始終了
1st Partition0x0000003f0x00a0120e
2nd Partition0x00a0124d0x0daf6ed4

と読むことになる。(説明をしていない6バイト分はこれらを CHS で表記したものだが、CHS 表記は 8GB までしか表せず、今は利用されてないらしいのでパス。8GB 以上のディスクが扱える BIOS や OS なら無視すると思う。)

0x0000003f + 0x00a0120e = 0x00a0124d となるが、いつもこうなっているのかは確かめていない。

最初のパーティションは NTFS なので、0x0000003f + 0x00a0120e – 0x1 = 0x00a0124c = 10490444 セクタにバックアップ BPB がある。これは BPB である 0x3f = 63 セクタと一緒なはず。

ここで最初のパーティションは 0x0000003f = 63 セクタから始まり、2つめのパーティションは 0x00a124d = 10490445 セクタから始まる。10490445 セクタスキップして dd するとこんな感じ。

000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 01  |................|
000001c0  81 8d 07 fe ff ff 3f 00  00 00 e7 f7 df 01 00 00  |......?.........|
000001d0  c1 ff 05 fe ff ff 26 f8  df 01 ae 76 cf 0b 00 00  |......&....v....|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|

この構造は MBR と一緒なので、アドレス位置や読み方は一緒。ただしこの番地からの相対アドレスとなる。次のパーティションは先の規則から 0x01dff826 = 31455270 で、31455270 + 10490445 = 41945715 セクタに次のセクタの先頭がある、という風に読む。

なおこのセクタの 0x1bd までに何か書いてあることもあるが、使われることはない。

BPB の読み方

00000020  00 00 00 00 80 00 80 00  0d 12 a0 00 00 00 00 00  |................|
00000030  00 00 04 00 00 00 00 00  20 01 0a 00 00 00 00 00  |........ .......|

0x28 からが総セクタ数。0x30 からが MFT の位置で、0x38 からがバックアップ MFT の位置(後述)。他にも色々あるらしいがバックアップに必要そうなのはそのくらい。

MFT の位置

MFT は NTFS におけるファイルアロケーションテーブルのようなもの。セクタの最初が FILE の4文字から始まっている。MFT 本体とバックアップ MFT とがあり、ともに読めないといけないらしい。大概通常の MFT はディスクの先頭に近い位置にある。シリンダ(ふつう8セクタ)で表示されるが 0x40000~0xc0000 付近。ディスクの容量によるが、大体同じ位置にあるようだ。BPB(NTFS パーティションの最初のセクタ)の 0x30 から。以下いくつかのディスクの例。

00000030  00 00 04 00 00 00 00 00  20 01 0a 00 00 00 00 00  |........ .......|

00000030 00 00 0c 00 00 00 00 00 7e ff 1d 00 00 00 00 00 |........~.......|

00000030 00 00 0c 00 00 00 00 00 66 f7 bc 00 00 00 00 00 |........f.......|

最初のディスクだと、MFT が 0x40000、バックアップ MFT が 0xa0120 にあることになる。ディスクの先頭にある最初のパーティションであれば、0x40000 = 262144, 262144 * 8 = 2097152, 2097152 + 63 = 2097215 セクタから MFT が始まる。

またバックアップ MFT は、通例パーティションの真ん中のシリンダにある。

参考

ツールなど

Disk Probe

Windows2000/XP 系でディスクの生データを読んだり書いたりするツール。インストールディスクの \SUPPORT\TOOLS にあるらしいが、OEM などのためにディスクがない場合は Microsoft のサイトから落として来られるらしい。Support Tools で探せば見つかりそうな気がする。インストール時は Complete を選択すること。

Cygwin を使う
dd if=\\.\PHYSICALDRIVE1 of=hdd.img bs=512
dd if=\\.\c: of=bpb.img bs=512 count=1

こういうことができるらしい。書くことはできなさそう

MBR(マスタブートレコード)

00000000  33 c0 8e d0 bc 00 7c fb  50 07 50 1f fc be 1b 7c  |3.....|.P.P....||
(略)
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|

最初の 3…..|.P.P….| がポイントか。0x1bd まではプログラムなので、Windows の MBR なら大体こんな感じになるはず。

BPB(ブートセクタ、BIOS Parameter Block)

00000000  eb 52 90 4e 54 46 53 20  20 20 20 00 02 08 00 00  |.R.NTFS    .....|
(略)
000001f0  00 00 00 00 00 00 00 00  83 a0 b3 c9 00 00 55 aa  |..............U.|

0x003 から NTFS が入るからすぐわかるはず。あと 0x1ef から 0x55aa というのは MBR/BPB 共通らしい。

(? – 2006.12.14)