web-dev-qa-db-ja.com

不良セクタが埋め込まれ、複数のパスがある古いフロッピーディスクからのデータの最大回復

できるだけ多くのデータを回復したいと考えている古い3.5インチフロッピーディスクのコレクションがあります。

この問題は一部のファイルの構造に起因します。すべてのファイルの長さを維持する必要があります。つまり、不良セクタを埋める必要があります(一部のファイルがAcorn ADFSファイルであり、データとコードが含まれている理由はtl; drです。コードは、ファイルの先頭からのオフセットとしてデータを参照します。LinuxではADFS形式の読み取りは問題ではなく、不良セクターのパディングは問題です)。

ディスクは25年間読み取られていないため、予測できない読み取り、通常の不良セクタ、およびディスクが読み取れない可能性があることを期待しています。これは、データ回復が最大化されている限り問題ありません。

これを行うには、可能な限り読み取るために複数のパスが必要になると予想しています。

dd

私はddを調べましたが、このコマンドは最初の実行を約束しています。

dd if=/dev/fd0 of=adfs.img conv=noerror,sync

その後の呼び出しが続く

dd if=/dev/fd0 of=adfs.img conv=noerror,notrunc

どこ:

noerrorは、エラーが無視されることを意味します

syncは、不良セクタがヌル文字で埋められることを意味します

notruncは、ddが呼び出されたときに(既存の)出力ファイルが切り捨てられないことを意味します。

しかし、 manページ とこれ notruncの説明 を読んでいると、notruncが設定されているにもかかわらず、ddは毎回出力を上書きして、読み取られたものだけを表す出力になります。最後のパス。以前は正しく読み取られていたが、古いフロッピーディスクの劣化などが原因で現在は不良であるセクターは、nullで上書きされます。

したがって、ddは適切に見えません。

ddrescue

ddrescue ログファイルを使用して正常に書き込まれ、次のパスが実行されたときに参照されるものを記録する限り、複数のパスで使用できるという点で有望に見えます。

エラー以外のブロックのみを読み取る最初のパス

ddrescue -d -p --no-split /dev/fd0 output.img log/output.logfile

エラーを埋めるための最初のパスと後続のパス

ddrescue -d -r3 /dev/fd0 output.img log/output.logfile

どこ

-d直接ディスクアクセス。システムキャッシュを無視する

-no-splitまたは-n分割しようとしないまたは失敗したブロックを再試行します。つまり、正常なブロックのみを読み取ります。これは、不良ブロックの回復を試みているときにディスクに障害が発生するのを防ぐために、最初の実行でのみ良好なデータを取得するためです。

-ppreallocateリカバリ前にディスクスペースを事前に割り当てます。つまり、出力ファイルは入力ファイル/デバイスと同じサイズになります。

-r3不良セクタを3回再試行します(2回目以降に使用)

しかし、落とし穴はddrescueであり、不良セクタが発生してもパディングされないようです。 -pを設定すると、ファイルの先頭からすべてのパディングが発生し、必要に応じてファイルの先頭からのデータのオフセットが維持されないように見えます。

これは、ddrescueがディスク領域を節約しようと努力するように記述されているため、不良セクタが切り捨てられ、後続のパスで不良セクタが正常に読み取られた場合に追加されるためです。 -pを設定すると、スペースを節約するために入力ファイルと同じサイズの出力ファイルが作成され、データが埋め込まれることはありません。したがって、-pが設定または設定解除された出力の内容は同一になります。つまり、ファイルの終わりまでパディングされません。

質問

だから私の質問は3つのパートです

1)-pが設定されていても、ddrescueが復元されたファイルをパディングしないのは正しいですか?

2)それをパッドに入れる方法はありますか?私のインターネット検索で、ddrescueによって作成されたログファイルをスクリプトで使用して関連する場所を埋めることができるというコメントを読みました(再度検索して追加します)。どのようにアイデアはありますか?

そして

3)私がやろうとしていることを実行するためのより良いコマンド/プログラム/スクリプトを知っていますか-不良セクタのパディングで破損したディスクを読み取る複数のパスによる最大のデータ復旧?

私はUbuntu18.04を使用しており、ddバージョンは(coreutils)8.28、GNU ddrescueバージョンは1.22、どちらもUbuntuリポジトリからのものです。

いつも助けてくれてありがとう

1
Montecristo

GNU ddrescue は、試行している回復に適したツールです。


1)-pが設定されていても、ddrescueが復元されたファイルをパディングしないのは正しいですか?

この推定は正しくありません。マニュアル 次のように言って混乱するかもしれません:

Ddrescueは、入力で不良セクタを検出したときに出力にゼロを書き込みません。また、要求されない場合は出力ファイルを切り捨てません。

これは、不良セクタの代わりにゼロが書き込まれないことを意味します。空のディスクまたはファイルに書き込みを行っている場合、宛先の未書き込み領域はゼロとして読み戻されます(ヌルバイト)。

また、-p/--preallocateオプションは「パディング」とは何の関係もありません。 「事前割り当て」を意味します。サポートされているファイルシステムでは、このオプションにより、ソースディスクを保存するのに十分なディスク容量が宛先に確保されます。


2)それをパッドに入れる方法はありますか?

GNU ddrescueによって出力されるファイルは、論理的にはソースディスクと同じレイアウトです。ソースから読み取られたブロックは宛先の同じ位置にあります。リカバリ全体を元に戻すこともできます(-R/--reverse)そしてブロックは後方に埋められますが、それでも正しい場所にあります。


3)私がやろうとしていることを実行するためのより良いコマンド/プログラム/スクリプトを知っていますか-不良セクタのパディングで破損したディスクを読み取る複数のパスによる最大のデータ復旧?

GNUddrescueはまさにあなたが望むことをします。複数のパスを実行できます(-r/--retry-passes=n)、不良セクタの望ましい「パディング」は、GNUddrescue。From manual

出力ファイルがddrescueによって作成された通常のファイルである場合、不良セクタとしてマークされた領域にはゼロが含まれます。

完全に明確にし、正常な読み取りとそれに続く不正な読み取りがnullで「埋め込まれる」という懸念に対処するために、ddrescueは成功した読み取りを再読み取りしようとしません―データはすでに復元されているため、その必要はありません。マップファイルは、ddrescueがすでに回復したものと回復に失敗したものを知る方法です。

2
Deltik