Disk klonlama için DD kullanma


182

Disk klonlama araçları ile ilgili bir çok soru var ve dden az bir kez önerildi. Zaten ddkendimi kullanmayı düşünmüştüm , çünkü kullanım kolaylığı ve önyüklenebilir Linux dağıtımlarında hemen hemen kullanılabilir olması.

ddBir diski klonlamak için kullanmanın en iyi yolu nedir ? Hızlı bir Google araması yaptım ve ilk sonuç açık bir başarısızlık girişimi oldu . Kullandıktan sonra yapmam gereken herhangi bir şey var mı dd, yani kullanarak okunamayacak bir şey var ddmı?


DD'nin nasıl çalıştığını biliyorum, sorum diskleri klonlarken (link tarafından tanımlandığı gibi) dd ile ilgili bilinen herhangi bir problemin yönündeydi, belki de bu çok açık değildi. Cevabının içerdiği ve seninki de "Bir zamanlar onunla hiçbir zaman bir sorunum olmadı" demiyor. Kesinlikle bazı ilginç noktalar sunduğunuz için cevabınızı da arttırdım (İlerlemenin belirtilmediğine dair olanı seviyorum).
falstro


- Sordum (ve cevap) ne zaman burada süper üzerinde benzer bir soru bu görmedik superuser.com/questions/11453/...
warren

3
Yanıtların hiçbiri iyi olmamasına rağmen, Joel'in soruyu sunucu hatası için iyi bir örnek olarak bağlaması ironik. 25 ddbloktan (yorumlar hariç) kötü blokları atlamak için doğru seçeneklerin tek bir cevabı yoktu - bu da kurtarma için diskleri klonlarken önemlidir. Daha iyi bir cevap ekledim, ki bu kötü bloklara sahip diskleri klonlayabilir:dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
Sam Watkins

Sürücü geometrisine bağlı dosya sistemleri ve geri yükleme aynı olmayan sabit sürücülerde yapılırsa dd geri yükleme işleminin "başarısız olabileceğini" düşünüyorum? DD restorasyonunda bazı başarısızlıklar yaşadım ve bence bu benim durumumda sorun oldu.
Marco

Yanıtlar:


160

dd kesinlikle en iyi klonlama aracıdır, sadece aşağıdaki komutu kullanarak% 100 kopya oluşturacaktır. Daha önce hiç problem yaşamadım.

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

Her baytı klonlarken, bunu kullanılan bir sürücüde veya bölümde kullanmamanız gerektiğini unutmayın. Özellikle veritabanları gibi uygulamalar bununla çok iyi baş edemez ve bozuk verilerle sonuçlanabilir.


12
Elbette, / dev / sdb en az / dev / sda büyüklüğünde olduğu sürece ...
Eddie

22
"bs = 100M conv = notrunc" ekleyin ve bu benim deneyimimde çok daha hızlı.
Tim Williscroft

127
sadece 'ben' ve 'o' harflerine çok dikkat edin ...
bandi

17
Hiç kimse bu numarayı bilmiyor gibi gözüküyor ... gd asimetrik bir kopyalama programı, yani önce okuyacak, sonra yazıp sonra geri gelecek. Sen kendine boru gg can ve bunun gibi, simetrik bir kopyasını yapmak için zorlamak: dd if=/dev/sda | dd of=/dev/sdb. Testlerimde, komutu boru olmadan çalıştırmak bana ~ 112kb / s verim verdi. Boruyla ~ 235kb / s. Bu yöntemle ilgili herhangi bir sorun yaşamadım. İyi şanslar!
Mistiry

13
@ Mistiry, simetrik kelimenin anlamı bu değil.
psusi

113

Yer kazanmak için, dd tarafından üretilen verileri gzip ile sıkıştırabilirsiniz, örneğin:

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

Diskinizi aşağıdakilerle geri yükleyebilirsiniz:

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

Daha fazla alan kazanmak için, önceden kopyalamak istediğiniz sürücüyü / bölümü birleştirin (uygunsa), sonra kalan tüm kullanılmayan alanı sıfırlayarak gzip'in sıkıştırılmasını kolaylaştırın:

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

Biraz bekleyin, dd sonunda bir "disk dolu" mesajı ile başarısız olur, sonra:

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

Ayrıca, kill komutuyla bir sinyal göndererek durumu bildirmek için arka planda çalışan bir dd işlemi alabilirsiniz, örneğin:

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

