Salinan DD penuh dari hdd ke hdd

34

PERTANYAAN ASLI:

Jika saya memiliki 2 hard drive identik dengan karakteristik berikut:

  • SATA 6.0 Gb / s
  • 5400 rpm
  • 3TB

Berapa lama waktu yang diperlukan untuk menyelesaikan copy lengkap?

Sejauh ini sudah berjalan selama 5 jam dan masih berjalan ...

Saya menggunakan Linux Ubuntu 12.04 64bit dan perintah yang saya gunakan adalah:

dd if=/dev/sdb of=/dev/sdc

PEMBARUAN: 1

Saya sekarang dapat melihat kemajuan, dan sudah 6+ jam untuk menyalin 430GB. HDD adalah 3TB ...

Apakah tidak ada cara yang lebih cepat untuk melakukan ini?


PEMBARUAN: 2

Ini tampaknya jauh lebih baik daripada sebelumnya (Terima kasih kepada Groxxda untuk sarannya):

sudo dd if=/dev/sdb bs=128K | pv -s 3000G | sudo dd of=/dev/sdc bs=128K

ETA adalah sekitar 9 jam untuk 3TB, sedangkan sebelum mencapai 430GB setelah 6 jam, jadi saya kira itu akan memakan waktu sekitar 36 jam menggunakan perintah sebelumnya.

oshirowanen
sumber
Coba ambil statistik proses: Mengirim sinyal USR1 ke proses 'dd' yang sedang berjalan membuatnya mencetak statistik I / O ke kesalahan standar dan kemudian melanjutkan penyalinan. $ dd if = / dev / zero of = / dev / null & pid = $! $ kill -USR1 $ pid Periksa halaman manual Anda untuk sinyal aktual karena berbeda untuk implementasi dd berbeda.
groxxda
@Groxxda, saya tidak tahu bagaimana melakukannya.
oshirowanen
1
GNU menggunakan dd SIGUSR1, dan BSD menggunakan ddSIGINFO
groxxda
Juga apa yang Anda maksud dengan "terhubung ke kabel sata yang sama"? Apakah Anda menggunakan semacam pengganda porta? (Jika Anda mencapai kecepatan transfer 150MB / s, itu akan membuat Anda 5-6 jam, tapi saya pikir setengahnya lebih realistis.)
groxxda
1
Anda mungkin dapat mempercepat proses dengan menentukan ukuran bloksi yang lebih besar ( bs=argumen ke dd). Juga pertimbangkan untuk menghubungkan setiap HDD ke port datanya sendiri.
groxxda

Jawaban:

58

ddberguna di masa lalu ketika orang menggunakan kaset (ketika ukuran blok penting) dan ketika alat yang lebih sederhana seperti catmungkin tidak aman biner.

Saat ini, cara penulisan yang dd if=/dev/sdb of=/dev/sdcrumit, rawan kesalahan, dan lambatcat /dev/sdb >/dev/sdc . Meskipun ddmasih berguna untuk beberapa tugas yang relatif jarang , itu jauh lebih tidak berguna daripada jumlah tutorial yang menyebutkan itu akan membuat Anda percaya. Tidak ada sihir di dalam dd, sihir ada di dalamnya /dev/sdb.

sudo dd if=/dev/sdb bs=128K | pv -s 3000G | sudo dd of=/dev/sdc bs=128KSekali lagi perintah baru Anda lambat dan rumit. Data dibaca 128kB pada satu waktu (yang lebih baik dari ddstandar 512B, tetapi tidak sebagus nilai yang lebih besar) Kemudian melewati dua pipa sebelum ditulis.

Gunakan perintah yang lebih sederhana dan lebih cepat cat. (Dalam beberapa tolok ukur yang saya buat beberapa tahun yang lalu di Linux, catlebih cepat daripada cpuntuk menyalin di antara disk yang berbeda, dan cplebih cepat daripada dddengan ukuran blok apa pun; dddengan ukuran blok besar sedikit lebih cepat ketika menyalin ke disk yang sama.)

cat /dev/sdb >/dev/sdc

Jika Anda ingin menjalankan perintah ini sudo, Anda perlu menjadikan pengalihan sebagai root:

sudo sh -c 'cat /dev/sdb >/dev/sdc'

Jika Anda menginginkan laporan kemajuan, karena Anda menggunakan Linux, Anda dapat dengan mudah mendapatkannya dengan mencatat PID catproses (katakanlah 1234) dan melihat posisi deskriptor file input (atau output).

# cat /proc/1234/fdinfo/0
pos:    64155648 
flags:  0100000

Jika Anda ingin laporan kemajuan dan unix varian Anda tidak menyediakan cara mudah untuk mendapatkan di posisi file descriptor, Anda dapat menginstal dan menggunakan pvbukan cat.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Apa yang aneh dengan blok besar adalah bahwa bottleneck adalah disk, jadi apa yang membuatnya catlebih cepat dd? Mungkinkah yang catmenggunakan cache?
Emmanuel
1
@Gilles, terima kasih atas jawabannya. Saya memiliki lima drive 3TB untuk dikloning dan akan mencoba opsi cat selanjutnya. Sejauh yang saya tahu, bahwa perintah dd baru akan memakan waktu 3 jam untuk menyelesaikan, menjadi sekitar 11 jam secara total. Jika pendekatan kucing lebih cepat dari 11 jam untuk HDD 3TB kedua, saya akan menggunakan metode itu untuk drive yang tersisa.
oshirowanen
2
@Gilles, sehingga untuk mendapatkan laporan kemajuan, apakah saya menggunakan sudo sh -c 'pv /dev/sdb >/dev/sdc'bukan sudo sh -c 'cat /dev/sdb >/dev/sdc'?
oshirowanen
1
@oshirowanen Ya, gunakan pvtempat yang akan Anda gunakan cat.
Gilles 'SO- stop being evil'
1
@unhammer Tidak! Anda akan menyalin setiap perangkat satu per satu, mis cat /dev/sdc1 >/dev/sdb1 && cat /dev/sdd1 >/dev/sde1. Menggabungkan kedua bagian itu tidak masuk akal. Jika Anda ingin mengubah struktur volume btrf, untuk mengubahnya dari memiliki dua subvolume menjadi satu, Anda perlu menggunakan alat btrf untuk mengubah struktur, atau seperti yang Anda lakukan untuk membuat sistem file baru dengan struktur yang diinginkan dan menyalin file. .
Gilles 'SO- stop being evil'
7

