2

断続的に動作する故障したハードドライブがあります。コールドブート後、約30〜60秒間アクセスできますが、ハードドライブに障害が発生します。このドライブを新しくて大きなディスクにバックアップするソフトウェアを作成したいと思います。GNU/LinuxまたはWindowsで開発できます。気にしません。

問題は次のとおりです。ディスクにアクセスできるのはしばらくの間だけで、ファイルが大きく、コピーにかかるファイルよりも時間がかかる場合があります。このため、ハードディスク全体を少しずつバックアップすることを考えています。これは、ビットトレントのようなものです。別のセットを読み取ろうとする前に、数メガバイトを読み取って保存します。私のメインループは次のようになります。

while(1){
    if(!check_harddrive()){ sleep(100ms); continue; }
    read_some_megabytes();
    if(!check_harddrive()){ sleep(100ms); continue; }
    save_data();
    update_reading_pointer();
    if(all_done){ break; }
}

問題はcheck_harddrive()関数です。APIとライブラリの互換性を最大限に高めるために、これをC /C++で記述したいと思います。ファイルハンドラーがまだ有効かどうかを確認するには、ファイルハンドラーをある程度制御する必要があります。また、不良データを返すものが必要ですが、コピープロセス中にドライブに障害が発生した場合は戻ります。

「ハードコードされた」ハードウェア例外を悪用した場合、C#で最良の結果が得られるのではないでしょうか。

もう1つのアプローチは、ハードドライブの電源を入れ直すのに必要な時間を測定し、この時間だけ読み取るようにプログラムをコーディングして、電源を入れ直すタイミングにフラグを立てることです。

この場合、あなたはどうしますか?すでにこれを行っているツール/ユーティリティはありますか?

ああ、ここに悪い光学メディアを読むための素晴らしいアプリがあります、それはIsoPuzzleと呼ばれています、それは私のものではありません、私は私の問題に関連する何かを共有したかっただけです。

!編集!

いくつかの説明。私はホームユーザーであり、大学のコンピューターエンジニアリングの学生です。データを回復するために数千ドルを費やすよりも、データを失いたいと思っています。ハードドライブはまだシーゲイトの保証の対象ですが、5年間の保証が付いているので、時間がなくなるまで可能な限りのことを試してみたいと思います。

コールドブートとは、電源が入っていない状態で数秒後にブートすることを意味します。ホットブートはコンピュータを再起動し、コールドブートはコンピュータをシャットダウンし、数秒待ってから再度起動します。問題のハードディスクは内蔵ですがSATAなので、電源ケーブルを外し、数秒待ってから再度接続するだけです。

今まではrobocopyを使用しますが、それを検索して、どのように使用できるかを確認しています。自分でコーディングする必要はなく、スクリプトを作成する必要がある場合は、さらに簡単になります。

!EDIT2!

はっきりしていませんでした。私のドライブはSeagate7200.11です。ファームウェアが不良であることがわかっており、単純なファームウェアアップデートで常に修正できるとは限りません(このバグが発生した後ではありません)。ドライブは物理的に100%動作状態にあり、ファームウェアがねじ込まれているだけで、数秒後に無限のビジー状態になります。

4

4 に答える 4

6

私は最初にハードウェアの角度からこれを行います。外付けドライブですか?もしそうなら、別のケースで試すことができますか?

あなたはコールドブートの仕事について言及し、それからそれはやめます。この熱は関係がありますか?冷凍庫のような場所でハードドライブを長期間使用してみましたか?

ソフトウェア側からは、2番目のスレッドで、少量のデータを読み取る繰り返しループによって更新される進行状況カウンターを監視する必要があります。そうすれば、定義したタイムアウトを介して障害を通知できます。

于 2009-09-20T21:23:04.667 に答える
2

robocopy( "Robust File Copy")に興味があるかもしれません。Robocopyはコマンドラインツールであり、ネットワークの停止を許容し、以前に中断したところからコピーを再開できます(不完全なファイルは、1980-01-01に対応する日付スタンプで示され、回復レコードが含まれているため、Robocopyはどこから続行するかがわかります)。