Sisteminizi kontrol edin - yukarıdaki komut Linux, OSX ve BSD dd komutları kabul ettikleri sinyallerde farklılık gösterir (OSX kullanır SIGINFO- durumu bildirmek için Ctrl+ tuşuna basabilirsiniz T).


2
Bu aynı zamanda böyle bir BTRFS, NILFS [hayal edebileceğiniz] için "modern" ile de çalışır mı?
Steve Schnepp

DD, dosya sisteminden daha düşük bir soyutlama seviyesi olan blok cihazlarda çalışır, bu yüzden evet. Aslında denemedim bile. Hmm, NILFS ilginç görünüyor, şuna bir göz atmam gerekecek.
David Hicks

4
+1 için kill -SIGUSR1 %1ve OSX dd komutu SIGUSR1'i çok mutlu bir şekilde kabul ediyor ... süper yararlı, teşekkürler!
stuartc

1
+1 Kill -SIGUSR1 1234bunu arıyorum.
hot2use,

2
Olması gereken: dd if=/dev/hdb | gzip -c > /image.img.gz?
Mike Causer

37

DİKKAT : Canlı bir dosya sistemini dd'lemek, dosyaları bozabilir. Sebep basittir, devam etmekte olan dosya sistemi aktivitesini anlamaz ve azaltmaya teşebbüs etmez. Bir yazı kısmen devam ediyorsa, bir kısmı kısmi yazı alacaksınız. Bu genellikle işler için iyi değildir ve genellikle veritabanları için ölümcüldür. Üstelik eğer eğilimli yazım hatası-berbat eğer ve bir Size şunu parametreleri, üzüntüsünden. Çoğu durumda, rsync çoklu görevlerin başlamasından sonra yazılan eşit derecede etkili bir araçtır ve bireysel dosyaların tutarlı bir şekilde görüntülenmesini sağlar.

Ancak, DD bağlantısı kesilmemiş bir sürücünün bit durumunu doğru şekilde yakalamalıdır. Önyükleyiciler, llvm hacimleri, bölüm UUID'ler ve etiketler, vb.


7
Bunun syncyolsuzluk problemlerine cevap olmadığını düşünüyorum. Bir deamon veya bir şey işlemden sonra işlem syncsırasında daha fazla dosya yazarsa ne olur dd?
Silinen

5
Öncelikle sürücüyü sökmek (veya salt okunur şekilde yeniden monte etmek) iyi bir fikirdir, ancak her zaman mümkün değildir
Alex Bolotov

1
Bu durumda, rsync'i kullanır ve tutarlı bir dosya elde etmek için dosya işleme sihirbazını yapmasına izin verir ve Yazma Üzerine Kopyalama anlambiliminin gelen yazıları yazmasına izin verirsiniz.
Jldugger

4
Monte edilmiş bir dosya sisteminde çalışan dd'yi eklemek istiyorum. Monte edilmiş dosya sistemindeki dosyaları KURTARMAYACAKTIR, ancak burada kastedilen, dosya sisteminin kopyasının mutlaka bilinen iyi bir durumda olacağıdır.
3mol

1
Kullanılması rsyncsağlayacaktır dahili veri hedef dosya sistemindeki tutarlıdır. Bu olmaz dosyalarındaki veriler tutarlı olmasını sağlamak - bunu yapmak için, dosya ve bu kilitleri saygı gerekir dosyalara yazma herhangi bir program kilitlemek gerekir.
Martin Geisler

26

Bozuk kesimleri içerebilecek bir diski klonlamak için dd kullanırken, bir hatayla karşılaştığında durmadığından ve eksik kesimleri boş baytlarla doldurduğundan emin olmak için "conv = noerror, sync" komutunu kullanın. Bu genellikle başarısız veya başarısız bir diskten kurtarmayı denemek için attığım ilk adımdır - herhangi bir kurtarma denemesi yapmadan önce bir kopya 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ı bs (blok boyutu) ayarından etkileyebileceğinizi görebilirsiniz. Genellikle bs = 32768'i denerim, ancak sizin için en hızlı olanı görmek için kendi sistemlerinizde test etmek isteyebilirsiniz. (Bu, başka bir nedenden dolayı, örneğin bir kasete yazıyorsanız, belirli bir blok boyutu kullanmanız gerekmediğini varsayar).


13
Bozuk sektörleri olan bir diskiniz varsa, gerçekten dd yerine 'ddrescue' kullanıyor olmalısınız. Çok daha verimli ve daha fazla veri kurtarma konusunda daha iyi bir şansı var. (Bu kadar iyi olmayan dd_rescue ile karıştırılmayın)
davr

