Menggunakan DD untuk kloning disk

182

Ada sejumlah pertanyaan tentang alat kloning disk dan ddtelah disarankan setidaknya satu kali. Saya sudah mempertimbangkan untuk menggunakan dddiri saya sendiri, terutama karena kemudahan penggunaan, dan sudah tersedia di hampir semua distribusi Linux yang dapat di-boot.

Apa cara terbaik untuk menggunakan ddkloning disk? Saya melakukan pencarian Google cepat, dan hasil pertama adalah upaya yang jelas gagal . Apakah ada yang perlu saya lakukan setelah menggunakan dd, yaitu apakah ada sesuatu yang TIDAK BISA dibaca menggunakan dd?

Falstro
sumber
Saya sadar bagaimana dd bekerja, pertanyaan saya lebih ke arah masalah yang diketahui terkait dengan dd ketika mengkloning disk (seperti dijelaskan oleh tautan), mungkin ini tidak terlalu jelas. Apa yang terkandung dalam jawabannya dan jawaban Anda bukanlah "Saya tidak pernah memiliki masalah dengan itu". Saya melakukan upvote jawaban Anda juga, karena Anda memang menyajikan beberapa poin menarik (saya suka yang tentang tidak ada indikasi kemajuan).
falstro
1
Sepertinya Anda mendapatkan Bump Spolsky: joelonsoftware.com/items/2009/05/29.html
Kyle Cronin
tidak melihat ini di sini ketika saya bertanya (dan menjawab) pertanyaan serupa tentang superuser - superuser.com/questions/11453/…
warren
3
Sungguh ironis bahwa Joel menautkan ke pertanyaan sebagai contoh yang baik dari kesalahan server, meskipun tidak ada jawaban yang baik. Tidak ada satu jawaban di antara 25 (tidak termasuk komentar) dengan ddopsi yang tepat untuk melewatkan blok buruk - yang penting ketika mengkloning disk untuk pemulihan. Saya menambahkan jawaban yang lebih baik, yang dapat mengkloning disk yang memiliki blok buruk:dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
Sam Watkins
Saya pikir pemulihan dd mungkin "gagal" jika berbicara tentang sistem file tergantung geometri drive dan pemulihan dilakukan pada hard drive yang tidak identik? Saya mengalami beberapa kegagalan pada dd restore, dan saya pikir ini adalah masalah dalam kasus saya.
Marco

Jawaban:

160

dd adalah alat kloning terbaik, itu akan membuat replika 100% hanya dengan menggunakan perintah berikut. Saya tidak pernah memiliki masalah dengan itu.

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

Ketahuilah bahwa saat melakukan kloning setiap byte, Anda tidak boleh menggunakan ini pada drive atau partisi yang sedang digunakan. Terutama aplikasi seperti database tidak dapat mengatasi hal ini dengan sangat baik dan Anda mungkin berakhir dengan data yang rusak.

Adam Gibbins
sumber
12
Tentu saja, selama / dev / sdb setidaknya sama besar dengan / dev / sda ...
Eddie
22
tambahkan "bs = 100M conv = notrunc" dan ini jauh lebih cepat dalam pengalaman saya.
Tim Williscroft
127
sangat berhati-hati dengan 'i' dan 'o' surat ...
bandi
17
Sepertinya tidak ada yang tahu trik ini ... dd adalah program penyalinan asimetris, artinya akan membaca dulu, lalu menulis, lalu kembali. Anda dapat pipa dd untuk dirinya sendiri dan memaksa untuk melakukan copy yang simetris, seperti ini: dd if=/dev/sda | dd of=/dev/sdb. Dalam pengujian saya, menjalankan perintah tanpa pipa memberi saya throughput ~ 112kb / s. Dengan pipa itu, saya dapat ~ 235kb / s. Saya tidak pernah mengalami masalah dengan metode ini. Semoga berhasil!
Mistiry
13
@Mistiry, itu bukan arti kata simetris.
psusi
113

Untuk menghemat ruang, Anda dapat memampatkan data yang dihasilkan oleh dd dengan gzip, misalnya:

dd if=/dev/hdb | gzip -c  > /image.img

Anda dapat memulihkan disk Anda dengan:

gunzip -c /image.img.gz | dd of=/dev/hdb

Untuk menghemat lebih banyak ruang, defragment drive / partisi yang ingin Anda kloning sebelumnya (jika perlu), lalu hapus semua ruang yang tidak digunakan yang tersisa, sehingga lebih mudah bagi gzip untuk mengompres:

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

Tunggu sebentar, dd akhirnya akan gagal dengan pesan "disk penuh", lalu:

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img

Selain itu, Anda bisa menjalankan proses dd di latar belakang untuk melaporkan status dengan mengirimkannya sinyal dengan perintah kill, misalnya:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

