Soru Disk klonlaması için DD'yi kullanma


Disk klonlama araçları ile ilgili birçok soru var ve dd En az bir kez önerilmiştir. Kullanmayı çoktan düşündüm dd kendim, özellikle kullanım kolaylığı nedeniyle ve hemen hemen tüm önyüklenebilir Linux dağıtımlarında kullanılabilir.

Kullanmanın en iyi yolu nedir? dd diski klonlamak için? Hızlı bir Google araması yaptım ve ilk sonuç belirgindi başarısız deneme. Kullandıktan sonra yapmam gereken bir şey var mı ddyani, kullanılamayan bir şey var mı? dd?


176
2018-05-05 18:21


Menşei


Dd'nin nasıl çalıştığının bilincindeyim, sorularım klonlama diskleri (link tarafından tarif edildiği gibi) dd ile ilgili bilinen herhangi bir sorun doğrultusunda daha açıktı, belki bu çok açık değildi. Cevabının içerdiği ve seninki, "Onunla hiçbir zaman bir problemim olmadı". Cevabınızı da dile getirdim, çünkü bazı ilginç noktaları da sunduğunuzdan (ilerleme belirtisi hakkında olanlardan hoşlanıyorum). - falstro
Spolsky Bump'a sahipsin gibi görünüyor: joelonsoftware.com/items/2009/05/29.html - Kyle Cronin
Ben süper kullanıcı hakkında benzer bir soru sorduğumda (ve cevapladı) burada görmedim - superuser.com/questions/11453/... - warren
Cevapların hiçbiri iyi olmamasına rağmen Joel'in sunucu-fayının güzel bir örneği olarak bu soruyla bağlantılı olması ironiktir. 25'inde (yorum hariç) tek bir cevap yoktu. dd Kötü blokları atlamak için seçenekler - kurtarma için diskleri klonlarken çok önemlidir. Kötü bloklara sahip diskleri klonlayabilecek daha iyi bir yanıt ekledim: dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror - Sam Watkins
Sürüş geometrisi bağımlı dosya sistemleri hakkında konuşmak ve geri yükleme aynı olmayan sabit disklerde yapılırsa dd geri yükleme "başarısız" olabilir düşünüyorum? Dd geri yüklemesinde bazı hatalar yaşadım ve bence bu durum benim sorunumdu. - Marco


Cevaplar:


dd kesinlikle en iyi klonlama aracıdır, aşağıdaki komutu kullanarak% 100 çoğaltma yaratacaktır. Onunla hiçbir zaman bir problemim olmadı.

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

Her bayt klonlarken bunu, kullanılmakta olan bir sürücüde veya bölmede kullanmamanız gerektiğine dikkat edin. Özellikle veritabanları gibi uygulamalar bununla çok iyi başa çıkamazlar ve bozuk verilerle sonuçlanabilir.


152
2018-05-05 18:31



Elbette, / dev / sdb en az / dev / sda kadar büyük olduğu sürece ... - Eddie
Bir "bs = 100M conv = notrunc" ekleyin ve bu benim deneyimimde çok daha hızlı. - Tim Williscroft
sadece 'i' ve 'o' harfleriyle çok dikkatli ol ... - bandi
Kimse bu hileyi bilmiyor gibi görünüyor ... dd asimetrik bir kopyalama programıdır, ilk önce okuyacaktır, sonra yazacak, sonra geri dönecektir. Dd'yi kendisine pipetleyebilir ve kopyayı simetrik olarak gerçekleştirmeye zorlayabilirsiniz. dd if=/dev/sda | dd of=/dev/sdb. Testlerimde, komutun boru olmadan çalıştırılması bana ~ 112kb / s'lik bir verim verdi. Boru ile ~ 235kb / s var. Bu yöntemle herhangi bir sorun yaşamadım. İyi şanslar! - Mistiry
@Mistiry, bu simetrik kelimesinin anlamı değil. - psusi


Yer kazanmak için, ggip ile dd tarafından üretilen verileri sıkıştırabilirsiniz, ör .:

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

Diskinizi şu şekilde geri yükleyebilirsiniz:

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