あなたが知っている...私は「怠惰」であるのが好きです...これが私がすることです:

2つの簡単なスクリプトを書きます。それらの1つはrobocopyを開始し(永続化機能をオフにして)、もう1つは定期的にチェックします(ルートディレクトリの内容を一覧表示しようとし、それよりも数秒以上かかるかどうかを確認します)。 ..もう一度..)ドライブがまだ機能しているかどうか、HDDが機能しなくなった場合は、マシンが再起動します。ログイン後に起動し、自動ログインを設定して、マシンが再起動したときに自動的に続行されるようにします。

于 2009-09-20T21:25:50.573 に答える
2

最も簡単な方法は、ディスクイメージ全体をコピーすることだと思います。Linuxでは、/dev/sdb1たとえば、ディスクはブロックデバイスとして表示されます。

読み取りエラーが表示されるまで、ディスクイメージのコピーを開始します。次に、ユーザーがディスクを「修復」し、最後の位置から読み取りを開始するのを待ちます。

ファイルディスクイメージを簡単にマウントしてその内容を読み取ることができます。-o loopのオプションを参照してくださいmount

使用する前にディスクを冷却してください。それが役立つと聞きました。

于 2009-09-21T00:37:18.440 に答える
1

「データを取り戻す必要がある」という観点から、データが本当に価値のあるものである場合は、ドライブをデータ回復スペシャリストに送ることをお勧めします。データの価値にもよりますが、コスト(おそらく数百ドル)は取るに足らないものです。理想的には、リカバリを実行するためにいくつかのソフトウェアを実行するだけではないデータリカバリスペシャリストを見つけるでしょう-ソフトウェアアプローチが機能しない場合、彼らはドライブ上の回路基板を交換するなどのことを行うことができるはずです、そしておそらく他の物事(私はデータ回復の専門家ではありません)。

ドライブ上のデータの価値がそのレベルまで完全に上昇しない場合は、データ回復のための多くのソフトウェアの1つを購入することを検討する必要があります。たとえば、私は個人的にランタイムソフトウェアhttp://www.runtime.orgのGetDataBackを使用してお勧めします。私はそれを使って故障したドライブを回復しました、それは私のために働きました。

次に、より一般的な情報に移ります...障害が発生したドライブからデータを回復するための標準的なプロセスは、ドライブ自体に対して可能な限り実行しないことです。ドライブのプラグを抜いて、何もしようとしないでください。ドライブに障害が発生しており、ますます悪化する可能性があります。あなたはそれをいじりたくない。データを取得する可能性を最大化する必要があります。

プロセスが機能する方法は、ドライブをブロックごとに(ファイルごとではなく)読み取り、ドライブのイメージコピーを作成するソフトウェアを使用することです。ソフトウェアはすべてのブロックの読み取りを試み、失敗した場合は読み取りを再試行し、ハードドライブ全体のイメージであるイメージファイルを書き込みます。

ハードドライブのイメージが作成されると、ソフトウェアはイメージに対して動作し、ドライブのさまざまな論理部分(パーティション、ディレクトリ、ファイル)を識別します。そしてそれはあなたが画像からファイルをコピーすることを可能にします。

ソフトウェアは通常、画像から構造を「推測」できます。たとえば、パーティションテーブルが破損しているか欠落している場合、ソフトウェアはイメージ全体をスキャンしてパーティションである可能性のあるものを探し、パーティションのように見える場合は、パーティションのように扱い、検出できるかどうかを確認します。ディレクトリとファイル。したがって、優れたソフトウェアは、ドライブのさまざまな構造に関する多くの知識を使用して作成されています。

あなたがそのようなソフトウェアを書く方法を学びたいのなら、あなたにとって良いことです!さまざまなオペレーティングシステムがハードドライブ上のデータを整理する方法についての本から始めることをお勧めします。これにより、ソフトウェアがドライブイメージを操作してデータをプルする方法を直感的に理解できるようになります。

于 2009-09-20T23:03:40.510 に答える