3
Kötü blokları atlamaya çalışırken büyük bir blok boyutu kullanmamalısınız, aksi halde çok fazla atlar. 4096 yeterince büyük.
Sam Watkins

17

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

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

Elbette, / dev / hdb'den (root olarak çalıştırmanızı tavsiye ederim) doğrudan okumak için uygun izinlerinizin olduğundan ve / dev / hdb'nin monte edilmediğinden (disk çalışırken kopyalamak istemiyorsanız) emin olun. değiştiriliyor - salt okunur olarak montaj da kabul edilebilir). Tamamlandıktan sonra, image.img tüm diskin bayt bayt klonu olacaktır.

Diskleri klonlamak için gg kullanmanın birkaç sakıncası vardır. İlk olarak, dd tüm diskinizi, hatta boş alanı bile kopyalar ve büyük bir diskte yapılırsa, çok büyük bir görüntü dosyasına neden olabilir. İkincisi, dd, kopya uzun zaman alacağı için kesinlikle hiçbir ilerleme belirtisi göstermez, bu durum sinir bozucu olabilir. Üçüncüsü, bu görüntüyü diğer sürücülere kopyalarsanız (yine dd kullanarak), orijinal diskten daha büyük veya daha büyük olmalıdırlar, ancak hedef diskinizde sahip olabileceğiniz herhangi bir ek alanı kullanamayacaksınız. bölümlerinizi yeniden boyutlandırın.

Doğrudan bir diskten diske kopya da yapabilirsiniz:

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

ama hala boş alanla ilgili yukarıdaki kısıtlamalara tabi olursunuz.

Dd, konulara ve sonuçlara gelince, çoğunlukla, mükemmel bir iş çıkarıyor. Ancak, bir süre önce ölmek üzere olan bir sabit diskim vardı, bu yüzden tamamen ölmeden önce hangi bilgileri elimden alabildiğimi denemek ve kopyalamak için gd kullandım. Daha sonra dd'nin okuma hatalarını çok iyi kullanmadığı öğrenildi - diskte dd'nin okuyamadığı, dd'nin kopyayı kesmesine ve durdurmasına neden olan birkaç sektör vardı. O zamanlar (gerçi okuma hatası karşılaşmadan rağmen devam etmek gg anlatmak için bir yol bulamadı göründüğü o ayarı var sanki), bu yüzden elle belirterek zaman biraz geçirdi atlayıp üzerinde hop etmeye okunamayan bölümler.

Bu sorunu çözmek için biraz zaman harcadım (görevi tamamladıktan sonra) ve ddrescue adında bir program buldum , siteye göre gg gibi çalışıyor ancak hatayla karşılaşsa bile okumaya devam ediyor. Programı aslında hiç kullanmadım, ancak özellikle kopyaladığınız disk eskiyse, sistem iyi görünse bile kötü sektörlere sahip olabilir.


7
... dd kesinlikle hiçbir ilerleme belirtisi göstermez ... - peki bu doğru değil - ilerlemeyi göstermenin biraz zor yolu var - dd işleminin pid'sini bulmanız gerekiyor ('ps -a | grep dd') ve sonra USR1 sinyalini bu işleme gönderin - 'kill -USR1 <dd_pid_here>' (<> olmadan) dd'yi ilerleme bilgisi göstermeye zorlar.
Michal Bernhard

4
"Diskteki birkaç sektör okunamadı": Bunun conv=sync,noerroryardımcı olacağını düşünüyorum .
Gauthier

2
conv=sync,noerrorSeçenekleri, bozuk bir blok atlamak ve işler doğru yaslanıyor böylece görüntüdeki onları sıfır dd izin, esastır. Bu konuda bir yorum yapan çok az insanın aksesuarı.
Sam Watkins

1
GNU ddrescueözel bir seçenek olmadan ilerleme göstergesi sağlar ve kopyayı durdurabilir ve kaldığınız yerden devam ettirebilirsiniz.
Endolit

2
Dd ile ilerleme kaydetmenin daha zor bir yolu da seçeneği eklemek.status=progress
James

11

Kaynak sürücü hiç zarar görürse, daha kullanarak şans olur dd_rhelpile dd_rescue(benim kişisel tercihi) ya da GNU ddrescue.

Bunun arkasındaki sebep, okuma hatalarında dddenemeye ve denemeye ve denemeye devam etmektir - zaman aşımının oluşması için uzun süre beklemektir. dd_rescueBir hataya kadar okumak, daha sonra diskte bir nokta seçmek ve son hataya geriye doğru okumak gibi akıllıca şeyler yapar ve dd_rhelptemelde bir dd_rescueoturum yöneticisidir - zekice başlatmak ve devam ettirmek dd_rescue, daha hızlı hale getirmek için çalışır.