Periksa sistem Anda - perintah di atas untuk Linux, perintah OSD dan BSD berbeda dalam sinyal yang diterima (menggunakan OSX SIGINFO- Anda dapat menekan Ctrl+ Tuntuk melaporkan status).

David Hicks
sumber
2
Apakah ini juga bekerja dengan "modern" seperti BTRFS, NILFS, [apa pun yang Anda bisa impikan]?
Steve Schnepp
DD bekerja pada perangkat blok, tingkat abstraksi lebih rendah dari sistem file, jadi seharusnya ya. Saya belum benar-benar mencobanya. Hmm, NILFS terlihat menarik, saya harus melihatnya.
David Hicks
4
+1 untuk kill -SIGUSR1 %1, dan perintah OSX dd dengan senang hati menerima SIGUSR1 ... sangat berguna, terima kasih!
stuartc
1
+1 untuk Kill -SIGUSR1 1234saya mencari itu.
hot2use
2
Harus itu: dd if=/dev/hdb | gzip -c > /image.img.gz?
Mike Causer
37

PERHATIAN : melakukan filesystem langsung dapat merusak file. Alasannya sederhana, tidak memiliki pemahaman tentang aktivitas sistem file yang mungkin sedang terjadi, dan tidak berusaha untuk memitigasi hal itu. Jika sedang menulis sebagian, Anda akan mendapatkan sebagian menulis. Ini biasanya tidak baik untuk hal-hal, dan umumnya fatal untuk database. Selain itu, jika Anda mengacaukan parameter jika -rawan jika dan dari parameter, celakalah Anda. Dalam kebanyakan kasus, rsync adalah alat yang sama efektifnya yang ditulis setelah munculnya multitasking , dan akan memberikan tampilan yang konsisten dari masing-masing file.

Namun, DD harus secara akurat menangkap bit state dari drive yang tidak di-mount. Bootloader, volume llvm, UUID partisi dan label, dll. Pastikan Anda memiliki drive yang mampu mencerminkan bit drive target sedikit.

jldugger
sumber
7
Saya menduga itu syncbukan jawaban untuk mengajukan masalah korupsi. Apa yang terjadi jika seorang deamon atau sesuatu menulis lebih banyak file setelah sync, selama ddoperasi?
Dihapus
5
Itu ide yang baik untuk umount drive terlebih dahulu (atau remount sebagai read-only) tetapi itu tidak selalu mungkin
Alex Bolotov
1
Dalam hal ini, Anda menggunakan rsync dan membiarkannya melakukan sihir penanganan file untuk mendapatkan file yang konsisten dan membiarkan semantik Copy On Write menangani penulisan yang masuk.
jldugger
4
Saya ingin menambahkan bahwa menjalankan dd pada sistem file yang di-mount TIDAK AKAN MERUSAK file-file di sistem file yang di-mount, tetapi yang dimaksud di sini adalah bahwa salinan dari sistem file akan berada dalam kondisi baik yang diketahui.
bulan
1
Menggunakan rsyncakan memastikan bahwa data internal dalam sistem file tujuan konsisten. Ini tidak akan memastikan bahwa data dalam file konsisten - untuk melakukan itu, Anda perlu mengunci file dan program apa pun yang menulis ke file perlu menghormati kunci ini.
Martin Geisler
26

Saat menggunakan dd untuk mengkloning disk yang mungkin berisi bad sector, gunakan "conv = noerror, sync" untuk memastikan disk tidak berhenti ketika menemui kesalahan, dan mengisi sektor yang hilang dengan null byte. Ini biasanya merupakan langkah pertama yang saya ambil jika mencoba memulihkan dari disk yang gagal atau gagal - dapatkan salinan sebelum melakukan upaya pemulihan, dan kemudian lakukan pemulihan pada disk yang baik (dikloning). Saya serahkan ke alat pemulihan untuk mengatasi sektor kosong yang tidak dapat disalin.

Juga, Anda mungkin menemukan kecepatan dd dapat dipengaruhi oleh pengaturan bs (ukuran blok). Saya biasanya mencoba bs = 32768, tetapi Anda mungkin ingin mengujinya di sistem Anda sendiri untuk melihat mana yang paling cepat untuk Anda. (Ini mengasumsikan bahwa Anda tidak perlu menggunakan ukuran blok tertentu untuk alasan lain, misalnya jika Anda menulis ke kaset.)

TimB
sumber
13
Jika Anda memiliki disk dengan bad sector, Anda harus menggunakan 'ddrescue' alih-alih dd. Ini jauh lebih efisien, dan memiliki peluang lebih baik untuk memulihkan lebih banyak data. (Jangan bingung dengan dd_rescue, yang tidak sebagus)
davr
3
tidak boleh menggunakan ukuran blok besar jika mencoba untuk melewatkan blok buruk, atau itu akan melewati terlalu banyak. 4096 cukup besar.
Sam Watkins
17

