Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Linux ユーザのためのデータ救出
[go: Go Back, main page]

ホーム

Linux ユーザのためのデータ救出


OSの入ったハードディスクに物理的な障害が起こっているとしましょう。 Linux だけだと楽ですが、Windows が入っている人も多いはず。 読み込みエラーが一ヶ所でも起こるディスクだと @IT:Windowsからのイメージ・バックアップが可能となった.... のようなツールは、さんざん待たせたあげく、エラー箇所で停止して、 役に立たないようです。

そこで、多少エラーの起こるディスクから、 大部分の正常なデータを復旧する方法を、 Linux ユーザの視点から考えてみます。 OS やアプリも丸ごとコピーして、 再インストールせずにすませることを目指します。

なお、OS を再インストールしてよいのであれば、 単に外付けディスクとして認識させて、 Windows からでも KNOPPIX からでも、 自分の作ったファイルだけをコピーしてやる手もあります。 (その中に読めないファイルがあると面倒ですが。)


基本は KNOPPIX!

 OS の入っているディスクが死にかけているのなら、 そのディスクに書き込むことは危険です。 入っている OS を立ち上げたりせずに、 CD からブートできる KNOPPIX を使って、 死にかけているディスクから、新品のディスクへとコピーするのがよいでしょう。

 KNOPPIX はインストール不要の 1CD Linux としてかなり完成されており、 デバイスの認識性能がよいと言われています。 KNOPPIX 日本語版 も開発されており、 以下では knoppix_20031119-20040202 (3.3) について試したことを書いておきます。


ハードディスクの取扱い

 ハードディスクに障害が起こる原因は、いろいろ考えられます。 ベアリング(回転軸)の寿命だとすれば、 ベアリングに負担がかからないよう、 運用してきたままの水平か垂直かのどちらかの姿勢になるようにしましょう。 傾けたり、振ったりしては障害を増やすばかりです。

 冷却することも重要です。触れないぐらい熱くなるようだと、 扇風機で冷ますことも効果があるかもしれません。

 そして重要なことですが、部分的に読み取れない程度の障害だと、 数日放置しておくと、 嘘のようにデータが読めるようになっていることもあります。 読み取れないからといって、むやみにいろいろ試すより、 頭も機械も冷却して落ち着いてから作業しましょう。

 嘘のように復旧してデータが読めるようになっても、 それで直ったとは思わず、すかさずデータを救出しましょう。 数日経てば、また障害が再発することが目に見えています。


想定するハードウェア

 死にかけのディスクと、新品のディスクがあるとします。 CD-ROM ドライブからブートできる AT 互換機があるとします。 デスクトップですと、2台のドライブを内蔵するのが簡単です。

 ノートパソコンでは、USB接続のHDケース(実売2000円〜)を使うことにします。 USB は 2.0 で揃えておくことをお薦めします。1.1 ではあまりにも遅すぎます。 もちろん、2.5 inch → 3.5 inch 変換ケーブル(実売1000円〜)を使って、 デスクトップパソコンで操作してもよいです。

 USB 1.1 のマシンなら、100BASE-TX のネットワークで別マシンに転送したほうが高速です。 そこで FTP で転送する方法も紹介します。


KNOPPIX の tips

 KNOPPIX はそこそこハードウェアを認識してくれて、 大抵 X も動くでしょうが、うまく動かない時や、 X が遅過ぎる時は、Alt + Ctrl + F2 でコンソールに切替えるのも手です。 元に戻るには Alt + Ctrl + F5 です。 あるいはブート時に 'knoppix 2' と指定すれば、 X を使わずにすみますし、起動も早いです。

 さて、内蔵ディスクですが、 Linux の swap 領域があると KNOPPIX が使ってしまいます。 メモリが十分にあって、下手にディスクに書き込まれたくなければ、 ブート時に 'knoppix noswap' と指定します。

 KNOPPIX3.3 では DMA 転送が有効になっていません。 'hdparm -d1 /dev/hda' しましょう。 KNOPPIX3.4 では自動で有効になるようです。 しかし、読み取りエラーが起こると無効になってしまうこともあります。 転送速度が遅くなったら、読み取り中でも別のシェルから 'hdparm -d1 /dev/hda' としてやることで、 有効にすることができます。

 また USB が 1.1 のドライバで処理されてしまいます。 'modprobe ehci-hcd' としてモジュールを読み込んでから HD ケースを接続することで USB2.0 で処理することができます。 (KNOPPIX3.4 ではこれも自動でされる?) 参考:@IT:USB 2.0のデバイスを使うには

 いずれの場合も、ディスクの転送速度を確認しておきましょう。 10MB/sec 程度の速度が出ていないと、この先の作業は非常につらいと思われます。 以下は手元のマシンの内蔵ディスクの実行例です。

