Bagaimana cara mempercepat disk penuh dd?

64

Saya melakukan ddpada dua drive identik dengan perintah ini:

 dd if=/dev/sda of=/dev/sdb bs=4096

Kedua hard drive adalah nomor model yang sama persis, dan keduanya memiliki ruang penyimpanan 1TB. /dev/sda menggunakan blocksize dari 4096. /dev/sdaadalah drive lokal dan /dev/sdbmerupakan caddy jarak jauh. Saya mungkin dapat menggunakan protokol berikut:

  • USB2.0 HighSpeed ​​(Saat ini rencananya)
  • Klon Gigabit Over-The-Network (Benar-benar tidak ingin mencoba ini)
  • USB3.0 (Jika saya menemukan drive caddy saya yang lain)
  • eSATA (Jika saya menemukan / membeli kabel)
  • SATA (Jika saya menemukan / membeli kabel, pasti suka drive CD laptop)

Apakah ada cara untuk menjalankan salinan drive ini yang membutuhkan waktu kurang dari 96 jam? Saya terbuka untuk menggunakan alat selain dd.

Saya perlu mengkloning partisi berikut (termasuk UUID)

  • Partisi EFI Fat32 (*)
  • Partisi Windows NTFS (*)
  • Partisi HFS + OSX
  • Partisi Ubuntu EXT4 (*)
  • Swap Partition (*)

* Didukung oleh Clonezilla


Saya telah mencoba Clonezilla (dan itu JAUH lebih cepat), tetapi tidak mendukung penyalinan pintar HFS +, yang saya butuhkan. Mungkin versi terbaru mendukung ini?

Ketika saya membuat klon pertama saya, saya melakukan semua partisi kecuali HFS + dan berjalan sangat cepat. (Total tidak lebih dari 3 jam)

Kaz Wolfe
sumber
1
Anda mungkin lebih baik menggunakan sesuatu seperti clonezilla. ddmenyalin semuanya , termasuk ruang kosong. Kerugiannya menjadi sangat jelas ketika Anda memiliki disk besar yang tidak sepenuhnya penuh.
Boris the Spider
Apakah membeli kabel SATA dan untuk sementara menyambungkan drive eksternal ke port SATA pada motherboard?
Mark Plotnick
Mungkin seseorang dapat menguraikan hal-hal berikut: Bagaimana kalau mengkloning tabel partisi (menggunakan clonezilla atau dd), menggunakan Clonezilla untuk mengkloning semua partisi kecuali HFS +, dan menggunakan dd untuk satu partisi itu? Apakah ini layak?
Alexander
@Alexander Begitulah cara saya membuat klon pertama saya.
Kaz Wolfe
1
@LuisAlvarado Saya baru saja memulai klon, man!
Kaz Wolfe

Jawaban:

71

Dalam pengalaman saya, saya tidak berpikir ada sesuatu yang lebih cepat di baris perintah dd. Menyesuaikan bsparameter dapat meningkatkan kecepatan, misalnya, saya memiliki 2 HDD yang saya tahu memiliki kecepatan baca / tulis lebih besar dari 100 MB / s jadi saya melakukan ini:

dd if=/dev/sda of=/dev/sdb bs=100M

Ada juga pv(Perlu diinstal terlebih dahulu) yang memeriksa kecepatan tercepat pada kedua drive dan kemudian hasil kloning. Ini tentu saja harus dilakukan dari root:

pv < /dev/sda > /dev/sdb

Dengan PV saya mendapat 156 MB / s

Hal yang baik tentang pvterlepas dari kecepatan adalah bahwa ia menunjukkan kemajuan, kecepatan saat ini, waktu sejak dimulai dan ETA. Mengenai HFS + saya tidak akan tahu, saya hanya mencoba untuk membantu pada bagian "kecepatan". Dengan pvatau bsparameter yang sangat optimal , Anda dapat melakukan drive 4 TB dalam waktu kurang dari 7 Jam (6 Jam 50 Menit dengan kecepatan saat ini 150 MB / s).

masukkan deskripsi gambar di sini

