Pertanyaan Menggunakan DD untuk kloning disk


Sudah ada sejumlah pertanyaan tentang alat cloning disk dan dd telah disarankan setidaknya sekali. Saya sudah mempertimbangkan untuk menggunakannya dd sendiri, terutama karena kemudahan penggunaan, dan itu sudah tersedia di hampir semua distribusi Linux bootable.

Apa cara terbaik untuk digunakan dd untuk mengkloning disk? Saya melakukan pencarian Google dengan cepat, dan hasil pertama tampak nyata usaha gagal. Apakah ada yang perlu saya lakukan setelah menggunakan dd, yaitu apakah ada sesuatu yang TIDAK BISA dibaca menggunakan dd?


176
2018-05-05 18:21




Saya menyadari bagaimana dd bekerja, pertanyaan saya lebih mengarah ke masalah yang diketahui terkait dengan dd ketika mengkloning disk (seperti yang dijelaskan oleh tautan), mungkin ini tidak terlalu jelas. Apa yang dia isi dan milik Anda tidak adalah "Saya tidak pernah sekalipun punya masalah dengan itu". Saya juga memberikan jawaban Anda, karena Anda benar-benar menyajikan beberapa poin yang menarik (saya suka yang tidak ada indikasi kemajuan). - falstro
Sepertinya Anda mendapat Spolsky Bump: 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
Sungguh ironis bahwa Joel terkait dengan pertanyaan itu sebagai contoh bagus dari kesalahan server, meskipun tidak ada jawaban yang bagus. Tidak ada satu jawaban di antara 25 (tidak termasuk komentar) dengan hak dd pilihan untuk melewati 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 dd mengembalikan mungkin "gagal" jika berbicara tentang drive sistem file tergantung geometri dan mengembalikan dilakukan pada hard drive yang tidak identik? Saya mengalami beberapa kegagalan pada pemulihan dd, dan saya pikir ini adalah masalah dalam kasus saya. - Marco


Jawaban:


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

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

Sadarilah bahwa sementara kloning setiap byte, Anda tidak harus menggunakan ini pada drive atau partisi yang sedang digunakan. Terutama aplikasi seperti database tidak dapat mengatasi ini dengan sangat baik dan Anda mungkin akan berakhir dengan data yang rusak.


152
2018-05-05 18:31



Tentu saja, selama / dev / sdb setidaknya sebesar / dev / sda ... - Eddie
tambahkan "bs = 100M conv = notrunc" dan itu jauh lebih cepat dalam pengalaman saya. - Tim Williscroft
berhati-hati dengan huruf 'i' dan 'o' ... - bandi
Sepertinya tidak ada yang tahu trik ini ... dd adalah program penyalinan asimetris, yang berarti akan membaca lebih dulu, lalu menulis, lalu kembali. Anda dapat menyambungkan dd ke dirinya sendiri dan memaksanya melakukan salin 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 / dtk. Saya tidak pernah mengalami masalah dengan metode ini. Semoga berhasil! - Mistiry
@Mistiry, itu bukan arti kata simetris. - psusi


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, defragmen drive / partisi yang Anda ingin mengkloning sebelumnya (jika perlu), kemudian kosongkan semua ruang yang tidak terpakai yang tersisa, sehingga lebih mudah untuk mengkompres gzip:

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", kemudian:

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

Juga, Anda bisa mendapatkan proses dd yang berjalan 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 OSX dan BSD dd berbeda dalam sinyal yang diterima (menggunakan OSX) SIGINFO - Anda dapat menekan Ctrl+T untuk melaporkan status).


104
2018-05-06 22:47



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


PERINGATAN: dd'ing filesystem langsung dapat merusak file. Alasannya sederhana, ia tidak memiliki pemahaman tentang aktivitas filesystem yang mungkin terjadi, dan tidak berusaha untuk menguranginya. Jika suatu tulisan sedang berlangsung, Anda akan mendapat sebagian catatan. Ini biasanya tidak baik untuk hal-hal, dan umumnya fatal untuk database. Apalagi jika Anda mengacaukan typo-rawan jika dan dari parameter, celakalah bagimu. Umumnya, rsync adalah alat yang sama-sama efektif yang ditulis setelah munculnya multitasking, dan akan memberikan pandangan yang konsisten dari file individu.

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


37
2018-05-05 20:20



Saya menduga itu sync bukan jawaban untuk mengajukan masalah korupsi. Apa yang terjadi jika deamon atau sesuatu menulis lebih banyak file setelah sync, selama dd operasi? - Deleted
Ini adalah ide yang baik untuk umount drive pertama (atau remount sebagai read-only) tetapi itu tidak selalu mungkin - Alex Bolotov
Dalam hal ini, Anda menggunakan rsync dan membiarkannya menangani file ajaib untuk mendapatkan file yang konsisten dan membiarkan Copy On Write semantik menangani penulisan yang masuk. - jldugger
Saya ingin menambahkan bahwa menjalankan dd pada sistem file yang di-mount TIDAK AKAN MENGRRONGKAN file pada sistem berkas yang di-mount, tetapi yang dimaksud di sini adalah bahwa salinan filesystem akan selalu dalam keadaan baik yang diketahui. - 3molo
Menggunakan rsync akan memastikan bahwa data internal dalam sistem file tujuan konsisten. Saya t 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