# hdparm -Tt /dev/hda

/dev/hda:
 Timing buffer-cache reads:   128 MB in  0.79 seconds =162.03 MB/sec
 Timing buffered disk reads:  64 MB in  7.15 seconds =  8.95 MB/sec

 USB 接続ならデバイスファイルは /dev/sda になると思います。 dmesg コマンドの出力を確認して下さい。 シリアル ATA の内蔵 HD でも、/dev/sda になります。

 'fdisk /dev/hda' でHDの情報を調べることができます。 パーティション操作をするためのコマンドですが、 プロンプトが出て 'p' コマンドでドライブ容量や ジオメトリ(シリンダ数・ヘッド数・セクタ数)を確認できます。 'q' で終了です。 コンソールで作業していて、日本語が化けるようだと 前もって 'LANG=C' を実行しておきます。

 最近の光学ドライブの付いてないノートパソコンだと、 HDの一番後ろにリカバリーの為の隠し領域が3Gぐらいついていることが多いです。 USB ケースで接続すると、ドライブの容量がこの分だけ少なく認識されることがありました。 二種類のUSB ケースで試しても同じでした。 USB ケースの販売店に相談してみると、どうもそういうものらしいです。 内蔵すると普通に認識されました。 (試してはいませんが、この状態で隠し領域を解放してしまえば、 USB ケースに入れても全容量が認識されるようになると思います。)


まったく同じディスクで OS ごとコピー

 もしも死にかけのディスクと容量も同じ、さらにジオメトリ (シリンダ数・ヘッド数・セクタ数)まで同じディスクが用意できたとしましょう。 何も難しいことを考える必要はなく、 単に dd コマンドでコピーすれば、OS 丸ごとコピーできます。 ただし、エラーが起こっても中断してほしくないので、 少しオプションを付け加えます。

dd if=/dev/hda of=/dev/sda conv=sync,noerror bs=4096 count=1

 'conv=sync,noerror' がポイントで、 エラーが起こっても少しスキップして続きをコピーし続けます。 スキップする大きさが bs= で指定した大きさです。 あまり小さくすると転送速度が遅くなるようです。 エラーがたくさん起こるディスクだと、この値を大きくしておかないと、 いつまでたっても終わりません。 大きくしすぎると、エラー箇所の巻き添えで捨ててしまうデータが増えてしまいます。 bs=65536 のような値が指定しやすいでしょうか。

 count=1 は最終的には消去しますが、count=10、count=100 と値を増やして、 コピーの方向が合っていることを確認しましょう。 逆向けにコピーしたら元も子もありません。 そして、転送速度を測定しておきましょう。 いつごろコピーが終了するか、この数字が唯一の見積もる手段です。

 数秒でコピーが完了するまでになったら、 表示される転送速度は、キャッシュの影響もなくなり、 信用できる値になっているはずです。 いよいよ count= を消去して、ディスク全体をコピーしましょう。

 手元の環境では、4Mbyte/sec ぐらい、 エラーのある30Gのディスクで1時間〜2時間ぐらいかかりました。


異なる容量のディスクで OS ごとコピー

 VFAT や Linux の ext2/3 等なら一つのパーティションを コピーすればなんとかなるようです。

 VFAT なら、cp コマンドでもコピーできるかもしれませんが、 日本語ファイル名の扱いに不安が残るので、 パーティションごとコピーするのが安心だと思います。 ただし、パーティションのサイズはほぼ同じ、 若干大きめにしておかないといけないでしょう。 パーティションのコピーには、 あらかじめ fdisk コマンドで確保したところに、 'dd if=/dev/hda1 of=/dev/sda1 conv=sync,noerror' のようなコマンドでコピーすればよいです。 ドライブ丸ごとコピーの手順とほぼ同じです。

 注意すべきは、起動したいパーティションに ブート可能フラグをつけることです。 fdisk コマンドの中の a コマンドで行えます。 (ひょっとするとパーティション確保も Windows の fdisk コマンドを使ったほうがよいかもしれません。)

 NTFS なら、dd コマンドでは、私はまだコピーに成功していません。 2000/XP のインストールディスクから、 xcopy コマンドにオプションを付けて ファイル単位でコピーするのがせめてもの方法で、 OS 自体は救えないようです。 (少々大きめのディスクに、丸ごと HD をコピーした場合は、 たまたまかもしれませんが、NTFS のパーティションごと救うことができました。 増えた領域をどう使うか、まだ試していません。)

 ext2/3 等なら簡単で、VFAT と同じく dd コマンドで大丈夫でしょう。 (私はまだ試していません。) エラーのないディスクだと、rsync でコピーするのもよいでしょう。 先だって、fdisk でパーティションを分割して、 mkfs.ext3 コマンドでフォーマットし、 e2label でファイルシステムにラベルをつけておきます。 (ちなみに、 lilo や grub をインストールするのは、ディスクを交換してからです。) 'rsync -nvHDpogrltx --delete /mnt/hda1/ /mnt/sda1/ | less' でコピーされるファイルを確認してから n オプションを消して実行します。 コピー元のディレクトリの最後に '/' を忘れずに付けて下さい。 (忘れると /mnt/sda1/hda1/ 以下にコピーされてしまいます。)

 tar でコピーするものもちろんよいのですが、 作業を中断してやりなおすと、最初からになってしまいます。 rsync だと差分だけをコピーするので、 気軽に作業を中断してやり直せます。