Untuk mengkloning disk, yang perlu Anda lakukan adalah menentukan input dan output ke dd:

dd if=/dev/hdb of=/image.img

Tentu saja, pastikan Anda memiliki izin yang tepat untuk membaca langsung dari / dev / hdb (saya sarankan menjalankan sebagai root), dan bahwa / dev / hdb tidak di-mount (Anda tidak ingin menyalin ketika disk sedang sedang diubah - pemasangan sebagai hanya-baca juga dapat diterima). Setelah selesai, image.img akan menjadi klon byte-untuk-byte dari seluruh disk.

Ada beberapa kelemahan menggunakan dd untuk mengkloning disk. Pertama, dd akan menyalin seluruh disk Anda, bahkan ruang kosong, dan jika dilakukan pada disk besar dapat menghasilkan file gambar yang sangat besar. Kedua, dd sama sekali tidak memberikan indikasi kemajuan, yang dapat membuat frustasi karena salinannya membutuhkan waktu lama. Ketiga, jika Anda menyalin gambar ini ke drive lain (sekali lagi, menggunakan dd), mereka harus sama besar atau lebih besar dari disk asli, namun Anda tidak akan dapat menggunakan ruang tambahan yang mungkin Anda miliki di disk target hingga Anda ubah ukuran partisi Anda.

Anda juga dapat melakukan salinan disk-ke-disk langsung:

dd if=/dev/hdb of=/dev/hdc

tetapi Anda masih tunduk pada batasan di atas terkait ruang kosong.

Sejauh masalah atau masalah berjalan, sebagian besar, melakukan pekerjaan yang sangat baik. Namun, beberapa saat yang lalu saya memiliki hard drive yang hampir mati, jadi saya menggunakan dd untuk mencoba dan menyalin informasi apa yang saya dapat dari itu sebelum mati sepenuhnya. Kemudian diketahui bahwa dd tidak menangani kesalahan baca dengan sangat baik - ada beberapa sektor pada disk yang tidak dapat dibaca, menyebabkan dd menyerah dan menghentikan salinan. Pada saat itu saya tidak dapat menemukan cara untuk memberitahu dd untuk melanjutkan meskipun menemukan kesalahan baca (meskipun tampaknya memiliki pengaturan itu), jadi saya menghabiskan sedikit waktu secara manual menentukan lompatan dan berusaha untuk melompat dari bagian yang tidak dapat dibaca.

Saya menghabiskan beberapa waktu meneliti solusi untuk masalah ini (setelah saya menyelesaikan tugas) dan saya menemukan sebuah program bernama ddrescue , yang, menurut situs tersebut, beroperasi seperti dd tetapi terus membaca meskipun mengalami kesalahan. Saya tidak pernah benar-benar menggunakan program ini, tetapi patut dipertimbangkan, terutama jika disk yang Anda salin sudah tua, yang dapat memiliki bad sector bahkan jika sistem tampak baik-baik saja.

Kyle Cronin
sumber
7
... dd sama sekali tidak memberikan indikasi kemajuan ... - yah ini tidak benar - ada cara yang agak rumit bagaimana menunjukkan kemajuan - Anda harus mencari tahu tentang proses dd ('ps -a | grep dd') dan kemudian kirim sinyal USR1 ke proses ini - 'kill -USR1 <dd_pid_here>' (tanpa <>) yang memaksa dd untuk menampilkan informasi kemajuan.
Michal Bernhard
4
"beberapa sektor pada disk yang tidak dapat dibaca": Saya pikir itu conv=sync,noerrorakan membantu.
Gauthier
2
The conv=sync,noerrorpilihan penting, mereka memungkinkan dd untuk melewati blok buruk dan nol mereka dalam gambar sehingga hal-hal yang sejajar dengan benar. Alat peraga untuk sangat sedikit orang yang berkomentar tentang itu.
Sam Watkins
1
GNU ddrescuemenyediakan indikator kemajuan tanpa opsi khusus, dan Anda dapat menghentikan penyalinan dan melanjutkan di mana Anda tinggalkan.
endolith
2
Cara yang kurang sulit untuk mendapatkan kemajuan dengan dd adalah dengan menambahkan opsistatus=progress
James
11

Jika drive sumber rusak sama sekali, Anda akan lebih beruntung menggunakan dd_rhelpdengan dd_rescue(preferensi pribadi saya) atau GNU ddrescue.

Alasan di balik ini adalah bahwa, pada kesalahan baca, ddterus mencoba dan mencoba dan mencoba - berpotensi menunggu waktu yang lama untuk terjadinya timeout. dd_rescuemelakukan hal-hal cerdas seperti membaca hingga kesalahan, kemudian memilih tempat lebih lanjut pada disk dan membaca mundur ke kesalahan terakhir, dan dd_rhelppada dasarnya adalah dd_rescuemanajer sesi - memulai dan melanjutkan dd_rescuemenjalankan dengan cerdik untuk membuatnya lebih cepat lagi.