Saya melakukan beberapa tes dengan jenis koneksi yang Anda gunakan dan yang lain yang saya miliki. Saya menggunakan Asus Z87 Pro dan Intel DZ68DP. Ini adalah hasil saya, tetapi pertama-tama kita perlu tahu bahwa kecepatan teoritis untuk banyak kecepatan transfer (kecepatan mentah) hanya itu, teori . Melakukan tes nyata mengungkapkan bahwa mereka berada antara 40% hingga 80% dari kecepatan mentah itu. Tes ini dapat berubah tergantung pada Perangkat yang digunakan, jenis koneksi, motherboard, jenis kabel penghubung, jenis sistem file, dan lainnya. Dengan mengingat hal itu, inilah yang saya dapat (saya hanya menguji kecepatan Tulis ke Perangkat, baca biasanya lebih tinggi):

Connected Device  -  Connection Type  -  Speed (Write Speed)
  USB 2.0                 USB 2.0              25 MB/s
  USB 3.0                 USB 2.0              35 MB/s
  USB 3.0                 USB 3.0              73 MB/s
  eSata                   eSata                80 MB/s
  Sata 2G HDD             Sata 2G              120 MB/s
  Sata 3G HDD             Sata 2G              140 MB/s
  Sata 3G HDD             Sata 3G              190 MB/s
  Sata 2G SDD             Sata 2G              170 MB/s
  Sata 3G SDD             Sata 2G              210 MB/s
  Sata 3G SDD             Sata 3G              550 MB/s 
Luis Alvarado
sumber
3
kirim sinyal USR1, untuk mendapatkan kemajuan dd. Kerugian dari dd adalah bahwa ia menyalin ruang kosong.
jfs
1
Dalam pengalaman saya, menyesuaikan bsparameter dapat dilakukan ddsecepat cat. Anda mungkin juga menggunakannya catdi tempat pertama.
Gilles 'SO- stop being evil'
3
pvdengan sendirinya bekerja dengan sangat baik.
Kaz Wolfe
11
Anda dapat menggunakan dd untuk melakukan pekerjaan tetapi masukkan pv di rantai untuk memantau kecepatan transfer seperti ini:dd if=/dev/sda1 | pv | dd of=/dev/sdb1
thomasrutter
4
Saya selalu digunakan pvdi antara dds. Tidak pernah tahu itu bisa digunakan sendiri!
korylprince
12

Untuk menyalin partisi grosir, gunakan catsebagai gantidd . Saya menjalankan benchmark beberapa saat yang lalu, menyalin file besar daripada partisi, antara dua disk (pada disk yang sama, timing relatif berbeda):

dd bs=64M    51.3
dd bs=1M     41.8
dd bs=4k     48.5
dd bs=512    48.9
cat          41.7
cp           45.3

Kesimpulan dari tolok ukur ini adalah bahwa pilihan ukuran blok untuk ddhal - hal (tapi tidak terlalu banyak), dan catsecara otomatis menemukan cara terbaik untuk membuat salinan cepat: ddhanya dapat memperlambat Anda. Dengan ukuran blok kecil, ddbuang waktu membuat kecil membaca dan menulis. Dengan ukuran blok yang besar, satu disk tetap siaga sementara yang lain sedang membaca atau menulis. Tingkat optimal dicapai ketika satu disk membaca sementara disk lain menulis.

Untuk menyalin partisi, mungkin lebih cepat untuk menyalin file cp -a. Ini tergantung pada berapa banyak file yang ada dan berapa banyak sistem file ruang bebas. Menyalin file memiliki overhead yang kira-kira sebanding dengan jumlah file, tetapi di sisi lain, menyalin ruang kosong akan menghabiskan waktu.

Kecepatan data maksimum untuk USB2 adalah sedikit di bawah 50 MB / s yang bekerja sampai 6-7 jam untuk mentransfer 1TB. Ini mengasumsikan hard disk yang cukup cepat untuk memenuhi USB bus; Saya pikir drive 7200 rpm lebih cepat dapat melakukannya tetapi 5900rpm mungkin tidak secepat itu (mungkin mereka untuk menulis linear?).

Jika salah satu disk digunakan secara paralel, ini dapat memperlambat penyalinan karena kepala disk harus bergerak.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya mencoba menyalin seluruh disk.
Kaz Wolfe
Saya berharap perbedaannya berada pada urutan yang sama, tetapi jalankan benchmark pada sistem Anda untuk mendapatkan data yang lebih andal.
Gilles 'SANGAT berhenti menjadi jahat'
Bisa catdigunakan untuk apa dd if=ubuntu.iso of=/dev/usb? ddKecepatan untuk melakukan ini baik USB2 atau USB3 sangat lambat.
Oxwivi
1
@ Oxwivi Ya, cat ubuntu.iso >/dev/usbpersis sama. Tidak ada keajaiban di dddalamnya, itu hanya alat untuk menyalin inputnya ke outputnya.
Gilles 'SO- stop being evil'
Perintah cat yang diberikan di atas tidak bekerja pada mac. Saya mencoba sudo cat linuxmint-17.3-cinnamon-64bit.iso >/dev/disk1Memberi kembali "-bash: / dev / disk1: Izin ditolak"
Nay
12