Daha fazla yer kazanmak için önceden klonlamak istediğiniz sürücü / bölümü birleştirin (uygunsa), ardından kalan tüm boş alanı sıfırlayın ve gzip'in sıkıştırılmasını daha kolay hale getirin:

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

Biraz bekle, dd sonunda bir "disk dolu" mesajı ile başarısız olacak, o zaman:

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

Ayrıca, durumu bildirmek için arka planda çalışan bir dd işlemini kill komutuna sahip bir sinyal göndererek alabilirsiniz.

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

Sisteminizi kontrol edin - yukarıdaki komut Linux, OSX ve BSD dd komutları için kabul ettikleri sinyallerden farklıdır (OSX kullanır SIGINFO - basabilirsiniz Ctrl+T durumu bildirmek için).


104
2018-05-06 22:47



Bu, aynı zamanda "modern" lerle de, böyle bir BTRFS, NILFS, [hayal edebileceğiniz her şey] ile çalışır mı? - Steve Schnepp
DD blok cihazlarda çalışır, dosya sisteminden daha düşük bir soyutlama seviyesidir, bu yüzden, evet. Yine de denemedim. Hmm, NILFS ilginç görünüyor, ona bir bakmalıyım. - David Hicks
İçin +1 kill -SIGUSR1 %1ve OSX dd komutu mutlu bir şekilde SIGUSR1'i kabul ediyor ... süper kullanışlı, teşekkürler! - stuartc
İçin +1 Kill -SIGUSR1 1234 Onu arıyordum. - hot2use
Olmalı mı: dd if=/dev/hdb | gzip -c > /image.img.gz ? - Mike Causer


DİKKAT: Canlı bir dosya sistemi dd'leri dosyaları bozabilir. Nedeni basit, devam edebilecek dosya sistemi etkinliğini bilmez ve azaltmaya yönelik hiçbir girişimde bulunmaz. Bir yazı kısmen devam ediyorsa, kısmi bir yazı alırsınız. Bu genellikle şeyler için iyi değildir ve genellikle veritabanları için öldürücüdür. Üstelik, eğer baskıya eğilimli olursanız Eğer ve arasında parametreler, size karşı. Çoğu durumda, rsync gelişinden sonra yazılmış eşit derecede etkili bir araçtır çoklu görevve tek tek dosyaların tutarlı görünümlerini sağlayacaktır.

Bununla birlikte, DD, bağlanmamış bir sürücünün bit durumunu doğru olarak yakalamalıdır. Önyükleyiciler, llvm birimleri, bölüm UUID'ler ve etiketler, vb. Sadece hedef sürücü bitini bit için yansıtabilen bir sürücünüz olduğundan emin olun.


37
2018-05-05 20:20



ondan şüphelendim sync yolsuzluk sorunları dosya yanıtı değil. Bir deamon veya başka bir şey daha sonra daha fazla dosya yazarsa ne olur? sync, esnasında dd operasyon? - Deleted
İlk önce sürücüyü tekrar takmak iyi bir fikirdir (veya salt okunur olarak yeniden monte edilir) ancak her zaman mümkün değildir. - Alex Bolotov
Bu durumda, rsync'i kullanır ve tutarlı bir dosya elde etmek için dosya tanıtıcı sihrini kullanırsınız ve Copy On Write semantiklerinin gelen yazıları işlemesine izin verirsiniz. - jldugger
Dd'yi çalıştırılan bir dosya sisteminde çalıştıran dd'yi eklemek istiyorum. Monte edilen dosya sistemindeki dosyaları DÜZELTMEYECEKTİR, fakat burada kastedilen, dosya sisteminin kopyasının mutlaka bilinen bir iyi durumda olması. - 3molo
kullanma rsync emin olacak iç veri Hedef dosya sisteminde tutarlı. O olmayacak Dosyalardaki verilerin tutarlı olduğundan emin olun - bunu yapmak için dosyaları kilitlemeniz gerekir ve dosyalara yazılan programların bu kilitlere uyması gerekir. - Martin Geisler


