【KNOPPIX】を使った、セクタのバックアップ

【TestDisk】は大変便利なソフトなのですが、MBR・ブートセクタなど大事なセクタを書き直してしまうので、修復の結果が思わしくなく、せめて修復操作前の状態に戻したいと思っても戻せません。失敗に備え、重要なセクタのバックアップを取っておくのが良いでしょう。

Windows上の操作であれば、【Disk Probe】を使って簡単にセクタのバックアップが取れます。しかし、Windows起動不能の場合には、別の方法をとる必要があります。既に紹介した【PTS DiskEditor】には、セクタをファイルとして保存する機能は残念ながらありません。

そこで、Windowsが起動せず、【Disk Probe】が使えない状態でも、【KNOPPIX】を使って、希望するセクタをバックアップしたり、バックアップから戻したりする方法を紹介します。

と言っても、UNIXをお使いの方にはおなじみの ddコマンドを使うだけです。私も含めてWindowsばかりを使っている人には少々とっつきにくいかもしれませんが、狙ったセクタを希望するセクタ数だけ操作できる能力は強力です。

実は簡単なGUIのソフトを探したんですが、探し方が悪いのか、なかなか希望する要件を満たしてくれるソフトがありませんでした。
今見つかっているものの中で、あえて一番使いやすいものをあげると、【WDe】ですね。このソフトは、FD搭載PCの方には文句のないできです。このソフトの実行ファイルは、わずか15KBです。これをフロッピーディスクに置いておいて、DOSから実行すると、HDDの任意のセクタをファイルにして、フロッピーディスクに書き出すことができます。逆に、フロッピーディスク上のファイルからHDDの任意のセクタに書き込むことも可能です。sector editor としても十分使えます。ただし、何の警告もなく簡単にセクタのデータを書き換えることができますから、使い方を誤らないように付属のドキュメント(英語)をよく読んでからご使用ください。このソフトが使える環境ならば、このページのddコマンドは不要です。

ddコマンドについて

dd については、こちらの解説ページに詳しいです。

今回使うオプションは以下のものです。

if=以下は、読み込む場所・ファイル名
of=以下は、書き込む場所・ファイル名
bs=以下は、読み書きするサイズをバイト数で表したもので、1セクタ単位で扱うには512を指定
count=以下は、bs=512の場合、コピーするセクタ数と考えればよい
skip=以下は、bs=512の場合、読み込む場所の先頭から、この値のセクタ数だけ後方から読み込みする
seek=以下は、bs=512の場合、書き出す場所の先頭から、この値のセクタ数だけ後方に書き込みする
conv=notruncは、seekを使ったときに先頭セクタから該当セクタまでの間を変更せずにそのまま残すオプション

【KNOPPIX】でddを使うには、最下段のペンギンのアイコンをクリックして、Root Shell を選び、root権限で使えるプロンプトを開きます。

なお書き出したファイルは保存しておかなければ意味がないので、フロッピーディスクなどに書き出します。of=/mnt/floppy/[ファイル名] などとしておくわけです。 フロッピーがなければ、USBメモリとか適当な媒体を準備して下さい。周辺機器の認識に優れているのも【KNOPPIX】の長所です。ddコマンドを1FDLinuxからなどではなく、【KNOPPIX】から使っているはそのためです。保存先としてHDDはやめておいた方が良いでしょう。そもそもNTFSだと書き込めません。

ファイル名も拡張子も自由ですが、このページでは【DiskProbe】と互換性を持たせて、拡張子dskにしておきます。

重要なセクタの保存

まず、HDDの先頭セクタであるMBRをmbr.dskとしてフロッピーディスクに保存するコマンドです。

dd if=/dev/hda of=/mnt/floppy/mbr.dsk bs=512 count=1

その後、mbr.dsk をKNOPPIX付属のバイナリエディタ(KHexEdit) で開いて分析してください。od -t x1 -A x mbr.dsk などとやってもいいですが、KHexEdit の方が見やすいでしょう。

そうすると、MBRのセクタが確認できるはずです。今回も、いつもの例を用いて説明していきます。
MBR
(【DiskProbe】の画像の流用で申し訳ありませんが、中身は同じなのでご容赦ください。)パーティションテーブルの値を確認します。

情報の種類 バイト数 赤い領域 青い領域
ブートインディケータ 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

パーティションテーブルの意味は上の表のようになっていました。今回大事なのは、開始位置(LBA)と総セクタ数(LBA)の2項目です。基本領域の開始位置にはブートセクタが必ずあるのでしたね。

今の場合、Cドライブの開始セクタは 00 00 00 3F すなわち10進法で63です。(リトルエンディアンの意味を思い出してください) そこがCドライブのブートセクタです。cboot.dskと言う名前で保存します。

dd if=/dev/hda of=/mnt/floppy/cboot.dsk bs=512 count=1 skip=63