Bunun sonucu, dd_rhelpminimum sürede elde edilen maksimum veridir. Çalışmayı bırakırsanız dd_rhelp, sonunda ddaynı zamanda aynı işi yapar . Ancak, dd100 Gb diskinizin bayt 100'ünde okuma hatalarıyla karşılaşılırsa, diğer 9.999.900 bayt * 'ı kurtarmak için uzun bir süre beklemeniz gerekir, oysa dd_rhelp+ + dd_rescueveri yığınını çok daha hızlı kurtarır.


1
Bazıları dd_rescue ve ddrescue arasında seçim yaparken yardım: askubuntu.com/a/211579/50450
Johann

7

Kaynak diskte herhangi bir bağlı dosya sistemi bulunmamalıdır. Engelleme aygıtını okuyabilen bir kullanıcı (root isleri), 'dd if = / dev / sda ....' komutunu çalıştırın.

Şimdi, buradaki en güzel şeylerden biri, bir bayt akışı oluşturduğunuzdur ... ve bununla çok şey yapabilirsiniz: sıkıştırın, ağ üzerinden gönderin, daha küçük bloklara sıkıştırın, vb.

Örneğin:

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

Ama daha güçlü bir şekilde:

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

Yukarıdakiler kaynak sabit disk sürücünün sıkıştırılmış bir görüntüsünü uzaktaki bir sisteme kopyalar, burada devam ederken sizi güncel tutarken kaynak ana bilgisayarın adını kullanarak 2G'lik parçalarda saklar.

Diskin boyutuna, kaynaktaki cpu hızına, hedefteki cpu hızına, ağ hızına vb.


+1 gzip ile borulama, çok fazla zaman ve bant genişliği tasarrufu sağlayabilir!
M. Dudley

Ayrıca dd komutuna 'bs = 1M' eklemenin hızı büyük ölçüde artıracağını da belirtmeliyim.
retracile

6

Bir diski klonlamak için yapmanız gereken tek şey giriş ve çıkışı belirtmek dd:

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

Tabii ki, doğrudan okumaya izin verdiğinizden emin olun /dev/hdb(root olarak çalıştırmanızı tavsiye ederim) ve /dev/hdbbağlı değil (disk değiştirilirken kopyalamak istemezsiniz). Tamamlandığında, hdb.imgtüm diskin bayt bayt klonu olacaktır.

ddDiskleri klonlamak için kullanmanın birkaç sakıncası vardır . İlk olarak, ddtüm diskinizi, hatta boş alanı kopyalar ve büyük bir diskte yapılırsa, çok büyük bir görüntü dosyasına neden olabilir. İkincisi, ddkopya uzun zaman alacağından kesinlikle sinir bozucu olabilecek hiçbir ilerleme göstergesi sunmaz. Üçüncüsü, bu görüntüyü diğer sürücülere kopyalarsanız (yine dd kullanarak), orijinal diskten daha büyük veya daha büyük olmalıdırlar, ancak hedef diskinizde sahip olabileceğiniz herhangi bir ek alanı kullanamayacaksınız. bölümlerinizi yeniden boyutlandırın.

Doğrudan bir diskten diske kopya da yapabilirsiniz:

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

ama hala boş alanla ilgili yukarıdaki kısıtlamalara tabi olursunuz.

İlk dezavantajı, kopyayı oluştururken verinin gzlenmesi ile çözülebilir. Örneğin:

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

İkinci dezavantajı pipeview ( pv) aracı kullanılarak çözülebilir . Örneğin:

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

Üçüncü dezavantajı aşmanın bir yolu olmadığını biliyorum.

Ek olarak, dddaha büyük veri bölümleriyle çalışmayı söyleyerek kopyalama süresini hızlandırabilirsiniz . Örneğin:

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

1
Üçüncü dezavantajı aşmanın yolunu zaten söyledin ... bölmeleri yeniden boyutlandır. Bir bölümün büyütülmesi genellikle güvenli ve hızlı bir işlemdir (küçülme veya hareket etmeye karşı, verileri dolaştığı için yavaş ve daha tehlikeli olan).
davr

gzipping, mevcut veya silinen verilerle doldurulacağından, bir süredir kullanılmış olan bir diskle çalışmaz. gzip sadece boş alan sıfır ise, sadece yepyeni bir disk için geçerli olan işe yarar.
Tozz