Bozuk kesimleri içerebilen bir diski kopyalamak için dd kullanırken, bir hatayla karşılaşıldığında durmadığından emin olmak için "conv = noerror, sync" komutunu kullanın ve eksik sektör (ler) i boş baytlarla doldurur. Bu genellikle başarısız veya başarısız bir diskten kurtarmaya çalışıyorsanız aldığım ilk adımdır - herhangi bir kurtarma denemesi yapmadan önce bir kopyasını alın ve sonra iyi (klonlanmış) diskte kurtarma yapın. Kopyalanamayan boş sektörlerle başa çıkmak için kurtarma aracına bırakıyorum.

Ayrıca, dd'nin hızının bs (blok boyutu) ayarından etkilenebileceğini görebilirsiniz. Genellikle bs = 32768'i denerim, fakat sizin için en hızlı olanı görmek için kendi sisteminizde test etmek isteyebilirsiniz. (Bu, başka bir nedenden dolayı belirli bir blok boyutunu kullanmanız gerekmediğini varsayar, örneğin bir kasete yazıyorsanız).


26
2018-05-07 02:42



Bozuk kesimleri olan bir diskiniz varsa, gerçekten dd yerine 'ddrescue' kullanmalısınız. Çok daha verimli ve daha fazla veriyi kurtarmanın daha iyi bir şansı var. (Dd_rescue ile karıştırmayın, ki bu iyi değil) - davr
Kötü blokları atlamak için büyük bir blok boyutu kullanmamalı veya çok fazla atlayacaktır. 4096 yeterince büyük. - Sam Watkins


Bir diski kopyalamak için yapmanız gereken tek şey giriş ve çıkışı dd olarak belirtmektir:

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

Elbette, doğrudan / dev / hdb'den okumak için uygun izinlere sahip olduğunuzdan emin olun (root olarak çalıştırmanızı öneririm) ve / dev / hdb monte edilmedi (disk değiştirilirken kopyalamak istemezsiniz - salt okunur olarak montaj da kabul edilebilir). Tamamlandığında, image.img tüm diskin byte-by-byte klonu olacaktır.

Diskleri klonlamak için dd kullanmanın bazı dezavantajları vardır. Öncelikle, dd tüm diskinizi, hatta boş alanı bile kopyalayacaktır ve eğer büyük bir disk üzerinde yapılırsa son derece büyük bir görüntü dosyasına neden olabilir. İkincisi, dd, kopya uzun zaman aldığı için sinir bozucu olabilecek hiçbir ilerleme göstergesi içermemektedir. Üçüncü olarak, bu görüntüyü diğer sürücülere (yine dd kullanarak) kopyalarsanız, orijinal diskten daha büyük veya büyük olmalıdır, ancak siz hedef diskin üzerindeki herhangi bir ek alanı kullanamazsınız. bölümlerinizi yeniden boyutlandırın.

Doğrudan diskten diske kopyalama da yapabilirsiniz:

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

ama hala boş alan ile ilgili yukarıdaki sınırlamalara tabidir.

Sorunlar ya da gotchas kadarıyla, dd, çoğunlukla, mükemmel bir iş yapar. Ancak, bir süre önce ölmek üzere olan bir sabit diskim vardı, bu yüzden dd'yi tamamen ölmeden önce hangi bilgileri çıkarabildiğimi kopyalamak için kullandım. Daha sonra dd'nin okuma hatalarını çok iyi çözmediği öğrenildi - diskte dd okuyamayan çeşitli bölümler vardı, bu da dd'nin kopyayı bırakıp durdurmasına neden oldu. O zaman bir okuma hatasıyla karşılaşmasına rağmen dd’ye devam etmenin bir yolunu bulamadım. görünüyor ki sanki bu ayarı varmış gibi), bu yüzden elle atlamayı ve okunamayan bölümleri atlamak için arama yapmayı biraz zaman harcadım.

Bu soruna çözüm bulma konusunda biraz zaman harcadım (görevi tamamladıktan sonra) ve bir program buldum. ddrescuesiteye göre dd gibi çalışır, ancak bir hatayla karşılaşsa bile okumaya devam eder. Programı gerçekten kullanmamıştım, özellikle de kopyalamakta olduğunuz disk eskiyse, sistem iyi görünse bile bozuk kesimlere sahip olabilirse, dikkate değer.


