2006年3月2日木曜日

VMware+Windows+gpartでパーティションテーブルの修復

壊れたハードディスクをgpartで修復



にちょこっと書いたのは、2台のパソコンを使って修復する方法でしたが、VMware Playerと、IDEをUSBに変換するアダプタを使うことで、1台のWindowsパソコンだけでもできそうです。ちょっと気になるところはありましたが・・・



注意



  • 直せるのは、MBRなどパーティションテーブルが壊れてしまった場合だけです。


  • カッコン、カッコンと、異音がするようなハードディスクは、物理的故障ですので、この方法では無理です。


  • 電源をいれてもうんともすんともいわないハードディスクは(中のお皿が回っていないわけでして)、この方法では直せません。ちなみに回らないディスクは、絶妙なタイミングで適度な衝撃を与えると、再び回りだすことがあります(経験と勘によりますので、その筋の達人に頼みましょう)


  • ハードディスクにアクセスしようとすると、パソコンがだんまり状態になってしまったり、やたらと時間がかかるようなケースも、たぶん無理っす


  • 作業には、それなりに高度な知識を必要とします。マウスクリックするだけで直るようなことはありません。ヘマして事態を最悪にしたとしても、私には責任をとれません。あしからず




参考



(VMware) FreeBSD 6.0-RELEASEのインストール



  • VMware Playerを使ってFreeBSDをインストールする手順について。ちなみに今回はFreeBSD 6.0ではなく、5.5-PRERELEASEを使ってます。uname -aはこんな。

FreeBSD freebsd.vmware.local 5.5-PRERELEASE-20060212-JPSNAP
FreeBSD 5.5-PRERELEASE-20060212-JPSNAP #0: Sun Feb 12 02:35:57 UTC 2006  root@ushi.jp.freebsd.org:/usr/obj/usr/src/sys/GENERIC  i386

(VMware) USB接続のHDDにFreeBSDをインストール



  • USB接続のHDDをVMwareで使う方法についてです。


(QEMU)FreeBSDのportsを使う



  • ごく簡単なports利用方法の紹介


(FreeBSD) portsnapでportsを最新に



  • portsを最新版へ更新する方法です


(FreeBSD) portsnapが暴走する?



  • ある時期のportsnapがバグってます、という話




■ gpartのインストール



portsで楽々インストール。「cd ほにゃらら」して「make install clean」だけです。



freebsd# cd /usr/ports/sysutils/gpart/
freebsd# make install clean
===>  Vulnerability check disabled, database not found
=> gpart-0.1h.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch from ftp://ftp2.jp.freebsd.org/pub/FreeBSD/ports/distfile
s/.
gpart-0.1h.tar.gz                             100% of   51 kB  286 kBps
===>  Extracting for gpart-0.1h_1
=> MD5 Checksum OK for gpart-0.1h.tar.gz.
=> SHA256 Checksum OK for gpart-0.1h.tar.gz.
===>  Patching for gpart-0.1h_1
===>  Applying FreeBSD patches for gpart-0.1h_1
===>   gpart-0.1h_1 depends on executable: gmake - found
===>  Configuring for gpart-0.1h_1
===>  Building for gpart-0.1h_1
(以下略)



■ ハードディスクをVMwareなFreeBSDに接続



IDEなハードディスクを、USB接続で使えるようにするアダプタを使いました。



USBコネクタをさして、VMware Playerの上のほうにあるUSBのボタンを押してやれば、ゲストOS側で、そのUSBデバイスが認識されます。



Vmwareusb



で、ですが・・・なぜか、USB1.1って認識してるみたいなんですよね・・・



カーネルのリコンフィグをすると、USB2.0になるんでしょうか???



■ パーティションとは何のこと?



googleしてみたら、ものすごく詳しく説明してくれているページがありました。



http://nobumasa-web.hp.infoseek.co.jp/partition/partition.html



すごく参考になります。



■ gpartを実行する



今回USBで接続したハードディスクは、/dev/da0というデバイス名で認識されているので、