ddmenggunakan blocksize yang sangat kecil secara default (512 byte). Itu menghasilkan banyak overhead (satu read()dan write()syscall untuk setiap 512 byte).

Ini berjalan jauh lebih cepat ketika Anda menggunakan ukuran blok yang lebih besar. Kecepatan optimal dimulai pada bs=64katau lebih. Kebanyakan orang menggunakan yang masih lebih besar bs=1Msehingga menjadi dapat dibaca manusia (ketika ddmengatakan itu disalin 1234 blocks, Anda tahu itu 1234 MiBtanpa melakukan matematika apa pun). Menggunakan blocksize yang lebih besar tidak akan menghasilkan peningkatan kecepatan, hanya konsumsi memori yang lebih tinggi.

Jadi perintahnya adalah:

dd bs=1M if=/dev/sdb of=/dev/sdc

Jika Anda sudah ddberjalan lambat , Anda dapat menghentikannya dan melanjutkan dengan ddinstance yang lebih cepat . Untuk ini, penting untuk mengetahui sejauh mana salinan telah berkembang. ddbiasanya mencetak progres ketika Anda membatalkannya, atau Anda dapat mengirimkannya USR1sinyal saat sedang berjalan untuk membuatnya mencetak progresnya.

kill -USR1 $(pidof dd)

Misalnya, jika disalin lebih dari 1234MiB, Anda dapat melanjutkan pada posisi 1234MiBmenggunakan:

dd bs=1M seek=1234 skip=1234 if=/dev/sdb of=/dev/sdc

Jika salinannya kurang dari 1234MiB, salinan Anda tidak akan lengkap. Jika disalin lebih dari 1234MiB, itu akan menyalin ulang beberapa bagian yang sudah disalin, yang biasanya tidak membahayakan. Jadi jika ragu Anda harus memilih nilai yang sedikit lebih kecil dari yang Anda yakini sudah disalin.

frostschutz
sumber
5

Mendapatkan statistik tentang proses dd yang sedang berlangsung

Anda dapat menggunakan killperintah dengan sinyal yang sesuai untuk membuat ddstatistik output menjadi kesalahan standar.
Dari halaman manual GNU dd:

Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then resume copying.
      $ dd if=/dev/zero of=/dev/null& pid=$!
      $ kill -USR1 $pid
      18335302+0 records in 18335302+0 records out 9387674624 bytes (9.4 GB)  copied,  34.6279 seconds, 271 MB/s

Pastikan Anda memeriksa halaman manual Anda untuk sinyal yang benar terlebih dahulu karena mungkin berbeda pada implementasi dd yang berbeda: (BSD dd menggunakan SIGINFO).

Mempercepat proses

  1. Hubungkan setiap HDD ke port SATA itu sendiri sehingga data dapat dibaca dari satu perangkat dan ditulis ke yang lain pada saat yang sama.
  2. Gunakan ukuran blok yang sesuai menggunakan bs=argumen. Lihatlah utas ini pada pengguna super dan coba beberapa nilai untuk Anda sendiri.
  3. Gunakan dddoa terpisah untuk membaca dan menulis dan menggunakan pipa untuk menghubungkan mereka ( dd if=/dev/sda bs=1M | dd of=/dev/sdb bs=1M).
    Jika Anda melakukan ini dan menentukan ukuran blok, pastikan Anda menggunakan ukuran blok yang sama pada setiap doa.
  4. Anda dapat mencoba optimasi lain seperti directargumen.
  5. Pastikan hard disk Anda tidak terpasang atau dapat mengakibatkan salinan yang rusak.
groxxda
sumber
0

Sudahkah Anda mencoba 'gparted'? Anda benar-benar dapat menyalin-menempel partisi dari satu drive ke drive lain dan mengubah ukurannya sesuai kebutuhan. Anda mendapatkan tingkat transfer dan waktu yang tersisa. Ini menggunakan 'e2image' di bawahnya untuk partisi linux.

ioannis
sumber
0

Ada perangkat lunak komersial yang disebut HDClone . Ini dilisensikan sebagai freeware dan komersial. Versi mana pun dapat membuat pendrive atau DVD yang dapat di-boot, serta menyalin disk. Hubungkan HD sumber dan tujuan dan ikuti instruksi berbasis GUI.

Yang gratis akan ditransfer dengan kecepatan sekitar 80MB / detik, sementara versi berbayar bisa lebih cepat. Untuk sistem file NTFS dan FAT, versi berbayar dapat dikonfigurasikan untuk mengkloning hanya bit HD yang terisi, yang secara dramatis meningkatkan kecepatan setiap klon.

Mander Gerold
sumber
(1) Apakah Anda berafiliasi dengan produk ini? (2) Di mana kita bisa mendapatkannya?
Scott
1
Atau Anda bisa menggunakan "cat / dev / sdx> / dev / sdy" secara gratis ...
HörmannHH