Lanjutkan proses penyalinan yang terputus

8

Bagaimana melanjutkan proses menyalin file dengan aman dan andal $Ake lokasi cadangan yang $Bdilakukan dengan pv "$A" > "$B"atau cat "$A" > "$B"?

(misalkan file $Aini sangat besar, mis. file snapshot LVM2)

Apakah bisa dicapai dengan dd?

Lebih disukai: solusi bash atau python (lebih disukai python3).

Skenario contoh: pv "$A" > "$B"terputus setelah menyalin 90%. Bagaimana melanjutkannya, untuk menyelesaikan proses penyalinan tetapi tidak mengulangi seluruh pekerjaan lagi?

Grzegorz Wierzowiecki
sumber
Anda mungkin ingin memanfaatkan: unix.stackexchange.com/a/12538/9689 dan unix.stackexchange.com/questions/32941/…
Grzegorz Wierzowiecki

Jawaban:

12

Ya, Anda dapat menggunakan dd untuk melewati blok.

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

Parameter penting di sini adalah skipjuga seek:

  • skip: lewati BLOCKS blok berukuran ibs pada awal input
  • seek: lewati BLOCKS blok ukuran-obs pada awal output
Ulrich Dangel
sumber
10

Anda ingin rsync:

rsync -a --append "$A" "$B"
Teddy
sumber
1
Saya tidak ingin menggunakan rsync. Misalkan A adalah 1TB dan saya sudah menyalin data 900GB dan masih ada 100G yang tersisa. rsync akan membaca seluruh 1TB, sementara saya hanya perlu 100G terakhir! -> Baca dulu tentang algoritma yang digunakan: en.wikipedia.org/wiki/Rsync#Algorithm
Grzegorz Wierzowiecki
1
@ GrzegorzWierzowiecki saya pikir Anda salah. Kecuali jika pengalaman saya dengan rsync sepenuhnya salah, rsync akan membaca apa yang perlu dibaca untuk memverifikasi output benar, sampai menyentuh titik di mana mulai muncul disparitas, dan kemudian akan berlanjut dari titik yang ditandai. Ini terlihat persis seperti apa yang dibutuhkan.
killermist
1
Agar ini berfungsi, Anda juga perlu menambahkan --append.
Thor
Terima kasih @Thor untuk menekankan opsi ini. Ketika saya telah memeriksa ulang tampaknya perilaku --appendtelah berubah sejak versi 3.0.0. Bisakah Anda memastikan saya jika saat ini --appendmengabaikan bagian yang sudah disalin, sementara --append-verifymembaca seluruh A untuk cek checksum? (sebelum versi 3.0.0. --appendberperilaku seperti --append-verify-> Itulah alasan kesalahpahaman)
Grzegorz Wierzowiecki
5
@GrzegorzWierzowiecki: Saya tidak melihat perubahan ini. Saya baru saja mengujinya, dan memang --appendmembuta menambahkan ke file. --append-verifymelakukan hal yang sama tetapi menjalankan checksum pada akhirnya, jika checksum tidak cocok rsynctampaknya melakukan salinan baru.
Thor
3

Apakah Anda mencoba dd skipdengan offset ukuran file nyata B (terlepas dari ukuran blok partisi)?

Itu akan membuat Anda bagian yang hilang. Pada titik itu Anda bisa mengarahkan catmereka bersama-sama ke file baru cat "$B" "$A2" >> "$C"; #mv "$C" "$B"(di mana $Ctentu saja bagian yang hilang di jalur dengan ruang yang cukup).

catberfungsi dengan baik untuk menggabungkan binari juga dan dalam hal ini Anda tidak memiliki banyak header file yang akan mendahului penggabungan skrip sederhana. Ada kemungkinan ujung $Brusak, tetapi dalam hal ini Anda bisa memotongnya dan membaca lebih banyak $Apada langkah awal dd.

lynxlynxlynx
sumber