freebsd# gpart -vv /dev/da0

となります。



しばらく待っていれば、

壊れたハードディスクをgpartで修復

に示したような結果が表示されます。



出力結果をファイルに保存したければ、

freebsd# gpart -vv /dev/da0 |& tee /tmp/gpart-da0.log

とかやれば、/tmp/gpart-da0.logに保存されます。



ところで、ディスクを接続したときにFreeBSDのログにでていたとおり、どうも、USB1.1並の転送速度になっているみたいです。ここで書いた方法では、gpartでディスクからデータを抽出するのに、数分程度かかりました。120GBのHDDの場合です(ディスク全領域を読み出しているわけではないらしい)。ちなみにUSBではなく、直接接続した場合は、数秒でした。



■ gpartの結果の読み方



FreeBSDのfdiskコマンドで、パーティション(スライス)を切れる人なら、たぶんすぐわかるでしょうが・・・まあ、ここでそんな話の説明もするわけにもいかないので、ハードディスクのパーティションに関する詳細はgoogleしてみるか、上の「パーティションとは何のこと?」であげたページを参考にしてください。



行方不明になってしまったパーティションの情報は、

Begin scan...

というところから後に表示されます。



で、私の場合、なくなってしまったパーティションの情報が、運良くみつかって、そのうちの1つが、こういうかんじでした。

Possible partition(Windows NT/W2K FS), size(49999mb), offset(15994mb)
   type: 007(0x07)(OS/2 HPFS, NTFS, QNX or Advanced UNIX)
   size: 49999mb #s(102398240) s(32756598-135154837)
   chs:  (1023/15/63)-(1023/15/63)d (32496/10/1)-(134082/2/56)r
   hex:  00 0F FF FF 07 0F FF FF 76 D3 F3 01 20 79 1A 06

パーティション情報を、どこかのファイルに保存したり、メモってあれば、gpartを使わなくてもよかったんですけどねぇ。



■ fdiskコマンドでパーティション情報を書き込む



FreeBSDのfdiskコマンドを使いましたが、パーティション情報を編集するツールなら、同様な感じでできるかと思います。私のお気に入りのブートセレクタの「MBM」でも、パーティション情報を書き換えることができたような気がします。



「fdisk -i ディスク」というコマンドで、fdiskを実行します。

freebsd# fdisk -i da0
******* Working on device /dev/da0 *******
parameters extracted from in-core disklabel are:
cylinders=14946 heads=255 sectors/track=63 (16065 blks/cyl)



Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=14946 heads=255 sectors/track=63 (16065 blks/cyl)



Do you want to change our idea of what BIOS thinks ? [n]

BIOS用のジオメトリ情報を変更する?みたいなことを聞いてくるので、この場合、変更しなくていいと思うので、nと答えます。

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 11 (0x0b),(DOS or Windows 95 with 32 bit FAT)
    start 63, size 16384062 (8000 Meg), flag 0
        beg: cyl 0/ head 1/ sector 1;
        end: cyl 1023/ head 15/ sector 63
Do you want to change it? [n]

1つめのパーティションの情報を変更する?と聞かれます。この情報が正しければ、つまりこのパーティションが正常にアクセスできているのなら、nと答えます。うその値が書き込まれていて修復する必要があるのならyと答えます。



これ、あってますので、nでつぎにすすみます。



もう修復しちゃったので、正しそうな値が入力されているのですが、例として、以下の3番目のパーティションの情報を修正する手順を示します。

The data for partition 3 is:
sysid 7 (0x07),(OS/2 HPFS, NTFS, QNX-2 (16 bit) or Advanced UNIX)
    start 32756598, size 102398240 (49999 Meg), flag 0
        beg: cyl 1023/ head 15/ sector 63;
        end: cyl 1023/ head 15/ sector 63
Do you want to change it? [n]

yと答えます。

Supply a decimal value for "sysid (165=FreeBSD)" [0]