Hasil akhir dd_rhelpadalah data maksimum yang dipulihkan dalam waktu minimum. Jika Anda tetap dd_rhelpberlari, pada akhirnya itu melakukan pekerjaan yang sama persis seperti ddpada waktu yang sama. Namun, jika ddmenemui kesalahan baca pada byte 100 dari disk 100Gb Anda, Anda harus menunggu lama untuk memulihkan yang lain 9.999.900 byte *, sedangkan dd_rhelp+ dd_rescueakan memulihkan sebagian besar data lebih cepat.

Ben Williams
sumber
1
Beberapa bantuan memilih antara dd_rescue dan ddrescue: askubuntu.com/a/211579/50450
Johann
7

Disk sumber tidak boleh memiliki sistem file yang terpasang. Sebagai pengguna yang dapat membaca perangkat blok (root works), jalankan 'dd if = / dev / sda ....'

Sekarang, salah satu hal yang rapi di sini adalah Anda membuat aliran byte ... dan Anda dapat melakukan banyak hal dengan itu: kompres, kirim melalui jaringan, potong menjadi gumpalan yang lebih kecil, dll.

Misalnya:

dd if=/dev/sda | ssh user@backupserver "cat > backup.img"

Tetapi yang lebih kuat:

dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"

Di atas menyalin gambar yang dikompresi dari hard drive sumber ke sistem jarak jauh, di mana ia menyimpannya dalam potongan 2G bernomor menggunakan nama host sumber sambil membuat Anda terus diperbarui.

Perhatikan bahwa tergantung pada ukuran disk, kecepatan cpu pada sumber, kecepatan cpu pada tujuan, kecepatan jaringan, dll. Anda mungkin ingin melewati kompresi, atau melakukan kompresi di sisi jarak jauh, atau mengaktifkan kompresi ssh.

retracile
sumber
+1 Memipip melalui gzip dapat menghemat banyak waktu dan bandwidth!
M. Dudley
Saya juga harus mencatat bahwa menambahkan 'bs = 1M' ke perintah dd biasanya akan sangat meningkatkan kecepatan.
retracile
6

Untuk mengkloning disk, yang perlu Anda lakukan adalah menentukan input dan output ke dd:

dd if=/dev/hdb of=hdb.img

Tentu saja, pastikan Anda memiliki izin yang tepat untuk membaca langsung dari /dev/hdb(saya sarankan menjalankan sebagai root), dan itu /dev/hdbtidak dipasang (Anda tidak ingin menyalin ketika disk sedang diubah). Setelah selesai, hdb.imgakan menjadi klon byte-untuk-byte dari seluruh disk.

Ada beberapa kelemahan untuk digunakan dduntuk mengkloning disk. Pertama, ddakan menyalin seluruh disk Anda, bahkan ruang kosong, dan jika dilakukan pada disk besar dapat menghasilkan file gambar yang sangat besar. Kedua, ddsama sekali tidak memberikan indikasi kemajuan, yang dapat membuat frustasi karena salinan membutuhkan waktu lama. Ketiga, jika Anda menyalin gambar ini ke drive lain (sekali lagi, menggunakan dd), mereka harus sama besar atau lebih besar dari disk asli, namun Anda tidak akan dapat menggunakan ruang tambahan yang mungkin Anda miliki di disk target hingga Anda ubah ukuran partisi Anda.

Anda juga dapat melakukan salinan disk-ke-disk langsung:

dd if=/dev/hdb of=/dev/hdc

tetapi Anda masih tunduk pada batasan di atas terkait ruang kosong.

Kelemahan pertama dapat diatasi dengan gzipping data saat Anda membuat salinan. Sebagai contoh:

dd if=/dev/hdb | gzip -9 > hdb.img.gz

Kekurangan kedua dapat diatasi dengan menggunakan alat pipeview ( pv). Sebagai contoh:

dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img

Saya tahu tidak ada cara untuk mengatasi kelemahan ketiga.

Selain itu, Anda dapat mempercepat waktu penyalinan dengan menyuruh ddbekerja dengan potongan data yang lebih besar. Sebagai contoh:

dd if=/dev/hdb of=hdb.img bs=1024
James Sumners
sumber
1
Anda sudah memberi tahu cara untuk mengatasi kelemahan ketiga ... mengubah ukuran partisi. Memperbesar partisi umumnya operasi yang aman dan cepat (versus menyusut atau bergerak, yang lambat dan lebih berbahaya karena memindahkan data).
davr
gzipping tidak akan berfungsi dengan disk yang telah digunakan selama beberapa waktu, karena akan diisi dengan data saat ini atau dihapus. gzip hanya akan berfungsi jika ruang kosong di-zeroed, yang hanya merupakan kasus dengan disk baru.
Tozz
3
@ Toozz: Anda dapat meningkatkan kompresibilitas gambar sistem file dengan mengisi sistem file dengan file yang berisi 0's, menyinkronkannya ke disk, lalu menghapusnya. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon (Modulo kecerdasan ekstra di lapisan filesystem.)
retracile
5