3
@Tozz: Bir dosya sistemi görüntüsünün sıkıştırılabilirliğini, dosya sistemini 0'larla dolu bir dosya ile doldurarak, diske eşitleyerek ve sonra silerek artırabilirsiniz. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon (Dosya sistemi katmanında Modulo ekstra zeka.)
15'te retracile

5

DD ve kurtarma diskleriyle yapabileceğiniz bir diğer güzel şey de ağ üzerinden veri kopyalamaktır:

remote_machine$ nc -l -p 12345

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

Şebeke yerel değilse, gzip'i her iki boru hattına da yerleştirebilirsiniz. İlerleme için kullanın pv. Local_machine kullanıcısının netcat'ını kopyalama bittikten sonra sonlandırmak için, -w 5başka bir şey ekleyebilirsiniz .


9
Bu doğru değil. 'Remote_machine' komutunda, ne yapmak istediğinize bağlı olarak > disk_backup.imgveya |dd of=/dev/sdbveya başka bir şey eksik . Sanırım stdout'a bir disk imgesi atmak istemiyorsun.
davr

1
Ve gönderilen verileri daha da azaltmak için her iki ucuna gzip atın.
3mol

4

Boş alan dahil, dd'nin tam bir kopya çıkardığını unutmayın .

Bunun anlamı:

  1. 2. sürüş en az ilk kadar büyük olmalıdır
  2. 2 sürücü büyükse, ekstra alan boşa gider (dosya sistemi olabilir zihin genişletilebilir siz)
  3. Kaynak sürücü dolu değilse, dd, boş alan kopyalamakla zaman kaybettirir.
  4. Bu şekilde sürücünün tamamını veya tek bir bölümü kopyalayabilirsiniz.
  5. Bu önyüklenebilir bir sürücü ise, dd'yi kullandıktan sonra bootloader'ı kurmanız gerektiğinden eminim.

Umarım yardımcı olur


8
Tüm sabit diski klonlıyorsanız, önyükleyiciyi de klonlarsınız.
Cristian Ciupitu

welll, sadece bir düşünce, ama gparted'ı sadece kullanılmış olan bölüme / diske kopyalanacak şekilde kullanmak için kullanamazsınız - sonra dd? Bir zamanlar görüntünün bu sorunu hafifletmesi gerektiğini varsayarsak.
bbqchickenrobot

3

Gelecekte referans olması için, kurtarma çalışmalarını kontrol etmek ilgi çekici olabilir . Günümü birkaç kez kurtardı.


3

Diğer bir büyük özellik ise MBR'leri, bölüm tablolarını ve önyükleme kayıtlarını kopyalamak.

Sadece

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

ve yazarken etrafındaki diğer yön. fdiskSonra ile Lehçe .

Bölümleme tablonuzu yedeklediğinizde çok daha güvenli hissediyorum.

Ayrıca, başka bir sabit sürücüye geçişi (partion yapısını değiştirirken) bir sevinç haline getirir.


3

Bu biraz ucuz bir kesmek, ancak DD işlemlerinizi izlemenin hızlı ve kirli bir yolu.

Dd komutunu çalıştırın. Yeni bir kabuk açın ve dd işleminizin 'PID'sini bulmak için ps awx yapın. Şimdi yeni kabuk tipinde izle -n10 öldür -USR1 {DD işleminizin pid}

Bu, saat çıkışı penceresinde hiçbir şey yapmaz, ancak orijinal DD kabuğuna geri döndüğünde, DD her 10 saniyede bir durum raporları vermeye başlar. Watch komutunda -n 10 komutunu elbette başka bir zaman diliminde değiştirebilirsiniz.

Takyon


OS X mevcut değil watchve -USR1gg'yi öldürüyor. Aşağıdaki komut yine de çalışır: while [ true ]; do killall -INFO dd; sleep 30; done
Adam Franco

Bunun acemiler için çok pratik olduğunu sanmıyorum, pvkomutla daha iyi hizmet verebilirler .
Robbie Mckennie

Ayrıca CTRL-T kullanarak dd kullanarak bir SIGINFO gönderebilirsiniz. While döngüsünden daha kolaydır ve sahip olduğum OSX 10.6 cd'sinde süreklilik yok. Bunu en.wikipedia.org/wiki/Unix_signal#Sending_signals
Citizen Kepler

3
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

Bu, diski kopyalar ve çok önemli olan hatalı blokları atlar.