これにはパーティションのsysidを入力します。NTFSのパーティションなら7番なので、7と入力します。FreeBSDのパーティションなら165です。



さきほどのgpartのログをみると、typeのところに、入力すべき値が示されています。

Possible partition(Windows NT/W2K FS), size(49999mb), offset(15994mb)
   type: 007(0x07)(OS/2 HPFS, NTFS, QNX or Advanced UNIX)
   size: 49999mb #s(102398240) s(32756598-135154837)
   chs:  (1023/15/63)-(1023/15/63)d (32496/10/1)-(134082/2/56)r
   hex:  00 0F FF FF 07 0F FF FF 76 D3 F3 01 20 79 1A 06

007、つまり、7ですね。



先ほどのページにも、ID(パーティションタイプ)の一覧表がのっていました。
http://nobumasa-web.hp.infoseek.co.jp/partition/partition.html



ただ、このページでは16進数で表記されていますが、fdiskで入力するのは10進数です。16進数のA5は10進数で165です。16進を10進に変換するのは、たとえばFreeBSDのprintfコマンドでもできます。こんな感じです。16進数には0xをつけてね。

freebsd# printf '%d\n' 0xA5
165

とりあえず、7と入力しました。

Supply a decimal value for "sysid (165=FreeBSD)" [0] 7
Supply a decimal value for "start" [0]

今度は、パーティションの先頭セクタ番号を入力します。これは、gpartの「s(数字-数字)」のところの、1つめの数字になります。

Possible partition(Windows NT/W2K FS), size(49999mb), offset(15994mb)
   type: 007(0x07)(OS/2 HPFS, NTFS, QNX or Advanced UNIX)
   size: 49999mb #s(102398240) s(32756598-135154837)
   chs:  (1023/15/63)-(1023/15/63)d (32496/10/1)-(134082/2/56)r
   hex:  00 0F FF FF 07 0F FF FF 76 D3 F3 01 20 79 1A 06

というわけで、「32756598」と入力します。

Supply a decimal value for "start" [0] 32756598
Supply a decimal value for "size" [0]

今度は、パーティションのサイズをセクタ数で入力します。これは、gpartの「#s(数字)」のところの値になります。

Possible partition(Windows NT/W2K FS), size(49999mb), offset(15994mb)
   type: 007(0x07)(OS/2 HPFS, NTFS, QNX or Advanced UNIX)
   size: 49999mb #s(102398240) s(32756598-135154837)
   chs:  (1023/15/63)-(1023/15/63)d (32496/10/1)-(134082/2/56)r
   hex:  00 0F FF FF 07 0F FF FF 76 D3 F3 01 20 79 1A 06

というわけで、102398240と入力します。

Supply a decimal value for "size" [0] 102398240
fdisk: WARNING: partition does not end on a cylinder boundary
fdisk: WARNING: this may confuse the BIOS or some operating systems
Correct this automatically? [n]

シリンダ境界にそろってないよ、とのWARNINGメッセージがでますが、そろわなものは仕方がないので、そろわないままにしておきます。つまりnと答えます。

Correct this automatically? [n] n
Explicitly specify beg/end address ? [n]

次ですが・・・よくわかんないのですが、とりあえずyと答えました。

Explicitly specify beg/end address ? [n] y
Supply a decimal value for "beginning cylinder" [0]

gpartで「chs:  (1023/15/63)-(1023/15/63)d」と表示されているなかの、1つ目の数字、1023が該当すると思われます。

Possible partition(Windows NT/W2K FS), size(49999mb), offset(15994mb)
   type: 007(0x07)(OS/2 HPFS, NTFS, QNX or Advanced UNIX)
   size: 49999mb #s(102398240) s(32756598-135154837)
   chs:  (1023/15/63)-(1023/15/63)d (32496/10/1)-(134082/2/56)r
   hex:  00 0F FF FF 07 0F FF FF 76 D3 F3 01 20 79 1A 06



Supply a decimal value for "beginning cylinder" [0] 1023
Supply a decimal value for "beginning head" [0]