Masalahnya adalah jenis koneksi Anda, dan ukuran blok. Untuk hasil tercepat, ukuran blok Anda harus setengah dari kecepatan tulis terendah yang biasanya Anda terima. Ini akan memberi Anda margin aman, tetapi masih memungkinkan untuk sejumlah besar; tentu saja Anda perlu memiliki ram yang cukup untuk menyimpan data juga.

Usb 2.0 adalah 12 megabit per detik (Mbps), Kecepatan Tinggi Usb 2.0 adalah 480 Mbps. Ini tentu saja kecepatan mentah; dengan 8 bit dalam byte dan membingkai overhead, kecepatan yang dapat digunakan dalam MB / s biasanya merupakan tempat desimal. Jadi misalnya 480 mentah, menjadi 48MB dapat digunakan. Perlu diingat bahwa ini adalah yang terbaik secara matematis, di dunia nyata akan sedikit lebih rendah. Untuk koneksi USB 2.0 kecepatan tinggi Anda harus mengharapkan kecepatan tulis maks 30-35 MBs, asalkan perangkat penyimpanan yang sebenarnya dapat menyamakan atau melampaui kecepatan koneksi.

Sesama
sumber
6
Unit nitpicking: USB2.0 High Speed ​​adalah 480 Mbit / s = 60 MByte / s, kecepatan mentah. Kecepatan yang dapat digunakan bukan tempat desimal, tetapi sekitar 80% dari kecepatan mentah. Aturan "kecepatan aktual dalam MByte / s adalah 1/10 dari kecepatan mentah dalam Mbit / s" adalah valid.
jpa
5

Saya setuju bahwa kecepatan mentah dari perintah yang disetel dengan baik dd('pv') atau 'cat' sulit dikalahkan, tetapi jika ada masalah dengan salinan (sektor buruk, kegagalan daya, kesalahan pengguna, dll) maka Anda harus memulai lebih.

Saya ingin menyarankan ddrescue - alat FOSS yang memiliki semua kecepatan dd tetapi akan bekerja di sekitar kesalahan disk, dan melanjutkan pada titik selanjutnya jika ada kegagalan.

dan_linder
sumber
2

Saya memindahkan Windows 7 dari HDD ke SSD dan menemukan ini dan beberapa jawaban lain ... Sesuatu yang saya pelajari yang mungkin membantu orang lain. Dalam kasus saya, drive sumber lebih besar, kalau tidak saya akan bekerja di tingkat perangkat / dev / sda -> / dev / sdb.

Win7 dan 3 partisi-nya ... Saya menggunakan live cd Xbuntu 14.04 di usb. Muncul DVD komputer menang dan letakkan SSD di tempatnya. Menginstal partclone dan mencoba ini:

partclone.ntfs -b -N -s /dev/sda3 -o /dev/sdb3

Partclone muntah pada ntfs yang membutuhkan chkdisk berjalan di Windows, jadi perbaikan cepat membuat partclone senang:

ntfsfix -b /dev/sda3
ntfsfix -d /dev/sda3

Semua perintah dijalankan sebagai root. Partclone's ncurses UI (opsi -N) mengatakan transfer adalah 7GB / menit dan berakhir pada 5GB / menit, yang setara dengan 83MB / detik. Bagian terbaiknya adalah partclone tidak menyalin ruang yang tidak digunakan, jadi ini membuat klon sangat cepat.

Gotchya tambahan potensial:

  • jika drive yang Anda transfer sebelumnya digunakan, mungkin ada sisa-sisa GPT. Instalasi pabrik Windows 7 biasanya adalah tabel partisi msdos / mbr. Anda harus menghapus fragmen GPT dari drive tujuan. Ini Unix & Linux QA membantu saya dengan ini. Anda harus menggunakan gdiskpada perangkat, gunakan x lalu z dan ya untuk zap data GPT dan pastikan Anda MENJAGA MBR.

  • Dan jangan lupa jika Anda tidak melakukan level perangkat dd, Anda harus menyalin MBR menggunakan di
    dd if=/dev/sdb of=/dev/sda bs=446 count=1
    mana sdb adalah sumber atau drive lama dan sda adalah tujuan atau drive baru ( sumber )