Bunlar bir diski klonlamak veya kurtarmak için gd kullanmanın temel ve temel seçenekleridir.

Başka bir cevap göndermek istemedim, ancak daha önce gönderilmiş olan 25 arasında "conv = sync, noerror" seçenekleriyle ilgili iyi cevaplar yoktu.


1
Aslında daha önce, bir cevapta ve en az iki yorumda bahsedilmişti .
Michael Hampton

1
@Michael bağladığınız cevap tam bir komut içermez ve başka hatalar vardır - conv=sync,noerrorher blok için çok fazla veri atlayacağından büyük blok boyutu kullanmak iyi bir fikir değildir . Bu seçenekler "kurtarma klonlama" için çok önemlidir ve kendileri için yorumları aramak zorunda değillerdir. En popüler cevap, eğer disklerin bozuk bir bloğu yoksa, örneğin bozulmamış bir diski klonlamak için, ancak kurtarma için uygun değilse yeterlidir.
Sam Watkins

@Michael verdiğim örnek, profesyonel disk kurtarma için birkaç kez kullandığım bir komut. Biraz daha iyi bir iş çıkarabilecek başka araçlar olsa da, verdiğim örnek, disk kurtarma klonlamasında diğer tüm ddörneklerden daha iyidir , aynı zamanda hatasız bir diski klonlamak için de uygundur. Bu nedenle, cevabımın "disk klonlama için DD kullanımı" konusundaki en iyisi olduğunu düşünüyorum. İlerlemeyi, sıkıştırmayı vb. İzleme hakkında bilgi eklemedim, çünkü basit tutmak ve temelleri doğru yapan kısa bir cevap vermeye odaklandım.
Sam Watkins

3

Aslında böyle bir şeyi deneyebilirsin

dd eğer = / dev / sda2 = / dev / sdb2 bs = 4096 konv = senk, noerror

tüm hataları atlamak ve bir bölümün veya sabit sürücünün tam klonunu almak için


Conv = sync olmalı, noerror Eşitleme seçeneği gereklidir, aksi halde sıfır olarak kopyalanmak yerine hatalı bloklar kaldırılır.
Sam Watkins

2

dd ilerleme bilgisi sağlar - çoğu linux'taki sürümleri. Unix lezzetini hatırlamayan ama hatırlamayan bazılarını gördüm.

Man sayfası şöyle diyor: Çalışan bir 'dd' işlemine USR1 sinyali göndermek I / O istatistiklerini standart hataya yazdırıyor ve ardından kopyalamaya devam ediyor.

Bu özelliği düzenli kullanıyorum.


Yararlı olsa da, yeni başlayanlar için pratikliğinden şüpheliyim.
Robbie Mckennie

2

Birisi bunu söylemek zorunda kaldı: Clonezilla'yı dene (http: // clonezilla.org/)

Siz ne alırsınız? Dosya sisteminin sadece kullanılmış kısımlarını kopyalamak için. Clonezilla, dd, grub, sfdisk, parted, partimage, ntfsclone ve / veya partclone kullanır. Seçtiğiniz seçeneklere bağlı olarak.

İyi belgelere şu adresten ulaşabilirsiniz: http: // clonezilla.org/clonezilla-live/doc/


Belgeleri biraz kaba buldum ve bir linux PATA sürücüsünü bir SATA sürücüsüne klonlamak, önyükleyebileceğim bir şeyi bırakmadı (henüz). Ama DD ile aynı sonuç için çok daha hızlı ve benim laptop sürücü yükseltmeleri için harika çalıştı.
jbdavid

2

Dd (bu durumda uzaktaki bir makineye, ancak aynı ilkenin yerel bir kopya için de geçerli olduğu) kullanılarak nasıl kopyalanacağı gösterilmektedir.

Pid'i dosya tanıtıcısı 3 in / tmp / pid içinde depolayarak çalışır, bu daha sonra USR1 sinyaliyle öldürülen ölümler için kullanılır. Bir kırışıklık stderr'deki ilerlemenin çıktısını bir subshell aracılığıyla stderr'i filtreleyerek sadece bir satıra filtrelemekti.

