Saya tidak punya solusi sederhana untuk itu ddrescue.
EDIT: Saya punya solusi yang tidak begitu sederhana sekarang.
Mempersiapkan file target
Anda perlu mengetahui ukuran hard drive sumber dalam unit 512-byte. Simpan dalam variabel.
SIZE=$(sudo blockdev --getsz /dev/sdX)
File target harus memiliki ukuran yang sesuai sebelumnya.
fallocate -l $((512*$SIZE)) /mnt/samba/share/target.dd
Mempersiapkan perangkat tertunda
Pertama, Anda membutuhkan perangkat loop.
sudo losetup -f /mnt/samba/share/target.dd
sudo losetup -a
Perintah kedua memberi tahu Anda perangkat loop mana yang terkait target.dd. Di sini saya menganggap itu /dev/loop0.
Kemudian Anda membuat perangkat dengan perangkat mapper.
echo "0 $SIZE delay /dev/loop0 0 0 /dev/loop0 0 500" | sudo dmsetup create delayed_target
Nomor 500 dalam contoh ini menyatakan bahwa setiap operasi penulisan aktif /dev/mapper/delayed_target akan ditunda hingga 500 ms. (Lihat man dmsetup dan dokumen ini untuk detail.)
Membaca yang sebenarnya
sudo ddrescue --force -D -c 2048 /dev/sdX /dev/mapper/delayed_target logfile.log
Tombol -c 2048 memberitahu ddrescue untuk memproses 2048 * 512 byte pada satu waktu, itu satu megabyte. Karena -D program menghilangkan caching dll. yang akan mengumpulkan banyak operasi tulis menjadi satu. Dengan -D setiap megabyte membentuk operasi tulis terpisah yang mencapai keterlambatan 500 ms.
Tweaking
Satu perubahan adalah untuk mengubah -c 2048 di ddrescue doa. Lain - untuk mengubah penundaan dalam dmsetup (Lihat Pembersihan bagian).
Kamu selalu bisa berhenti ddrescue dengan Ctrl + C , atur penundaan jika perlu, jalankan kembali ddrescue dengan logfile yang sama dan mungkin yang lain -c parameter - dan itu akan berlanjut. Eksperimen untuk menemukan nilai yang sesuai dengan kebutuhan Anda.
Pembersihan
sudo dmsetup remove delayed_target
(Untuk mengubah penundaan, kembali ke dmsetup create sekarang.)
sudo losetup -d /dev/loop0
Catatan
Alih-alih menunda menulis ke file target Anda dapat menunda membaca dari perangkat sumber. Tampaknya menjadi cara yang lebih baik karena tidak perlu perangkat loop. Namun, pengujian saya menunjukkan bahwa ada pembacaan langsung dari perangkat mapper yang baru dibuat. Bacaan ini memukul penundaan berkali-kali dan memblokir dmsetup diri. Semua interpretasi saya mungkin salah, masih ada penundaan signifikan setelahnya dmsetup create. Itu membuat tweaker (jika tidak semua prosedur) hampir mustahil.
Jawaban asli saya:
Dari pengalaman saya ddrescue secara signifikan lebih baik daripada dd hanya jika ada kesalahan baca. Jika disk Anda umumnya dalam kondisi baik dan Anda mengharapkan kesalahan baca jarang terjadi, Anda dapat menggunakannya dd dengan pv.
Contoh:
dd if=/dev/sdb conv=sync,noerror bs=32M 2>dd.log | pv -L 4M > /mnt/samba/desktop/my-image.dd
Itu noerror parameter untuk dd membuatnya berlanjut setelah kesalahan baca terjadi, jika ada; sync penyebab dd untuk menghasilkan nol dalam kasus itu, sehingga data yang baik kemudian ditempatkan dengan offset yang tepat dalam file gambar. Saya lebih suka besar bs untuk kinerja hdd. Perhatikan bahwa dengan besar bs satu kesalahan baca dapat menyebabkan sebanyak 32MiB nol yang salah pada gambar, jadi Anda mungkin perlu:
- baik secara manual bermain dengan kalkulator saku dan
dd ini bs, skip, seek dan conv=notrunc opsi untuk melakukan apa ddrescue tidak secara otomatis: membaca dan menyimpan sebanyak mungkin, mudah-mudahan mengurangi nol yang salah menjadi 512B atau 4096B per kesalahan baca (angka-angka ini adalah ukuran sektor umum untuk disk).
- atau secara manual bermain dengan kalkulator saku dan buat file log untuk
ddrescue, lalu lari ddrescue hanya membaca ulang fragmen sumber yang bermasalah; mengacu pada info ddrescue pada struktur file log.
Dalam kedua kasus yang disimpan stderr dari dd akan berguna untuk mencari sektor yang bermasalah, karenanya 2>dd.log pengalihan.
Untung dengan pv adalah kemampuannya untuk mengubah batas kecepatan dengan cepat (ganti PID dengan yang sebenarnya pid dari aslinya pv digunakan dengan dd ):
pv -L 6M -R PID
Dengan cara ini Anda dapat menyesuaikan batas tanpa memulai dari awal.