Chris K
sumber
1

Saya baru-baru ini membuat gambar partisi 100GB (HDD) dan menulisnya ke disk SSD baru.

Inilah tip yang dapat mempercepat proses secara drastis :)

Membagi file menjadi bagian yang lebih kecil (semakin besar file, semakin lambat kerjanya)

sudo dd if=/dev/sda3 conv=sync,noerror bs=2M | split -a 3 -d -b 1G - /maindisk.img

Selama proses, Anda dapat memeriksa kecepatan menggunakan (di terminal terpisah)

pgrep -l '^dd$' #to find PROCESSID
kill -USR1 PROCESSID #to check the speed

Kemudian, ketika Anda memiliki direktori yang penuh dengan file hasil (maindisk.img000, maindisk.img001, dan seterusnya ...) gunakan

sudo cat maindisk.img* | sudo dd of=/dev/sda1

untuk 'membakar' gambar ke dalam partiton baru SSD (ukuran partisi harus sama dengan yang lama)

Bagi saya itu bekerja lebih cepat daripada cara biasa (tanpa membelah). Kecepatan rata-rata membuat gambar adalah ~ 13MB / s. Ketika saya menggunakan cara 'normal' dimulai dengan ~ 15MB / s dan kemudian menurun menjadi 1MB / s.

matowc1991
sumber
1
Mengapa lebih lambat untuk menulis satu file besar daripada banyak file kecil? Apa tipe sistem file target dan flag mount-nya?
David Foerster
Juga conv=syncmerugikan kinerja dan agak tidak berguna dalam kasus penggunaan ini.
David Foerster
0

Bagi siapa pun yang menemukan utas ini, jauh lebih mudah dan lebih cepat untuk hanya menggunakan alat yang dirancang untuk pemulihan data seperti ddrescue . Mencoba menyelamatkan bagian yang baik terlebih dahulu jika terjadi kesalahan baca. Anda juga dapat mengganggu penyelamatan kapan saja dan melanjutkannya nanti di titik yang sama.

Jalankan dua kali:

Babak pertama, salin setiap blok tanpa kesalahan baca dan catat kesalahan tersebut ke rescue.log.

sudo ddrescue -f -n /dev/sdX /dev/sdY rescue.log

Babak kedua, salin hanya blok yang buruk dan coba 3 kali membaca dari sumber sebelum menyerah.

sudo ddrescue -d -f -r3 /dev/sdX /dev/sdY rescue.log

Sekarang Anda dapat memasang drive baru dan memeriksa sistem file untuk korupsi.

Info lebih lanjut:
https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html

goetzc
sumber
0

Id merekomendasikan input / baca - file / disk pada SATA untuk meningkatkan kecepatan membaca. Kecepatan tinggi USB 2.0 juga bagus karena saya mendapatkan kecepatan rata-rata 33816 kb / s dengan ddrescue dibandingkan dengan ketika pengaturan USB 2.0 ke SATA pada 2014 kb / s

NateNjugush
sumber
0

Gunakan ukuran blok yang berbeda. Ini adalah jumlah data yang dddibaca sekaligus. Jika membaca terlalu sedikit, sebagian besar waktu dihabiskan untuk logika program dan jika membaca terlalu banyak, banyak waktu dihabiskan untuk memindahkan data besar.

Untuk mengukur kecepatan pada ukuran blok yang berbeda, gunakan bashskrip berikut :

  • diatur $devke perangkat
  • perbaiki cbtotalsetidaknya 5x kecepatan baca yang Anda harapkan
    (set -o errexit; skip=0; cbtotal=$((120*1024**2)); bs=256;
    for power in `seq 10`; do
      bs=$((bs*2)); skip=$((skip/2)); count=$((cbtotal/bs));
      if [ "$count" -lt 1 ]; then break; fi;
      echo $bs;
      dd if=$dev of=/dev/null skip=$skip bs=$bs count=$count
      skip=$((skip+count))
    done)

Hasilnya mungkin bias ke ukuran yang lebih besar karena pembacaan disk di depan - itu sebabnya penting untuk mengatur cbtotalcukup besar.

ivan_pozdeev
sumber