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.