ドライブをファイルにコピーしていましたが、占めるスペースを過小評価しました。そのため、ターゲットドライブに十分なスペースがなく、プロセスを中断したくありません(長い間破損したドライブで実行されています)。
もちろん、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つの異なるプログラム)を使用してディスクイメージをコピーすることを正しく提案しました。パーティション/ドライブに不良セクタがある場合、またはその他のハードウェア障害がある場合は、これを行います。