つぎは、「chs:  (1023/15/63)-(1023/15/63)d」と表示されているなかの、2つ目の数字、15が該当すると思われます。

Supply a decimal value for "beginning head" [0] 15
Supply a decimal value for "beginning sector" [0]

つぎは、「chs:  (1023/15/63)-(1023/15/63)d」と表示されているなかの、3つ目の数字、63が該当すると思われます。

Supply a decimal value for "beginning sector" [0] 63
Supply a decimal value for "ending cylinder" [0]

つぎは、「chs:  (1023/15/63)-(1023/15/63)d」と表示されているなかの、4つ目の数字、1023が該当すると思われます。

Supply a decimal value for "ending cylinder" [0] 1023
Supply a decimal value for "ending head" [0]

つぎは、「chs:  (1023/15/63)-(1023/15/63)d」と表示されているなかの、5つ目の数字、15が該当すると思われます。

Supply a decimal value for "ending head" [0] 15
Supply a decimal value for "ending sector" [0]

つぎは、「chs:  (1023/15/63)-(1023/15/63)d」と表示されているなかの、6つ目の数字、63が該当すると思われます。

Supply a decimal value for "ending sector" [0] 63
sysid 7 (0x07),(OS/2 HPFS, NTFS, QNX-2 (16 bit) or Advanced UNIX)
    start 32756598, size 102398240 (49999 Meg), flag 0
        beg: cyl 1023/ head 15/ sector 63;
        end: cyl 1023/ head 15/ sector 63
Are we happy with this entry? [n]

これでよければyと答えます。



4番目のパーティションについて回答したあとは、

Do you want to change the active partition? [n]

と聞かれます。ようするにどのパーティションからブートするかを変更するか?って聞いてます。とりあえずnと答えます。必要なら変更してください。



Do you want to change the active partition? [n] n



We haven't changed the partition table yet.  This is your last chance.
parameters extracted from in-core disklabel are:
cylinders=14946 heads=255 sectors/track=63 (16065 blks/cyl)



Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=14946 heads=255 sectors/track=63 (16065 blks/cyl)



Information from DOS bootblock is:
1: sysid 11 (0x0b),(DOS or Windows 95 with 32 bit FAT)
    start 63, size 16384062 (8000 Meg), flag 0
        beg: cyl 0/ head 1/ sector 1;
        end: cyl 1023/ head 15/ sector 63
2: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 16386300, size 16370235 (7993 Meg), flag 0
        beg: cyl 1023/ head 15/ sector 63;
        end: cyl 1023/ head 15/ sector 63
3: sysid 7 (0x07),(OS/2 HPFS, NTFS, QNX-2 (16 bit) or Advanced UNIX)
    start 32756598, size 102398240 (49999 Meg), flag 0
        beg: cyl 1023/ head 15/ sector 63;
        end: cyl 1023/ head 15/ sector 63
4: sysid 7 (0x07),(OS/2 HPFS, NTFS, QNX-2 (16 bit) or Advanced UNIX)
    start 135154908, size 104952576 (51246 Meg), flag 0
        beg: cyl 1023/ head 15/ sector 63;
        end: cyl 1023/ head 15/ sector 63
Should we write new partition table? [n]



最後に、この情報でパーティションテーブルに書き込んでいいですか?と確認してきます。本当によければyと答えます。



以上のようなかんじで、FreeBSDのfdiskコマンドで、パーティション情報を手入力で直すことができます。



これで直るかと思ったのですが、

壊れたハードディスクをgpartで修復

に書いたように、なぜかWindowsからは、どうも読めてませんでした。あ、フォーマットしちゃ、ぜったいダメですよ。ぜったい!



というわけで、なぜかFreeBSDではNTFSをマウントできたので、FTPで吸い出した、という次第です。



つづきはまた明日。



■ 関連記事



(2008/2/21追記) パーティションテーブルを復活させたい場合、gpartよりも、TestDiskというツールの方がお手軽な場合もあります。









0 件のコメント:

コメントを投稿