バックアップブートセクタに関しては、今回の例ではNTFSなので、同じパーティションの最終セクタを探す必要があります。[開始位置(LBA)] + [総セクタ数(LBA)] - 1 で計算します。Windows同様にKNOPPIXにも関数電卓があるので、そちらを使ってください。

たとえば、今回の例では 3F + 05911CD1 - 1 を計算して10進数に直します。計算すると第93396239セクタになります。そのセクタがCドライブのバックアップブートセクタです。

このCドライブのバックアップセクタを、cback.dskと言う名前で保存するには

dd if=/dev/hda of=/mnt/floppy/cback.dsk bs=512 count=1 skip=93396239

FAT32の人は常にオリジナルブートセクタの6セクタ後方になるので計算は簡単ですね。

Dドライブの開始セクタは 05 91 1D 10 すなわち第93396240セクタです。この領域は拡張領域なので、そのセクタには、EPBRがあります。それもepbr.dskと言う名前で保存しておきましょう。

dd if=/dev/hda of=/mnt/floppy/epbr.dsk bs=512 count=1 skip=93396240

保存したepbr.dskをKHexEditで開いて確認します。
EPBR
論理領域は1つだけで、3F 後ろのセクタから始まっていることがわかります。つまり、93396240 + 63 = 93396303 で、そのセクタにDドライブのブートセクタがあります。そのセクタを dboot.dsk と言う名前で保存します。

dd if=/dev/hda of=/mnt/floppy/dboot.dsk bs=512 count=1 skip=93396303

Dドライブのバックアップブートセクタは、第93396303セクタを起点として、(03BFC3C1 -1)セクタ先にあります。計算すると第156295439セクタになります。このセクタも、dback.dsk と言う名前で保存します。

dd if=/dev/hda of=/mnt/floppy/dback.dsk bs=512 count=1 skip=156295439

以上、まとめると次のようになります。

項目 絶対セクタ番号 ファイル名
MBR 0 mbr.dsk
Cドライブのブートセクタ 63 cboot.dsk
Cドライブのバックアップブートセクタ 93396239 cback.dsk
拡張パーティションブートレコード 93396240 epbr.dsk
Dドライブのブートセクタ 93396303 dboot.dsk
Dドライブのバックアップブートセクタ 156295439 dback.dsk

あなたが実際におやりになるときも、ご自分の環境での絶対セクタ番号・ファイル名をメモしておく必要があります。

また、count=n とすることで、nセクタ連続してコピーすることもできます。たとえばMBRのときにn=63として、0〜62セクタまでを連続して保存したりする使い方が便利です。

バックアップしたセクタを書き込む

基本的に if= と of= を入れ替えて、skip= を seek= 変えて、conv=notrunc を追加します。

・MBR
dd if=/mnt/floppy/mbr.dsk of=/dev/hda bs=512 count=1

・Cドライブのブートセクタ
dd if=/mnt/floppy/cboot.dsk of=/dev/hda bs=512 count=1 seek=63 conv=notrunc

・Cドライブのバックアップブートセクタ
dd if=/mnt/floppy/cback.dsk of=/dev/hda bs=512 count=1 seek=93396239 conv=notrunc


・拡張パーティションブートレコード
dd if=/mnt/floppy/epbr.dsk of=/dev/hda bs=512 count=1 seek=93396240 conv=notrunc


・Dドライブのブートセクタ
dd if=/mnt/floppy/dboot.dsk of=/dev/hda bs=512 count=1 seek=93396303 conv=notrunc


・Dドライブのバックアップブートセクタ
dd if=/mnt/floppy/dback.dsk of=/dev/hda bs=512 count=1 seek=156295439 conv=notrunc


失敗すると被害が甚大なので、自信のある人だけが行ってください

もちろん、バックアップブートセクタでオリジナルブートセクタを上書きしたりもできます。

CHSをLBAに変換する

ここまでは、実際のパーティションテーブルの値などを使って、セクタ位置を算出してきましたが、すでにデータが壊れていて、その方法が使えない場合のことを考えましょう。

このページでは、【TestDisk】を使って書き換えるときに、書き換えられてしまうセクタをバックアップする方法を考えています。【TestDisk】では、CHS表示でセクタ位置が表示されます。
CHS表示
そこで、CHSを絶対セクタ表示(LBA)に直せれば便利です。

方法ですが、まず上図の1行目のCHSのDisk Diometry に注目します。この例では、(Cは無視して)H=240S=63 ですね。

上図の3行目、論理領域のStartは6177/1/1ですね。計算方法は

6177*240*63+1*63+1-1=93396303

になります。色を使って表現しているので、良く見てください。LBAは0から始まり、CHSは0/0/1から始まるので、最後に1を引きます。同様にEnd位置を計算すると、10336/239/63なので

10336*240*63+239*63+63-1=156295439

になります。1時間23分45秒が1*60*60+23*60+45(秒)であることを考えれば理解しやすいと思います。

この値を使って、dd コマンドを行えば良いと思います。


<ホームへ>  <起動トラブルの目次ページへ>  <エラー修復のページへ>  <【TestDisk】のページへ>