Hal baik lain yang dapat Anda lakukan dengan disk dd dan rescue adalah menyalin data melalui jaringan:

remote_machine$ nc -l -p 12345

local_machine$ dd if=/dev/sda | nc remote_machine 12345

Anda dapat menempelkan gzip di kedua jalur pipa ini jika jaringannya tidak lokal. Untuk kemajuan, gunakan pv. Untuk membuat netcat local_machine berhenti setelah selesai menyalin, Anda dapat menambahkan -w 5atau sesuatu.

pengguna5692
sumber
9
Ini tidak sepenuhnya benar. Perintah 'remote_machine' kehilangan sesuatu, seperti > disk_backup.imgatau |dd of=/dev/sdbatau sesuatu yang lain, tergantung pada apa yang ingin Anda lakukan. Saya kira Anda tidak ingin membuang disk image ke stdout.
davr
1
Dan masukkan gzip di kedua ujungnya untuk meminimalkan data yang dikirim.
bulan
4

Perlu diingat bahwa dd membuat salinan yang tepat , termasuk semua ruang kosong.

Itu berarti:

  1. Drive ke-2 harus setidaknya sebesar dulu
  2. Jika drive ke-2 lebih besar, ruang ekstra akan terbuang sia-sia (sistem file dapat memperluas pikiran Anda)
  3. Jika drive sumber tidak penuh, dd akan membuang banyak waktu menyalin ruang kosong.
  4. Anda dapat menyalin seluruh drive, atau satu partisi dengan cara ini.
  5. Jika ini adalah drive yang dapat di-boot, saya cukup yakin Anda harus menginstal bootloader setelah menggunakan dd

Semoga itu bermanfaat

Brent
sumber
8
Jika Anda mengkloning seluruh hard disk, Anda juga mengkloning boot loader.
Cristian Ciupitu
welll, hanya sebuah thouhgt, tetapi tidak bisakah kamu menggunakan gparted untuk mengubah ukuran partisi / disk yang disalin ke apa pun yang digunakan- lalu drop dd? Dengan asumsi itu adalah gambar sekali pakai itu harus mengurangi masalah ini.
bbqchickenrobot
3

Untuk referensi di masa mendatang, mungkin menarik untuk memeriksa ddrescue . Ini telah menyelamatkan hari saya beberapa kali.

Anders Hansson
sumber
3

Fitur agung lainnya adalah menyalin MBR, tabel partisi dan catatan boot.

Hanya

dd if=/dev/sda of=parttable bs=512 count=1

dan arah lain di sekitar saat Anda menulisnya. Polandia dengan fdisksetelah.

Anda merasa jauh lebih aman saat tabel partisi Anda dicadangkan.

Juga, itu membuat migrasi ke hard drive lain (sambil mengubah struktur partion) menjadi kesenangan.

alamar
sumber
3

Ini semacam peretasan murah, tapi ini cara cepat dan kotor untuk memantau proses DD Anda.

Jalankan perintah dd Anda. Buka shell baru dan lakukan ps awx untuk menemukan PID proses dd Anda. Sekarang di arloji jenis shell baru -n 10 kill -USR1 {pid dari proses DD Anda}

Ini tidak akan melakukan apa pun di jendela output arloji, tetapi kembali ke shell DD asli, DD akan mulai mengeluarkan laporan status setiap 10 detik. Anda dapat mengubah -n 10 dalam perintah arloji ke kerangka waktu lainnya tentu saja.

Tachyon


sumber
OS X tidak watchtersedia dan -USR1membunuh dd. Perintah berikut ini berfungsi: while [ true ]; do killall -INFO dd; sleep 30; done
Adam Franco
Saya tidak berpikir ini sangat praktis untuk seorang pemula, mereka mungkin lebih baik dilayani dengan pvperintah.
Robbie Mckennie
Saya menemukan bahwa Anda juga dapat mengirim SIGINFO menggunakan CTRL-T di dd. Ini lebih mudah daripada loop sementara dan OSX 10.6 cd yang saya miliki tidak memiliki killall. Pelajari ini dari en.wikipedia.org/wiki/Unix_signal#Sending_signals
Citizen Kepler
3
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

Ini akan menyalin disk, dan melewati blok dengan kesalahan, yang sangat penting.

Ini adalah opsi dasar dan esensial untuk menggunakan dd untuk mengkloning atau menyelamatkan disk.