Ketika menggunakan dd untuk mengkloning disk yang mungkin berisi bad sector, gunakan "conv = noerror, sync" untuk memastikan bahwa tidak berhenti ketika menemukan kesalahan, dan mengisi di sektor yang hilang dengan byte null. Ini biasanya langkah pertama yang saya ambil jika mencoba memulihkan dari kandar yang gagal atau gagal - dapatkan salinannya sebelum melakukan upaya pemulihan, dan kemudian lakukan pemulihan pada disk baik (kloning). Saya serahkan ke alat pemulihan untuk mengatasi setiap 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 apa yang bekerja paling cepat untuk Anda. (Ini mengasumsikan bahwa Anda tidak perlu menggunakan ukuran blok tertentu karena alasan lain, misalnya jika Anda menulis ke kaset.)


26
2018-05-07 02:42



Jika Anda memiliki disk dengan bad sector, Anda benar-benar harus menggunakan 'ddrescue' daripada dd. Ini jauh lebih efisien, dan memiliki peluang lebih baik untuk memulihkan lebih banyak data. (Jangan bingung dengan dd_rescue, yang tidak sebaik) - davr
sebaiknya tidak menggunakan ukuran blok besar jika mencoba melewati blok buruk, atau akan melewati terlalu banyak. 4096 cukup besar. - Sam Watkins


Untuk mengkloning disk, yang perlu Anda lakukan hanyalah 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 itu / dev / hdb tidak dipasang (Anda tidak ingin menyalin sementara disk sedang diubah - pemasangan sebagai read-only 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 frustrasi karena salinannya membutuhkan waktu yang lama. Ketiga, jika Anda menyalin gambar ini ke drive lain (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 pada disk target sampai Anda mengubah 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 mengenai ruang kosong.

Sejauh masalah atau gotchas pergi, dd, untuk sebagian besar, melakukan pekerjaan yang sangat baik. Namun, beberapa waktu 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 benar-benar mati. Itu kemudian belajar bahwa dd tidak menangani kesalahan baca dengan sangat baik - ada beberapa sektor pada disk yang dd tidak bisa membaca, menyebabkan dd menyerah dan menghentikan salinannya. Pada saat itu saya tidak dapat menemukan cara untuk memberitahukan dd untuk melanjutkan meskipun mengalami kesalahan baca (meskipun itu muncul seolah-olah itu memiliki pengaturan itu), jadi saya menghabiskan sedikit waktu secara manual menentukan lewati dan berusaha melompati bagian yang tidak terbaca.

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


17
2018-05-05 18:26



... dd sama sekali tidak memberikan indikasi kemajuan ... - baik ini tidak benar - ada cara yang agak rumit bagaimana menunjukkan kemajuan - Anda harus mengetahui pid proses dd ('ps -a | grep dd') dan kemudian mengirim sinyal USR1 ke proses ini - 'kill -USR1 < dd_pid_here> '(tanpa <>) yang memaksa dd untuk menampilkan informasi kemajuan. - Michal Bernhard
"beberapa sektor pada disk yang dd tidak bisa membaca": Saya pikir itu conv=sync,noerror akan membantu. - Gauthier
Itu conv=sync,noerror pilihan sangat penting, mereka memungkinkan dd untuk melewati blok buruk dan membidiknya dalam gambar sehingga semuanya selaras dengan benar. Props untuk sangat sedikit orang yang berkomentar tentang hal itu. - Sam Watkins
GNU ddrescue memberikan indikator kemajuan tanpa opsi khusus apa pun, dan Anda dapat menghentikan penyalinan dan melanjutkan kembali di tempat terakhir yang Anda tinggalkan. - endolith
Cara yang kurang rumit untuk mendapatkan kemajuan dengan dd adalah dengan menambahkan opsi status=progress - James


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

Alasan di balik ini adalah itu, pada kesalahan baca, dd terus mencoba dan mencoba dan mencoba - berpotensi menunggu waktu yang lama untuk waktu habis. dd_rescue melakukan hal-hal cerdas seperti membaca hingga kesalahan, lalu memilih tempat lebih jauh di disk dan membaca mundur ke kesalahan terakhir, dan dd_rhelp pada dasarnya adalah a dd_rescuemanajer sesi - dengan cerdik memulai dan melanjutkan dd_rescue berjalan untuk membuatnya lebih cepat lagi.

Hasil akhir dari dd_rhelp adalah data maksimum yang dipulihkan dalam waktu minimum. Jika kamu pergi dd_rhelp berjalan, pada akhirnya itu melakukan pekerjaan yang sama persis seperti dd dalam waktu yang bersamaan. Namun, jika dd mengalami kesalahan baca pada byte 100 dari disk 100GB Anda, Anda harus menunggu waktu yang lama untuk memulihkan 9.999.900 byte * lainnya, sedangkan dd_rhelp+dd_rescue akan memulihkan sebagian besar data lebih cepat.


11
2018-05-31 02:12



Beberapa membantu memilih antara dd_rescue dan ddrescue: askubuntu.com/a/211579/50450 - Johann


Disk sumber tidak boleh memiliki sistem berkas yang di-mount. Sebagai pengguna yang dapat membaca perangkat blok (karya root), 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.

Contohnya:

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"

Gambar di atas menyalin gambar yang dikompresi dari harddisk sumber ke sistem remote, di mana ia menyimpannya dalam potongan 2G nomor menggunakan nama host sumber sambil membuat Anda diperbarui pada kemajuan.

Perhatikan bahwa tergantung pada ukuran disk, kecepatan cpu pada sumber, kecepatan cpu pada tujuan, kecepatan jaringan, dll. Anda mungkin ingin melewatkan kompresi, atau melakukan kompresi pada sisi remote, atau mengaktifkan kompresi ssh.


7
2018-05-29 19:23



Pemberian +1 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