FTP経由でディスクイメージを転送

 ディスクドライブが高速なインターフェイスで1台しか接続できない場合、 FTP サーバが別にあれば、そちらにディスクイメージを転送するのも良いでしょう。 100BASE-TX なら 10Mbyte/sec 近くの速度が出るので、USB 1.1よりも高速です。

 まず、ネットワークの設定です。 KNOPPIX は自動的に DHCP で IP アドレスを探すようですが、 手動で設定したいなら 'netcardconfig' というコマンドがあります。

 これからの作業は、2つのシェルが必要です。 X が動いていれば窓を2つ開けて、 コンソールで作業していれば ALT + F1 や ALT + F2 で切替えて作業して下さい。

 片方のシェルで FTP クライアントを立ち上げます。 lftp は named pipe に対応していないようなので、 ncftp を使います。

# mkfifo img  named pipe を作る
# ncftp -u username 192.168.0.3
ncftp> put img

 のようにします。

 もう片方のシェルでは、さきほど作った named pipe (特殊ファイル)に向かって書き込みます。

# dd if=/dev/hda of=img conv=sync,noerror bs=4096 count=1

 put と dd を実行するタイミングは、どちらが先でもかまいません。 これでディスクのイメージを別マシンに転送することができます。

 逆向けにディスクイメージを転送するときは、 当然ながら put でなくて get、dd の if と of を入れ換えればよいです。 ncftp が「存在するファイルがあるがどうする?」と 聞いてきますので、上書きを選べば大丈夫です。

 マシンが十分に高速なら、gzip しながら転送してもよいでしょう。 'dd if=/dev/hda | gzip -1 > img' のようにすればよいです。 ただ、PentiumM 1.3G ぐらいでも 100BASE-TX を使いきることはできないようです。 あらかじめディスクの未使用領域をゼロクリアでもしておかないと、 速度メリットは得られないでしょう。 なお、正常な VFAT/ext2/3 のディスクの場合、 未使用領域をゼロクリアするのは簡単です。 マウントして 'cat /dev/zero > hoge; rm hoge' とするだけです。 NTFS はまだ書き込みはできないようです。残念。


データ消去

 機密データ(?)が入っていたディスクは、 破棄する前にデータ消去しておきたくなります。 ファイルを消去しただけでは、結構な確率で復元できます。 例えば 'cat /dev/hdc1 | strings | less' しただけで、テキストデータがほとんど読めてしまいます。

 少なくともディスク全体をゼロクリア 'cat /dev/zero > /dev/hdc' すればそれなりに安心でしょう。 HDドライブを分解しない範囲では復元できませんから。 ちなみに、乱数を書き込むのは 'cat /dev/urandom > /dev/hdc' とすればよいようですが、とても時間がかかるようです。 手元では Athlon64 の十分高速な CPU を使っていてるのですが、 ゼロクリアなら 50MB/sec で書き込める S-ATA ドライブが、 4.5MB/sec と 1/10 以下の速度になってしまいました。

 手間暇をかければそれでも復元できることになっています。 ([linux-users:78671] Re: HD内のデータ消去法) まぁしかし「機密データが入っていたことを悟られないようにこっそり捨てる」 ぐらいでよいと思います。 念を入れるなら、ハンマーで物理的に破壊しましょう。


ホーム
リンクはご自由にどうぞ。
土村 展之(tutimura(a)nn.iij4u.or.jp) '(a)'は'@'に置き換えて
更新日 1/26 2:01, 2007