Saya tidak ingin memposting jawaban lain, tetapi tidak ada jawaban yang baik dengan opsi "conv = sync, noerror" yang penting di antara 25 yang sudah diposting.

Sam Watkins
sumber
1
Sebenarnya hal itu disebutkan sebelumnya, dalam satu jawaban dan setidaknya dua komentar.
Michael Hampton
1
@Michael jawaban yang Anda tautkan tidak berisi perintah contoh lengkap, dan memiliki kesalahan lain - itu bukan ide yang baik untuk menggunakan ukuran blok besar dengan conv=sync,noerrorkarena akan melewati terlalu banyak data untuk setiap blok yang buruk. Opsi ini sangat penting untuk "kloning pemulihan", dan tidak ada gunanya mencari komentar untuk mereka. Jawaban yang paling populer adalah memadai jika disk tidak memiliki blok buruk, misalnya untuk kloning disk asli, tetapi tidak untuk pemulihan.
Sam Watkins
@Michael contoh yang saya berikan adalah perintah yang saya gunakan beberapa kali untuk pemulihan disk profesional. Meskipun ada alat lain yang mungkin melakukan pekerjaan yang sedikit lebih baik, contoh yang saya berikan lebih baik pada kloning pemulihan disk daripada setiap ddcontoh lain di sini, sementara juga cocok untuk mengkloning disk bebas kesalahan. Oleh karena itu, saya menganggap jawaban saya sebagai yang terbaik di sini tentang cara "menggunakan DD untuk kloning disk". Saya tidak menambahkan info tentang kemajuan pemantauan, kompresi, dll., Karena saya ingin membuatnya tetap sederhana, dan fokus pada memberikan jawaban singkat yang membuat dasar-dasarnya benar.
Sam Watkins
3

Anda sebenarnya dapat mencoba sesuatu seperti ini

dd if = / dev / sda2 dari = / dev / sdb2 bs = 4096 conv = sync, noerror

untuk melewati semua kesalahan dan memiliki klon partisi atau hard drive yang tepat

Sam Watkins
sumber
Itu harus conv = sync, noerror Opsi sinkronisasi diperlukan atau blok dengan kesalahan akan dihapus daripada disalin sebagai nol.
Sam Watkins
2

dd memang memberikan informasi kemajuan - sebagian besar versi di linux. Saya telah melihat beberapa yang tidak tetapi tidak ingat rasa unix.

Halaman manual mengatakan: Mengirim sinyal USR1 ke proses 'dd' yang sedang berjalan membuatnya mencetak statistik I / O ke kesalahan standar dan kemudian melanjutkan penyalinan.

Saya menggunakan fitur ini secara teratur.

Steven
sumber
Meskipun bermanfaat, saya meragukan kepraktisannya untuk pemula.
Robbie Mckennie
2