17
2018-05-05 18:26



... dd kesinlikle hiçbir ilerleme göstergesi sunmuyor ... - bu doğru değil - ilerlemenin nasıl gösterileceğine dair biraz yol var - dd sürecinin pidini bulmak zorundasınız ('ps-a | grep dd') ve daha sonra USR1'e bu işleme yollayın - 'kill -USR1 < dd_pid_here> '(<> olmadan), dd'nin ilerleme bilgilerini göstermesi için zorlar. - Michal Bernhard
"dd okuyamayan diskte birkaç sektör": Bence conv=sync,noerror yardımcı olurdu. - Gauthier
conv=sync,noerror seçenekler önemlidir, dd'nin kötü blokları atlamasına izin verir ve görüntüyü düzgün bir şekilde hizalamak için görüntüde sıfırlar. Bu konuda bir şey söyleyen çok az insan için sahne. - Sam Watkins
GNU ddrescue herhangi bir özel seçenek olmaksızın ilerleme göstergesi sağlar ve kopyasını durdurabilir ve bıraktığınız yerden devam edebilirsiniz. - endolith
Dd ile ilerlemenin daha az zor bir yolu seçeneği eklemektir status=progress - James


Kaynak sürücü hiç zarar görürse, daha fazla şansınız olur dd_rhelp ile dd_rescue (kişisel tercihim) veya GNU ddrescue.

Bunun arkasındaki sebep şudur: okuma hatalarında, dd denemeye ve denemeye ve denemeye devam ediyor - zamanaşımlarının oluşması için uzun bir süre bekliyor. dd_rescue bir hatayı okumak gibi akıllıca şeyler yapar, daha sonra diskin üzerinde bir nokta daha seçer ve son hatayı geriye doğru okur, ve dd_rhelp temelde bir dd_rescueoturum yöneticisi - akıllıca başlıyor ve devam ediyor dd_rescue tekrar daha hızlı yapmak için çalışır.

Son sonucu dd_rhelp Minimum süre içinde toplanan maksimum veri. Eğer gidersen dd_rhelp koşarak, sonunda tam olarak aynı işi yapar dd aynı zamanda. Ancak eğer dd 100Gb diskinizin bayt 100'deki okuma hatalarıyla karşılaştı, diğer 9,999,900 baytlık * kurtarmak için uzun bir süre beklemeniz gerekir. dd_rhelp+dd_rescue veri yığınını çok daha hızlı toparlayacaktı.


11
2018-05-31 02:12



Bazıları dd_rescue ve ddrescue arasında seçim yapmanıza yardımcı olur: askubuntu.com/a/211579/50450 - Johann


Kaynak diskte herhangi bir dosya sistemi bulunmamalıdır. Bir kullanıcı blok aracını okuyabildiği gibi (root works), 'dd if = / dev / sda ....' komutunu çalıştırın.

Şimdi, buradaki düzgün şeylerden biri, bir bayt akışı yaratıyor olmanızdır ... ve bununla çok şey yapabilirsiniz: sıkıştırın, ağ üzerinden gönderin, daha küçük lekeler içine koyun, vb.

Örneğin:

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

Ama daha güçlü:

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

Yukarıdaki, kaynak sabit diskin sıkıştırılmış bir görüntüsünü, uzaktaki bir sisteme kopyalar; bu sayede, ilerlemede güncel kalmanızı sağlarken, kaynak ana bilgisayarın adını kullanarak 2G parçalarında depolar.

Diskin boyutuna, cpu kaynağndaki hz hızina, hedefteki cpu hznn, aa hznn, vb. Bagli olarak, baskiyi atlamak, ya da uzak taraftaki baskiyi yapmak ya da ssh'in basincini saglamak isteyebilirsiniz.


7
2018-05-29 19:23



+1 gzip ile borulama çok zaman ve bant genişliğinden tasarruf edebilir! - M. Dudley
Ayrıca dd komutuna 'bs = 1M' eklenmesinin genellikle hızı büyük ölçüde artıracağını da belirtmeliyim. - retracile