dd berjalan melewati ujung perangkat masukan
Saya mencoba menggunakan dd
untuk mengkloning hard drive yang telah saya perbaiki. Saya mencoba membuat dd
salinan data dari drive dalam potongan 10GB, namun itu mentransfer lebih banyak data daripada yang seharusnya dimiliki drive. Drive itu sendiri berfungsi, dan partisi di atasnya dapat dipasang.
Menggunakan df -h
Saya mendapatkan ukuran drive menjadi 1000204886016 byte (drive 1TB).
Saya awalnya mencoba:
sudo dd if=/dev/sdb of=/dev/sdd status=progress
Namun itu melambat menjadi perayapan setelah sekitar 300GB, dan akhirnya gagal karena kesalahan pembacaan. Saya memutuskan untuk mencoba menyalinnya dalam potongan 10GB. Saya menghitung bahwa membaca 10GB dengan ukuran blok 128kByte memerlukan penyalinan 78125 blok.
Untuk melakukan ini saya menggunakan:
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=n
dd
melaporkan bahwa 10240000000 byte ditransfer setiap kali. Untuk menghitung nilai seek untuk setiap iterasi, saya mengumpulkan byte yang ditransfer, dan mengurangi 1GB untuk memastikan ada beberapa tumpang tindih. Urutan yang dihasilkan adalah:
seek=0
seek=9240000000
seek=18480000000
seek=27720000000
seek=36960000000
...
seek=1071840000000
Saya menulisnya dalam skrip shell dengan perintah dd diskrit dan menjalankannya. Saya membiarkan iterasi terakhir bebas untuk menyalin data sebanyak yang diperlukan.
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=0
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=9240000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=18480000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=27720000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=36960000000
...
sudo dd if=/dev/sdb of=/dev/sdd bs=128k status=progress oflag=seek_bytes seek=1071840000000
Seharusnya berjalan jauh melewati akhir drive dengan iterasi terakhir itu, namun itu terus berjalan. Clone mount, tetapi data yang jelas rusak dan hilang.
- Apakah ada yang salah dengan matematika saya, atau argumen yang saya gunakan
dd
? - Apakah ada cara yang lebih baik bagi saya untuk menulis perintah 'dd' untuk mengeluarkan data dalam potongan 10GB?
Jawaban
Masalahnya adalah bahwa Anda mengasumsikan seek
mengambil nilai byte, padahal pada kenyataannya dibutuhkan jumlah blok. Anda harus menggunakan seek=0
, 78125
, 156250
, dll
Namun, Anda dapat banyak menyederhanakannya dengan menyingkirkan dd
:
split -b 10G < /dev/sdd
Saya mencoba menggunakan dd untuk mengkloning hard drive yang telah saya perbaiki
Jangan.
Gunakan ddrescuesebagai gantinya, yang mengatasi dengan baik blok yang tidak terbaca dan kesalahan media lainnya.
Saya menemukan alasan mengapa solusi saya gagal adalah kesalahpahaman tentang apa yang dilakukan oleh flag seek. Itu hanya menggeser lokasi tulis pada drive keluaran. Jadi skrip hanya menyalin 10GB pertama berulang kali ke output. Itu tidak akan pernah mencapai ujung perangkat.
Untuk menggeser masukan, bendera lewati perlu digunakan juga:
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n
Pengaturan oflag=seek_bytes
dan iflag=skip_bytes
akan memungkinkan matematika dilakukan dalam byte sebagai lawan blok.
Namun opsi yang disajikan oleh roaima (gunakan ddrescue) dan orang lain itu ( split -b 10G < /dev/sdd
) adalah cara yang lebih baik untuk memulihkan drive yang rusak, dan melakukan transfer tersegmentasi masing-masing.