(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

Soruyla pek ilgili değil, ancak veriyi iletmek için alt kabuk ve yüksek (
stderr'den

Diskleri klonlarken farklı dd seçenekleri için kendim bu sayfaya atıfta bulundum, o zaman klonlamada kullandığımın sonucunu koymak için uygun bir yer gibiydi, özellikle de kendimi çok temiz sanıyordum :)
Edward Groenendaal

2

En fazla bilgi, önceden eklenmiş tariflerde açıklanmıştır, ancak hepsi açıklanmamıştır.

Linux altında sabit disk veya bölümü dd komutuyla kopyalayabilirsiniz. Dikkat, bir hata yapacağınız zaman tüm verilerinizi kaybedeceksiniz.

İlk başta, hedef kullanımda olmamalı, ikincisi kaynak kullanılmamalıdır ya da salt okunur moda geri alınmalıdır. Aksi halde kopya zarar görür. Yeniden montaj yapmak mümkün değilse lütfen linux live dağıtımı için önyüklenebilir bir sürücü (hdd / ssd / pendrive) yapın. Knoppix'i önlüyorum, ama bu senin seçimin. Mümkünse, tek bir kullanıcı modu için sistem düzeyini 1 olarak önyükleyebilir veya değiştirebilirsiniz, veya sistemi tek bir kullanıcı moduna doğrudan yeniden başlatabilirsiniz, dağıtıma bağlı değildir. Yalnızca bir bölümü klonlarsanız, bu bölümün bağlantısı kaldırılmalı veya RO’ya yeniden yerleştirilmelidir:

umount /mountpoint_or_device

veya

remount -o,ro /mountpoint_or_device

Sabit sürücünün tamamını klonlamak istiyorsanız, tüm bölümleri ayırmanız veya yeniden takmanız gerekir.

Kaynak ve hedef cihazı tanımlamanız gerekir. lütfen dmesg'e bakınız, burada cihazla ilgili tüm gerekli bilgileri, satıcı vb. ile birlikte saklayın. Alternatif olarak, eğer farklı ise cihaz boyutuna göre belirlenebilir. Daha sonra, hedef aynı ya da kaynaktan daha büyük olmalıdır. kaynağı hesaplamalısınız, örneğin: fdisk -l / dev / sda, bölüm geometrisi hariç (GPT olabilir), şunları getireceksiniz: 1. GB ve bayt ağırlığındaki toplam disk boyutu 2. tarihsel geometri ve toplam sektör numarası, çok önemli bilgiler 3. bayt cinsinden blok boyutu, genellikle 512.

Örneğin:

# 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

Şimdi 512 bölücüden daha büyük deneyelim, 41943040 fiziksel sektörümüz var:

41943040/256 = 163840, çok iyi, 256 sektörün toplu kopyasını yapabiliriz. Daha fazla yapabilir miyiz? Bir deneyelim: 41943040/1024 = 40960, bence bu yeterli, bunu seçeceğiz. Sektör grubunun büyüklüğünü sayalım: 512 (sektör büyüklüğü) * 1024 = 524288 bayt eq 512K. Sonra bs = 512K ya da daha az parametresini kullanabiliriz, ancak bunu 2 ^ x'e böleriz. Büyük dahili önbellekli modern sabit diskler için bu yeterince pratik. çok daha küçük önbellekli eski sürücüler için, 32K veya daha düşük bir değer yeterlidir.

Daha sonra hazırlıktan sonra bir kopya yapabiliriz: dd if = / dev / source_devide = / dev / destination_device bs = 32K ve kopya yapılacaktır. Dikkatli olun, herhangi bir hata sizin ithalat verilerinizin üzerine yazacaktır. Hedefte her şeyin üzerine yazılacak.

Hasarlı kaynak diskteki verileri kurtarmayı denerseniz, yerel kesim boyutunu daha iyi kullanın, bu genellikle 512 bayttır ve conv = notrunc seçeneğini ekleyin. Aksi halde, kötü sektörler tarafından düşürülen kaynaktaki delikler, varış yerindeki sektör kayması ile birleştirilecektir. Bu, onarım için birkaç şansla kopyaya zarar verir. sonra komut olacaktır:

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

ve sürücü ve sistemin vazgeçeceği ve sektörün sonuna kadar sektöre yürüyeceği uzun bir süre bekleyin.

dd, bölümü yeni yerine taşımak için kullanışlı bir araçtır. Sadece bölüm oluşturun, yeni bölüme gd yapın (bu daha büyük, daha büyük olabilir) ve mümkünse, tüm yeni bölümleri doldurmak için kopyalanan dosya sistemini genişletin, ext3 / ext4 / xfs / zfs / btrfs bu özelliğe sahiptir. Sonunda / etc / fstab dosyasını değiştirmeli, mümkünse umount / mount yapmalı veya sistemi yeniden başlatmalısınız.

Tabii ki herhangi bir bölümleme klonlayabilirsiniz. dd komutu dosya sistemi türüne bakmaz, yapısı ile hiçbir şey yapmaz. o zaman bu komut NTFS veya diğer bölüm tiplerini klonlamak için kullanılabilir.

Herhangi bir hile var. Parametre ayarlamadığınızda, dd çıktıyı stdout'una koyacaktır. daha sonra, örneğin sıkıştırılmış bir disk veya disk bölümü kopyası yapabilirsiniz, örneğin:

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

Elbette bu çevrimdışı yapılmalıdır. Bunu şu şekilde geri yükleyebilirsiniz:

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

, ardından tüm sda sabit diskleri bu yedeklemenin üzerine yazılacak ve mevcut tüm veriler kaybolacak. Bunu NTFS pencereleri bölümü ve bunun kullandığı sabit disk ile de yapabilirsiniz. Elbette, seçiminize bağlı olarak, diğer sıkıştırma komutunu kullanabilirsiniz.


1

Bölümün (veya diskin) sıkıştırılmış bir görüntü dosyasını anında bzip2veya gzipyerine kullanarak anında oluşturabilirsiniz dd. Görüntüleri çıkarılabilir medyada saklamak için güzel:

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

Disk daha önce çok kullanılmışsa, kullanılmayan tüm alanları görüntülemeden önce sıfırlarla doldurarak sıkıştırmayı artırabilirsiniz:

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

Resmi başka bir diske geri yüklemek için yapmanız gereken tek şey:

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY

Hilenin kalan alanı sıfırla doldurması için oy verildi. Akıllı!
Karışıklık

Buna ihtiyacım vardı! SD kart daha önce video çekimi için kullanılıyordu ve çok doluydu, sıkıştırma işlemi hiç yardımcı olmadı.
Cody Smith

0

Bazı nedenlerden dolayı, dd, CD’leri ses izleriyle görüntülerken başarısız olur. Bir görüntü + TOC dosyası almak için cdrdao veya benzeri bir şey kullanmanız gerekir.


0

Hızla ilgili bir not: benim deneyimlerime göre, varsayılan bs = 512 yerine bs = 1024 belirtirseniz gg iki kat daha hızlıdır. Daha büyük bir blok boyutu kullanmak, bs = 1024 üzerinden fark edilebilir bir hızlanma olmaz.


4
disk kümeleri genel olarak 4k civarındadır, bu nedenle 4096 kullanmak muhtemelen iyi bir seçenektir ve bir seferde 2 kümeyi okumak istiyorsanız 8192 bile. Parçalanmış hafıza sorunlarıyla karşılaştığınız için çok büyük gitmeyin
kullanıcı4767

0

Dolu bir diski tararken dikkat etmeniz gereken şeylerden biri, bunun diskin ana önyükleme kaydının üzerine yazmasıdır. Bu bölüm tablosu ve diğer hayati bilgileri içerir. Yeni disk eski diskle aynı değilse, her türlü tabloyu oluşturabilir. Bölümlere kopyalama genellikle daha güvenlidir (ve takas bölümlerinin kopyalanması gerekmez)


0

Uzun yıllardır yönetici rolünden çıktım, ancak 'dd'nin işe bağlı olduğunu biliyorum. Bu tekniği 80'lerin sonunda Sun Sparc ve 386i bilgisayarlarında düzenli olarak kullandım. Birden fazla QIC kaseti üzerine dağıtılan CAD yazılımı kullanan 30'dan fazla 386i sistemi olan bir müşteri siparişim vardı.

İlk bilgisayara kurduk, uygulamayı yapılandırdık, SunOS'un sys-unconfig komutunu çalıştırdık, sürücüyü farklı bir SCSI adresi olan bir ayakkabı kutusuna yerleştirdik ve diğer 30 sürücüye 'dd' ye geçtik.


0

Yukarıda başkalarının da belirttiği gibi, takılı bir dosya sistemini klonlamakla elde edilen sonuçlardan biri potansiyel veri bozulmasıdır. Bu açıkçası tam sürücü klonlarına uygulanmayacak, ancak LVM kullanıyorsanız tutarlı bir görüntü elde etmek için anlık görüntüden LogicalVolume ve dd'yi görüntüleyebilirsiniz.



0

Söylenmesi gereken yeni başlayanlar için sadece bir uyarı: En azından bazı Sürümlerde bs = X, X büyüklüğüne olan belleğin tam anlamıyla tahsis edileceği anlamına gelir. bs = 1GB RAM ve yetersiz takaslı bir sistemde 2GB, kötü şeylerin oluşmasına neden olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.