Seseorang harus mengatakan ini: cobalah Clonezilla (http: // clonezilla.org/)

Mendapatkan apa? Untuk menyalin hanya bagian sistem file yang digunakan. Clonezilla menggunakan dd, grub, sfdisk, parted, partimage, ntfsclone, dan / atau partclone. Tergantung pada opsi yang Anda pilih.

Dokumentasi yang layak dapat ditemukan di: http: // clonezilla.org/clonezilla-live/doc/


sumber
Saya menemukan dokumentasi sedikit kasar, dan kloning drive PATA linux ke drive SATA Tidak meninggalkan saya dengan sesuatu yang saya bisa boot (belum). Tetapi jauh lebih cepat untuk hasil yang sama dengan dd, dan itu bekerja sangat baik untuk peningkatan drive laptop saya.
jbdavid
2

Cara menyalin menggunakan dd (dalam hal ini ke mesin jarak jauh, tetapi prinsip yang sama berlaku untuk salinan lokal) yang menunjukkan kemajuan.

Ia bekerja dengan menyimpan pid melalui file deskriptor 3 di / tmp / pid, yang kemudian digunakan untuk membunuh selanjutnya dengan sinyal USR1. Kerutan adalah untuk memfilter output dari kemajuan pada stderr ke hanya satu baris melalui penyaringan stderr melalui subkulit.

(dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | gzip --fast | ssh $DEST "gzip -d | dd bs=1M of=$lv" &
# Need this sleep to give the above time to run
sleep 1
PID=$(</tmp/pid)

while kill -0 $PID; do
  kill -USR1 $PID
  sleep 5
done
Edward Groenendaal
sumber
Tidak benar-benar relevan dengan pertanyaan, tetapi ini adalah trik shell yang rapi menggunakan sub-shell dan deskriptor file yang tinggi (lebih tinggi dari stderr) untuk menyampaikan data darinya, +1
falstro
Saya merujuk ke halaman ini sendiri untuk opsi dd yang berbeda ketika mengkloning disk, jadi sepertinya tempat yang cocok pada saat itu untuk meletakkan hasil akhir dari apa yang saya gunakan untuk kloning, terutama karena saya pikir itu agak rapi sendiri :)
Edward Groenendaal
2

Info yang paling banyak dijelaskan dalam penerima yang dimasukkan sebelumnya, tetapi tidak semua dijelaskan.

Di linux Anda dapat mengkloning hard drive atau partisi dengan perintah dd. Perhatian, ketika Anda akan membuat kesalahan, Anda akan kehilangan semua data Anda.

Pada awalnya, tujuan tidak boleh digunakan, sumber kedua tidak boleh digunakan, atau dipasang kembali ke mode hanya baca. Kalau tidak, salinan akan rusak. Jika remounting tidak memungkinkan, silakan buat drive yang dapat di-boot (hdd / ssd / flashdisk) distro langsung linux apa pun. Saya lebih dulu knoppix, tapi ini pilihan Anda. Jika memungkinkan, Anda dapat mem-boot atau mengubah level sistem menjadi 1, untuk mode pengguna tunggal, atau Anda dapat langsung reboot sistem ke mode pengguna tunggal, tergantung distro. Jika Anda hanya akan mengkloning satu partisi, partisi ini harus dilepas atau dipasang kembali ke RO:

umount /mountpoint_or_device

atau

remount -o,ro /mountpoint_or_device

Jika Anda ingin mengkloning seluruh hard drive, Anda harus umount atau me-remount semua partisi.

Anda harus mengidentifikasi perangkat sumber dan tujuan. silakan lihat dmesg, di sini tersimpan semua informasi yang diperlukan tentang perangkat, dengan vendor dll. Mengidentifikasi alternatif dapat didasarkan pada ukuran perangkat, jika berbeda. Selanjutnya, tujuan harus sama atau lebih besar dari sumber. Anda harus menghitung sumber, misalnya: fdisk -l / dev / sda kecuali geometri partisi (bisa ada GPT), Anda akan mengambil: 1. total ukuran disk wigh GB dan byte 2. geometri historis dan jumlah sektor total, info yang sangat penting 3. ukuran blok dalam byte, biasanya 512.

sebagai contoh:

# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f1d1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    40136703    20067328   83  Linux
/dev/sda2        40138750    41940991      901121    5  Extended
/dev/sda5        40138752    41940991      901120   82  Linux swap /     Solaris

selanjutnya mari kita coba lebih besar dari 512 pembagi, kita memiliki 41943040 sektor fisik:

41943040/256 = 163840, sangat bagus, kita bisa melakukan salinan massal 256 sektor. Bisakah kita lebih? mari kita coba: 41943040/1024 = 40960, saya pikir ini sudah cukup, kita akan pilih yang ini. Mari kita hitung ukuran grup sektor: 512 (ukuran sektor) * 1024 = 524288 bytes eq 512K. Kemudian kita dapat menggunakan parameter bs = 512K atau kurang, tetapi bagi dengan 2 ^ x. Untuk hard drive modern dengan cache internal yang besar, ini cukup praktis. untuk drive yang lebih lama dengan cache yang jauh lebih kecil, nilai 32K atau kurang sudah cukup.

Kemudian setelah persiapan kita dapat melakukan salinan: dd jika = / dev / source_devide dari = / dev / destination_device bs = 32K dan salin akan dilakukan. Perhatikan, kesalahan apa pun akan menimpa data impor dan Anda. Di tempat tujuan semua akan ditimpa.

Jika Anda mencoba menyelamatkan data pada disk sumber yang rusak, lebih baik gunakan ukuran sektor asli, biasanya ini adalah 512 byte, dan tambahkan opsi conv = notrunc. jika tidak, lubang sumber yang dijatuhkan oleh sektor buruk akan bergabung dengan pergeseran sektor pada tujuan. Ini akan merusak salinan dengan sedikit peluang untuk diperbaiki. maka perintahnya adalah:

dd if=/dev/source of=/dev/destination bs=512 conv=notrunc  

, dan tunggu lama ketika drive dan sistem akan menyerah dan akan berjalan sektor demi sektor sampai akhir.

dd adalah alat yang berguna untuk memindahkan partisi ke tempat baru. Cukup buat partisi, buat dd ke partisi baru (ini bisa lebih besar, jauh lebih besar), dan jika mungkin, perluas sistem file yang disalin untuk mengisi semua partisi baru, ext3 / ext4 / xfs / zfs / zfs / btrfs memiliki fasilitas ini. Akhirnya Anda harus mengubah / etc / fstab, lalu umount / mount jika memungkinkan, atau reboot sistem.

Tentu saja Anda dapat mengkloning semua jenis partisi. perintah dd tidak melihat ke dalam tipe sistem file, itu tidak melakukan apa-apa dengan strukturnya. maka perintah ini dapat digunakan untuk kloning NTFS atau tipe partisi lainnya.

Ada trik apa saja. Ketika Anda tidak mengatur parameter, maka dd akan memasukkan output ke stdout. maka Anda dapat membuat salinan mentah disk atau partisi terkompresi, misalnya:

dd if=/dev/sda bs=512 | gzip >/any/place/computerOne_sda.gz

Tentu saja ini harus dilakukan secara offline. Anda dapat memulihkan ini dengan:

zcat /any/place/computerOne_sda.gz| dd of=/dev/sda bs=512   

, maka semua hard drive sda ​​akan ditimpa oleh cadangan ini, dan semua data saat ini akan hilang. Anda dapat melakukan ini juga dengan partisi windows NTFS dan hard drive yang digunakan oleh ini. Tentu saja Anda dapat menggunakan perintah kompresi lain, tergantung pilihan Anda.

Znik
sumber
1

Anda dapat membuat file gambar terkompresi dari partisi (atau disk) dengan cepat menggunakan bzip2atau gzipbukan dd. Ini bagus untuk menyimpan gambar di media yang bisa dipindahkan:

bzip2 -c /dev/sdaX >imagefile.bz2
or
gzip -c /dev/sdaX >imagefile.gz

Jika disk telah banyak digunakan sebelumnya, Anda dapat meningkatkan kompresi dengan mengisi semua ruang yang tidak digunakan dengan nol sebelum pencitraan:

mkdir /mnt/mymountpoint
mount /dev/sdaX /mnt/mymountpoint
cat /dev/zero >/mnt/mymountpoint/dummyfile.bin
(Wait for it to end with a "disk full" error)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt/mymountpoint

Untuk mengembalikan gambar ke disk lain, yang harus Anda lakukan adalah:

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY
JCCyC
sumber
Terpilih untuk trik mengisi ruang yang tersisa dengan nol. Pintar!
Kebingungan
Ini, saya butuh ini! Kartu SD sebelumnya digunakan untuk pengambilan video dan penuh dengan omong kosong, kompresi tidak membantu sama sekali.
Cody Smith
0

Untuk beberapa alasan, dd gagal saat menggambar CD dengan trek audio. Anda perlu menggunakan cdrdao atau yang serupa untuk mendapatkan file gambar + TOC.

Mat
sumber
0

Catatan tentang kecepatan: dalam pengalaman saya, dd dua kali lebih cepat jika Anda menentukan bs = 1024, bukan standar bs = 512. Menggunakan ukuran blok yang lebih besar tidak memberikan peningkatan yang nyata atas bs = 1024.


sumber
4
disk cluster umumnya sekitar 4k sekarang, jadi menggunakan 4096 mungkin merupakan pilihan yang baik, dan bahkan 8192 jika Anda ingin membaca 2 cluster sekaligus. Jangan pergi terlalu besar, karena Anda mengalami masalah memori yang terfragmentasi
user4767
0

Satu hal yang harus Anda perhatikan ketika menemukan disk penuh adalah bahwa hal itu akan menimpa catatan boot master dari disk penerima. Ini berisi tabel partisi dan informasi penting lainnya. Jika disk baru tidak sama dengan disk lama, ini dapat membuat semua jenis tabel. Menyalin partisi umumnya lebih aman (dan menukar partisi tidak harus disalin)

Paul de Vrieze
sumber
0

Saya sudah keluar dari peran admin selama bertahun-tahun sekarang, tetapi saya tahu bahwa 'dd' tergantung pada pekerjaan. Saya menggunakan teknik ini secara teratur di akhir 80-an di Sun Sparc dan 386i komputer. Saya memiliki satu pesanan klien lebih dari 30 sistem 386i yang menjalankan perangkat lunak CAD yang didistribusikan pada beberapa kaset QIC.

Kami menginstal pada komputer pertama, mengkonfigurasi aplikasi, menjalankan SunOS 'sys-unconfig, menempatkan drive di kotak sepatu dengan alamat SCSI yang berbeda dan kemudian melanjutkan ke' dd 'ke 30 drive lainnya.

pbrooks100
sumber
0

Seperti orang lain telah disebutkan di atas, salah satu gotchas dengan kloning sistem file yang dipasang adalah potensi korupsi data. Ini jelas tidak akan berlaku untuk klon drive penuh, tetapi jika Anda menggunakan LVM Anda dapat Snapshot LogicalVolume dan dd dari snapshot untuk mendapatkan gambar yang konsisten.

Ophidian
sumber
0

Hanya peringatan untuk pemula yang perlu dikatakan: Setidaknya dengan beberapa Versi, bs = X berarti bahwa memori dengan ukuran X secara harfiah akan dialokasikan. bs = 2GB pada sistem dengan 1GB RAM dan tidak cukup swap AKAN menyebabkan hal-hal buruk terjadi.

pemeras
sumber