
私は古い 3.5 インチフロッピー ディスクのコレクションを持っており、そこからできるだけ多くのデータを回復したいと考えています。
この問題は、一部のファイルの構造が原因です。すべてのファイルの長さを維持する必要があるため、不良セクターを埋め込む必要があります (要約すると、一部のファイルはデータとコードが結合された Acorn ADFS ファイルであるためです。コードは、ファイルの先頭からのオフセットとしてデータを参照します。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
どこ:
エラーなしエラーは無視されることを意味する
同期不良セクタはヌル文字で埋められることを意味する
実行しないdd が呼び出されたときに (既存の) 出力ファイルが切り捨てられないことを意味します。
しかし、私が読んだところ、マニュアルページこのnotruncの説明notrunc が設定されているにもかかわらず、dd は毎回出力を上書きするため、出力は最後のパスで読み取られたものだけを表すことになります。以前は正しく読み取られたが、現在は不良であるセクター (たとえば、古いフロッピー ディスクの劣化によるもの) は、null で上書きされます。
したがって、dd は適切ではないようです。
ddrescue
ddrescue正常に書き込まれた内容を記録するログファイルが使用され、次のパスの実行時に参照される限り、複数のパスで使用できるという点で有望に見えます。
エラーのないブロックのみを読み取る最初のパス
ddrescue -d -p --no-scrape /dev/fd0 output.img log/output.logfile
最初のパスとその後のパスでエラーを埋める
ddrescue -d -r3 /dev/fd0 output.img log/output.logfile
どこ
-d直接ディスクアクセス。システムキャッシュを無視
--スクレイプなしまたは-n削り取り段階をスキップする
-ppreallocate はリカバリ前にディスク領域を事前割り当てします。つまり、出力ファイルは入力ファイル/デバイスと同じサイズになります。
-r3不良セクタを3回再試行する(2回目以降に使用)
しかし、問題は、ddrescue が不良セクタが発生したときにそれをパディングしないように見えることです。-p を設定すると、ファイルの末尾にすべてのパディングが行われ、ファイルの先頭からのデータのオフセットが要求どおりに維持されないようです。
ddrescue はディスク領域を節約するために不良セクタを切り捨て、その後のパスで不良セクタが正常に読み取られた場合に追加されるように記述されているため、このようになるようです。-p を設定すると、スペースを節約するために入力ファイルと同じサイズの出力ファイルが作成され、データがパディングされることはありません。したがって、-p が設定されているかどうかに関係なく、出力の内容は同一であり、ファイルの最後までパディングされません。
質問
私の質問は3つに分かれています
-p が設定されていても、ddrescue は回復したファイルをパディングしないというのは正しいですか?
埋め込む方法はありますか? インターネットで検索したところ、ddrescue によって作成されたログ ファイルをスクリプトで使用して、関連する場所に埋め込むことができるというコメントを読みました (再度見つけて追加します)。 何かいいアイデアはありますか?
そして
- 私がやろうとしていること、つまり不良セクタを埋め込んだ破損したディスクを複数回読み取って最大限のデータ回復を行うための、よりよいコマンド/プログラム/スクリプトをご存知ですか?
私は Ubuntu 18.04 を使用しています。dd バージョンは (coreutils) 8.28、GNU ddrescue バージョンは 1.22 で、どちらも Ubuntu リポジトリからのものです。
いつも助けてくれてありがとう
答え1
GNU ddrescueあなたが試みている回復には適切なツールです。
1) -p が設定されていても、ddrescue は回復したファイルをパディングしないというのは正しいですか?
この推測は誤りです。 あなたは混乱するかもしれないマニュアルこう言っています。
Ddrescue は、入力に不良セクタが見つかった場合に出力にゼロを書き込まず、要求されない限り出力ファイルを切り捨てません。
これは不良セクタの代わりにゼロが書き込まれていないことを意味します。不良セクタにあるべきものが埋められていないだけです。空のディスクまたはファイルに書き込む場合は、宛先の書き込まれていない領域はゼロとして読み戻されます(ヌルバイト)。
また、-p
/--preallocate
オプションは「パディング」とは関係ありません。これは「事前割り当て」を意味します。サポートされているファイル システムでは、このオプションにより、ソース ディスクを保存するのに十分なディスク領域が宛先に確保されます。
2) パッドにする方法はありますか?
GNU ddrescue によって出力されるファイルは、論理的にはソース ディスクと同じレイアウトになります。 ソースから読み取られたブロックは、宛先の同じ位置に配置されます。リカバリ全体を逆にする ( -R
/ --reverse
) ことも可能で、ブロックは正しい場所に逆方向に埋められます。
3) 私がやろうとしていること、つまり不良セクタを埋め込んだ破損したディスクを複数回読み取って最大限のデータ回復を行うのに適したコマンド、プログラム、スクリプトをご存知ですか?
-r
GNU ddrescue はまさにあなたが望むことを行います。複数のパス ( / )を実行でき、不良セクタの望ましい「パディング」は GNU ddrescue のデフォルトの動作です。--retry-passes=n
マニュアル:
出力ファイルが ddrescue によって作成された通常のファイルの場合、不良セクタとしてマークされた領域にはゼロが含まれます。
完全に明確にし、成功した読み取りの後に間違った読み取りが続くとnullで「埋められる」のではないかという懸念に対処するために、ddrescueは成功した読み取りを再度読み取ろうとしません―データはすでに回復されているので、その必要はありません。マップファイルは、ddrescue がすでに回復したものと回復に失敗したものを認識する方法です。