ドライブをファイルにコピーしていましたが、占めるスペースを過小評価しました。そのため、ターゲットドライブに十分なスペースがなく、プロセスを中断したくありません(長い間破損したドライブで実行されています)。
もちろん、CTRL-Zを使用してddを一時停止することもできます。ターゲットドライブをより大きなドライブに置き換え、ファイルをより大きなドライブにコピーしてddを再起動したいと思います。これを達成する方法についてのアイデアはありますか?
dd if=/dev/sdc conv=sync,noerror bs=64M | gzip -c -9 > /media/extD/drive.img.gz
編集:ddrescueが使いやすいツールだと言った人の言葉は正しいです。しかし、何らかの理由で、ddrescueは引き続き吐き出してエラーを発生させ、ddは文句を言わずずっと耐えました。
答え1
可能ですが、少し痛いです。
まず、dd
送信されると、コピーの現在位置(コピーされたバイト)を印刷することがわかります。USR1信号。だから見つけたPIDof dd
、or、ps
またはpidof
類似のものを使用してor pgrep
(notPOSIXすべてのunix-yシステムIIRCでは動作しません。
ps
私に役立つコマンド(、inも使用awk
)Debian環境):
ps aux|awk '/dd/ {print $2}'|grep -v awk
grep -v awk
予防に必要PIDawk
また印刷から。
持つPIDはいdd
、送ってくださいUSR1信号:
kill -USR1 [pid of dd]
実行中のコンソールウィンドウは、コピーしたdd
バイト数を印刷します。これでdd
実際に人を殺すことができます(ctrl + ckill -9
など)。dd
このように終了すると、中断された進行状況が報告されるかどうかは覚えていません。POSIXだから送ってくださいUSR1まず信号を送ってください。
dd
停止してから、より多くのバイトがコピーされた可能性があるため、以下を実行してください。
head -c [number of bytes reported copied from dd] > \
/path/to/drive/you/are/moving/to/filename.bin
切り取ったコピーをターゲットディスクに配置します。コピーが再開されたときに転送速度を上げるために、正しいバイト数の代わりに目的のブロックサイズに均等に分割できる値を選択できます。選択した内容を記録し、画像を拡大せずに切り取るだけです。
新しいドライブにコピーしたら、次を実行します。
dd if=/dev/sdc bs=64M skip=[truncated size divided by block size, e.g. 64000000] \
of=/path/to/part2
より小さいソースディスクに画像の残りの部分を保存するスペースがある場合は、新しいディスクにコピーされたサマリされていない画像を削除します。パート1スペースを解放し、対応するdd
ディスクに出力します。転送が完了したら実行できます。
cat /path/to/part2 >> /path/to/part1
...を加えたパート2最後までパート1、完全なディスクイメージを作成してください!少なくとも十分な空きディスク容量が必要です。パート12番目のセクションのすべてのコンテンツはその場所に追加されます。
フル転送を実行しても構わない場合は、cat /dev/sdc | gzip -c - > /path/to/imagefile.img.gz
gzip圧縮アーカイブを作成します。これは、次のようなものを使用してハードドライブパーティションに書き込むことができますzcat /path/to/imagefile.img.gz > /dev/sdX
。
[私のコメントから回答にコピー]
また、of =が指定されていない場合、ddはstdoutに書き込むと思いました(覚えていません)。これが真であれば、パート2を別々のファイルに書き込むことをスキップして、次のものを使用できます。
dd bs=64M skip=[skip-block-count] if=/dev/sdc >> /path/to/part1
dd_rescue
@MatijaNalisは、OR ddrescue
(同じタスクを実行する2つの異なるプログラム)を使用してディスクイメージをコピーすることを正しく提案しました。パーティション/ドライブに不良セクタがある場合、またはその他のハードウェア障害がある場合は、これを行います。
答え2
ファイルを別のドライブに移動した後は、プロセスを一時停止して再開することはできません。しかし、必ずしもそうする必要はありません。プロセスを終了してdd
ファイル転送を実行し、残りのデータに対して新しいコピープロセスを開始します。
最初の部分が停止する場所を確認するには、を実行しますgzip -l /media/extD/drive.img.gz
。 「圧縮されていない」番号は、コピーされたバイト数と新しいコピープロセスを開始する必要があるオフセットです。
残りのデータをコピーするには、dd
オフセットの開始位置を指定します。NNNN。
dd if=/dev/sdc 遷移=同期、エラーなし、iflag=skip_bytes、スキップ=NNNNbs = 64M | gzip -c -9 >> /media/extE/drive.img.gz
dd
コピーデータを使用しないことをお勧めします。一般的な通念とは異なり、ディスクへのアクセスには魔法はありません。しかもdd
魔法が全てです。/dev/sdc
dd
データが自動的に失われる可能性があります。- フラグを使用すると、conv=sync,noerror
一部のデータがゼロに変わり、正常にコピーされたすべてのデータが正しい場所にある可能性がありますが、そのリスクはユーザー自身が監督する必要があると思います。
作業ディスクからディスクイメージをコピーするには、cp
またはを使用しますcat
。部品をコピーするにはtail -c +$((start_offset+1)) | head -c $bytes_to_copy
。
故障したディスクからデータを回復するには、次のようにします。救う。 Ddrescueは、読み取れないデータをスキップし、正常に読み取ったデータを追跡するのに十分スマートです。障害が発生したハードドライブの場合は複数回通過することがあり、ドライブをしばらく休んだ後に再試行すると、最初の試行で一部のセクタを読み取れなくてもハードドライブ全体を回復できることがよくあります。
ddrescueは既存の部分コピーを使用して完了できます。ただし、圧縮していないままにしてください。
1実際にptrace
デバッガを使用してプロセスに接続し、一時停止し、新しいファイルを指すように内部データ構造を更新して再開できます。ただし、これを行う方法に慣れていても、これは単純なアドインソリューションよりも複雑です。