中断されたコピープロセスを再開する


8

コピーファイルの安全かつ確実にプロセスを再開するためにどのように$Aバックアップ場所に$Bで行いますpv "$A" > "$B"cat "$A" > "$B"

(ファイル$Aが非常に大きいと仮定しましょう。例:LVM2スナップショットファイル)

で達成可能ddですか?

推奨:bashまたはpython(できればpython3)ソリューション。

シナリオ例:pv "$A" > "$B"90%をコピーした後に中断されました。コピープロセスを終了し、作業全体を再度繰り返さないために、どのように再開しますか?


回答:


12

はい、ddを使用してブロックをスキップできます。

A="file1"
B="file2"

BLOCKSIZE=512  # default bs for dd

size_b=$(stat -c "%s" "$B")
skip_blocks=$((size_b / BLOCKSIZE))

dd if="$A" of="$B" skip=$skip_blocks seek=$skip_blocks bs=$BLOCKSIZE

ここで重要なパラメータは、skip同様にseek

  • skip入力の開始時にBLOCKS ibsサイズのブロックをスキップ
  • seek出力の開始時にBLOCKS obsサイズのブロックをスキップ

10

あなたが欲しいrsync

rsync -a --append "$A" "$B"

1
rsyncを使いたくありません。Aが1TBで、すでに900GBのデータをコピーし、残りが100Gであると仮定します。rsyncは1TB全体を読み取りますが、最後の100Gだけが必要です!->使用されるアルゴリズムについてまずお読みください:en.wikipedia.org/wiki/Rsync#Algorithm
Grzegorz Wierzowiecki

1
@GrzegorzWierzowiecki私はあなたが間違っていると思います。rsyncを使って私の経験は完全に間違っている場合を除き、rsyncがします読んで、それはそれはそこに格差が現れ始め、その後、それはそのマークされた時点から継続するポイントに到達するまでの出力が、右であることを確認するために読むために必要なもの。これはまさに必要なもののようです。
キラーミスト2012

1
これを機能させるには、も追加する必要があります--append
トール

このオプションを強調してくれて@Thorに感謝します。もう一度確認したところ--append、バージョン3.0.0以降、動作が変更されているようです。チェックサムチェックのためにA全体--append--append-verify読み取りながら、現在コピー済みの部分を無視するかどうかを確認してください。(バージョン3.0.0より前。次の--appendように動作した--append-verify->これが誤解の理由です)
Grzegorz Wierzowiecki '29 / 07/29

5
@GrzegorzWierzowiecki:この変化に気づかなかった。私はそれをテストし、実際に--append盲目的にファイルに追加しました。--append-verify同じことを行いますが、チェックサムが一致しない場合は、最後にチェックサムrsyncを実行し、新しいコピーを行うようです。
トール

3

dd skipBの実際のファイルサイズ(パーティションブロックサイズとは無関係)のオフセットを試してみましたか?

それはあなたに欠けている部分を手に入れるでしょう。その時点で、catそれらを一緒に直接新しいファイルにまとめることができますcat "$B" "$A2" >> "$C"; #mv "$C" "$B"$Cもちろん、十分なスペースのあるパス上の欠落部分です)。

catバイナリの連結にも問題なく機能し、この場合、単純なスクリプト化されたマージを実行するような複数のファイルヘッダーがありません。の終わり$Bが破損している可能性がありますが、その場合は、短く$Aして、最初のddステップでさらに読み取ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.