'dd', bölümlerin düzenlenmesi gerektiğini bilerek daha küçük bir HDD'ye kopyalamak için kullanılabilir mi?


14

Ben böyle dddiskleri klonlamak için kullandım :

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

Ve her zaman iyi çalıştı. 'Dd' üzerindeki tüm dokümanlar, hedef diskin kaynaktan aynı boyutta veya daha büyük olması gerektiğini hatırlatmak için özen gösterir. Bu kesinlikle doğru mu?

Şimdi, daha küçük bir diske klonlasam, hedefte kısmen `` sınırların dışında '' olan bölümlerin sağlam olmasını bekleyemeyeceğimi anlıyorum .

Ancak, daha sonra hedefteki bölümlerimi düzenlemem gerektiğini iyi bilerek, 'sınırların dışında' olanları silerek, kaynağın kaba bir kopyasını kaynağın sınırlarına kadar yapmak için hala 'dd' kullanabilir miyim? Hedefin fiziksel boyutu? Ya da 'dd', boyutunun sınırına ulaştığında hedefi sigara enkaz yığınına indirgeyecekti ;-)

BTW, bu araştırma, ben önerilen değerlerine gördüğüm bs=her şeyin bs=1024için yukarı bs=32Mgerçekten iyi olanı?


Not kullanması durumunda, dd en uygun blok boyutu hesaplama yararlıdır
Wilf

Yanıtlar:


7

Fiziksel sürücü en azından sigara içmeye başlamamalı, ancak dosya sisteminizin artık çalışmadığı çok iyi (yani, hedef dosya sistemi; sadece kopyaladıysanız ve kaynaktaki hiçbir şeye dokunmadıysanız, kaynağın kendisi iyi olmalıdır) ). Bir bölüm içindeki veriler artan sırayla dağıtılmaz. Bölüm dolu olmasa bile bir kısmı bölümün sonunda olabilir (aslında, bunun bazı dosya sistemlerinde determinist olarak gerçekleştiğini düşünüyorum, ancak ayrıntılara girecek kadar bilgim yok). Oradaki veriler dosya sisteminin bütünlüğü için gerekli olabilir. Bu yüzden böyle bir kopyaya güvenmemenizi şiddetle tavsiye ederim.

Bu kopyayı yapmak istiyorsanız, önce bölümü iç yapısının farkında olan ve her şeyi daha iyi bir şekilde daha küçük bir bölüme yeniden eşleştirebilen bir araçla küçültmeniz gerekir. Sonra kopyayı yapabilirsiniz. gpartedbu tür şeyleri yapmak için iyi bir GUI arayüzüdür.

İçin bsdeğeri, genellikle en iyi fikir gerçek kopya başlamadan önce testler birkaç sahip olmaktır. Bu kontrolü otomatikleştirmenize yardımcı olacak bazı araçlar var, ancak adını hatırlamıyorum. Deneyimlerime göre, en iyi aralık genellikle 4M ile 16M arasındadır. Bundan daha yüksek, artık fazla kazanmıyorsunuz. Ancak disklerin kendileri de dahil olmak üzere birçok şeye bağlıdır. Örneğin, daha yüksek hız ve önbellek boyutu nedeniyle daha yüksek değerler için uygun olabilecek gerçek üst düzey disklerle nadiren çalıştım.

DÜZENLE Bir bölüm tamamen kopyalandıysa, bölümü sorunsuz olarak kullanabilirsiniz. Ancak, diğerlerinin altı çizdiği gibi, bölüm tablosunun sağlam olduğundan da emin olmalısınız (en azından ilgili girdiler). MBR'nin dört birincil bölümüyle, diskin ilk 512 baytında açıklandığı için sorun yoktur. Mantıksal bölümler genişletilmiş bölüm boyunca tanımlanır, bu nedenle girişler kaybolabilir (ancak yine de kaybedilecek bölümleri tarif ederler). GPT ile disk bölümünün hem diskin başında hem de sonunda bir kopyası vardır. İkincisini kaybedersiniz, ancak ilkinden yeniden inşa edebilirsiniz. Elbette bunu mümkün olan en kısa zamanda yapmanız önerilir; diğer cevaplar bu konuda daha kesinti.


Düzenlenmiş soruya bakınız :)
Ray Andrews

1
@rayandrews Hangi güncelleştirmeyi beklediğinizden emin değilsiniz, ancak temel olarak ddbaytları kopyalıyor. Bayt 0'dan başlar ve bir şey (sizin durumunuzda, hedefteki ortamın sonu) durdurana kadar kopyalamaya devam eder. Bu sizi gerçeklikten daha büyük bir sürücü ve sürücünün dışındaki bölümleri belirten bir bölüm tablosu ile bırakacaktır ... ancak bunu düzeltirseniz, iyi olmalıdır. Her ne kadar veri kopyalamak için bölüm başına dd kullanmak daha kolay olsa da. [Ayrıca sizi yinelenen
UUID'ler

Sevdiğim şey, bölümleri ve dosya sistemlerini olduğu gibi oluşturması ve etiketlemesi - çok zaman tasarrufu. Sağ UUID hakkında tho.
Ray Andrews

1
ikinci gpt tablosunu nasıl geri yüklersiniz?
user230910

2

İlk başta önerilen "meydan okuma" bazılarının yorumladığı gibi zor, uygulanabilir veya kulağa naif gelmeyebilir gibi görünse de, öyle değildir. Daha büyük bir diskten daha küçük bir diske geçmek için dd kullanmanın arkasındaki ana fikir mükemmel derecede iyidir ve verileri taşımak için faydaları vardır. Tabii ki, işgal edilen verinin hedef diske sığması için yeterli boş alana sahip olmak gerekli bir gerekliliktir.

Buradaki fikir, başlangıçta önerildiği gibi tüm diski değil, her bir bölümü ayrı ayrı tanımlamaktır. Daha da fazlası yapılabilir: Kesilecek bölümler, dosya sistemi yeniden boyutlandırma araçlarının küçük bir yardımı ile güvenli bir şekilde geçirilebilir. Aslında, bu tür bir taşıma, dosya sistemi katmanında çalışmayan ve cp, rsync, pax, ... gibi araçlarla engellenmeyen ve aygıt katmanını engellemeyen araçlarla kolayca kopyalanamayan genişletilmiş dosya özniteliklerini korumak için ilginçtir. Dd kullanmak, SELinux ile ilgili sorunları önlemek için işletim sisteminin yeniden yüklenmesi veya FS'nin yeniden etiketlenmesi gerekliliğini ortadan kaldırır.

Benzer görevleri yerine getirmek için genellikle yaptığım şey aşağıdadır:

1) Önce etkilenen bölümler içindeki kesilecek dosya sistemlerini azaltın. Bunun için resize2fs aracını kullanın (bir ext2 / ext3 / ext4 fs hakkında konuştuğumuzu varsayarsak - diğer modern FS'lerde de aynı amaçla yeniden boyutlandırma araçları bulunur). Her ne kadar - bariz nedenlerle - bir dosya sisteminin içinde bulunduğu bölümden daha büyük olamamasına rağmen, güvenli bir şekilde daha küçük olabileceğini unutmayın. Buradaki güvenlik hilesi "gereğinden fazla" azaltmaktır. Örneğin: 500 Gig diskine taşımak istediğiniz 1 TB'lık bir dosya sisteminiz olduğunu düşünün. Bu durumda, fs'yi diyelim ki 450 Gig'e düşürmeyi öneriyorum (elbette bunun için yeterli boş alanınız olması gerekir, yani, bu dosya sisteminde şu anda işgal edilen alan 450 Gig'i aşamaz). Görünüşe göre israf edilen 50 Gig'lık alan, veri taşıma işleminden sonra düzeltilecektir.

2) Hedef diski, alan kısıtlamaları dikkate alınarak uygun geometri ile bölümlere ayırın;

3) verileri disk aygıtını değil, bölümleme aygıt (lar) ını kullanarak kullanın (yani, kullanmak dd if=/dev/sda# of=/dev/sdb#yerine her bölüm için kullanın if=/dev/sda of=/dev/sdb). NOT: sda ve sdb burada sadece örnektir; ÖNEMLİ NOT: Daha büyük bir bölümden daha küçük bir bölümleme cihazına gelerek, dd, blok cihazının sonuna yazı yazma girişiminden şikayet edecektir, çünkü bu noktaya gelmeden önce dosya sistemi verileri tamamen kopyalanacaktır. Böyle hata mesajı önlemek için kullandığınız kopyanın boyutunu belirtebilirsiniz bs=ve count=büzüşen dosya sistemi boyutuna uyacak şekilde parametreler, ancak bu bazı (basit) hesaplamayı gerektirir, ama yapılırsa yanlış veri riski de vardır.

4) Verileri öğrendikten sonra, resize2fs kullanarak hedef bölüm (ler) içindeki ilgili dosya sistemlerini yeniden boyutlandırın. Bu sefer yeni dosya sistemi boyutunu belirtmeyin. Boyut belirtimi olmadan çalıştırıldığında, resize2fs dosya sistemini izin verilen maksimum boyutu kaplayacak şekilde büyütür, böylece bu durumda 450 Gig dosya sistemi 500 Gig bölümünün tamamını işgal etmek için tekrar büyür ve hiçbir bayt israf edilmez. ("Gerekenden fazlasını azalt" yaklaşımı yanlışlıkla boyutları yanlış belirlemenizi ve verilerinizi riske atmanızı önler. GB ve GiB birimlerinin zor olabileceğini unutmayın).

Daha karmaşık işlemler için not: Kopyalamak istediğiniz bir önyükleme yöneticiniz varsa, bu durum büyük olasılıkla muhtemeldir, disk aygıtlarını disk aygıtlarını kullanarak disk aygıtlarını (ör. dd if=/dev/sda of=/dev/sdb bs=4096 count=5) seçin ve ardından / dev / sdb içindeki geometriyi yeniden yapılandırın (geçici olarak yeni sürücü için geçersiz bir geometri ancak sağlam ve geçerli bir önyükleme yöneticisi içerir). Son olarak, bir seferde bir bölüm oluşturmak için yukarıda açıklandığı gibi bölümleme aygıtlarını kullanmaya devam edin. Birçok kez böyle işlemler yaptım. Son zamanlarda, MacOSX ve Linux kurulumlarının bir karışımını içeren bir HDD'den MacMini'mde daha küçük bir SDD'ye yükseltme yaparken başarıyla karmaşık bir taşıma gerçekleştirdim6,2. Bu durumda, Linux'u harici bir sürücüden önyüklemek zorunda kaldım, bootmanager'i buldum, GPT'yi yeni diskte düzeltmek için gdisk'i çalıştırdım ve son olarak sadece küçültülmüş dosya sistemlerini içeren her bölümü dd'ed ettim. (GPT bölüm şemasının, biri başlangıçta diğeri diskin sonunda olmak üzere, bölüm tablosunun iki kopyasını sakladığını unutmayın. gdisk, PT'nin ikinci kopyasını bulamadığı ve bölümler disk boyutunu aştığı için çok şikayet ediyor, ancak disk geometrisini yeniden tanımladıktan sonra PT kopya sorununu doğru bir şekilde düzeltiyor). Bu çok daha karmaşık bir durumdu, ancak söz etmeye değer çünkü bu tür bir operasyonun da mükemmel bir şekilde uygulanabilir olduğunu gösteriyor.

İyi şanslar! ... ve en önemlisi bu tür işlemlerden önce tüm önemli verileri yedeklemeyi unutmayın. Bir hata ve verilerinize geri dönülmez bir şekilde zarar verebilirsiniz.

Ve yeterince vurgulamamam durumunda: verilerinizi taşıma işleminden önce yedekleyin! :)


Çok iyi bir açıklama, teşekkürler!
nirvana-msu

1

Bir arabayı arabadan 20 cm daha dar bir geçide yerleştirmek istiyorsanız ve arabanın sol 20 cm'sini keserseniz, araba hala çalışır mı? Muhtemelen değil.

Bir diskin başlangıcını başka bir diske kopyalar ve hedef disk küçük olduğundan kopyayı kısa keserseniz, sonuç çalışmaz. Hedef diskteki tüm dosyaları sığdırmak için yeterli alan olsa bile, diskin başlangıcından itibaren N bayttan sonra kesmek size çalışan bir dosya sistemi sağlamaz.

Disk PC tarzı bölümlere (GPT veya MBR) bölünmüşse, tamamen hedefe uyan tüm bölümler çalışır. Bir istisna vardır: MBR bölümlerinde, mantıksal bölümler disk sırasına göre numaralandırılmazsa, zincir hedef alandan ayrılır ayrılmaz bölümler artık listelenmeyecektir. (Bunu anlamadıysanız, kısmi bir disk kopyası yapmamanın bir nedeni daha vardır.) Başından kopyalamak ve uygun olanla bitirmek yerine, saklamak istediğiniz bölümleri kopyalamak çok daha mantıklı olacaktır. . Sondaki kısmen kopyalanan bölüm kullanılamaz.

Disk veya kısmi bir bölüm bir LVM fiziksel birimiyse ve bu fiziksel birimin kısmi bir kopyasını oluşturuyorsanız, sonuçtan da herhangi bir yararlı veri alacağınızdan emin olamazsınız.

Büyük bir diskteki verilerin yalnızca bir kısmını daha küçük bir diske kopyalamak istiyorsanız, daha küçük diskte bölümler oluşturun. Bir bölümü aynı boyuttaki bir bölüme kopyalamak istiyorsanız, bunu ile yapabilirsiniz cat. Bir bölümü daha küçük bir bölüme kopyalamak istiyorsanız, hedef bölümde bir dosya sistemi oluşturun ve cp -aveya gibi bir şeyle dosya düzeyinde bir kopya oluşturun pax -rw -pe -t.

Mazoşist olmak ddyerine kullanabilirsiniz cat. ddtuhaf bir sözdizimine sahiptir ve genelliklecat doğru arabellek boyutunu bulamadığınızdan daha yavaştır . Arabellek boyutu için tek bir optimal değer yoktur, donanımınızın özelliklerine bağlıdır. Boyut çok küçükse, ddçok küçük transferler yapmak için zaman harcar. Boyut çok büyükse, ddbir sonrakini yazmaya başlamadan önce bir arabellek okuma zamanını boşa harcar. Diskten diske aktarım için en uygun boyut genellikle birkaç megabayttır (1024 bayt gülünç derecede küçüktür). catsizin için hiçbir çaba harcamadan iyi bir boyut seçecektir.


Evet, son bölümleri kaybetme konusunda iyiyim. Tüm disklerimde, tüm önemli şeyler her zaman disklerimin en küçük boyutlarına bile sığar. Bunun ötesindeki bölümler her zaman zorunlu değildir. 'Kedi' ile ilgili şey, bölümler veya bir MBR oluşturmayacağı (yanlış olmadıkça)
Ray Andrews

@rayandrews catTüm diski çalıştırırsanız , aynı bölümleri oluşturur (MBR bölümleri için bir uyarı ile düzenlememe bakın). Aynı şey geçerlidir dd, kullanmak ddsadece karmaşık bir yöntemdir cat. catBir bölüm üzerinde çalışırsanız , elbette bölüm oluşturmaz; bunun için fdisk / gdisk / parted /… kullanın.
Gilles 'SO- kötü olmayı kes'

Çok ilginç. Tamam, bana örnek bir komut gösterin, sonra deneyeceğim ve eğer iyi ise bu en iyi çözümdür.
Ray Andrews

@rayandrews Ne yapmak için örnek bir komut?
Gilles 'SO- kötü olmayı bırak'

Sadece bir diski kopyalamak için 'cat' kullanarak bir örnek komut. Kabul edebilmem için yeni bir cevap verin.
Ray Andrews

0

Başka bir okuyucu için faydalı olduğu kanıtlanırsa deneyimlerimi bu konuyla paylaşmak istiyorum. Son zamanlarda , bir NTFS bölümünün ilk 1 / 3'ünü arızalı bir sabit sürücüden kurtarmak ve bölümün kurtarılan bölümünü daha küçük bir sabit sürücüye başarıyla yeniden oluşturmak için DDRESCUE kullandım - böylece yakalanan dosyaları kurtarın (ve geri kalanını kaybedin). Aşağıda (kesinlikle bir HACKSAW yaklaşımı !!) yaparken yaptığım adımlar şunlardır ...

Kaynak sabit sürücü, MBR dosyalanabilir NTFS ile biçimlendirilmiş 750 GB'lık bir diskten oluşuyordu. Dosyaları yedeklemek için sadece birkaç kez kullanmıştım, bu yüzden dosyaların çoğu sürücünün başında, yaklaşık 160GB değerinde idi. Bir aile üyesi sabit diski (harici olarak monte edilmiş) yere çarptı - bundan sonra asla düzgün çalışmadı! Ddrescue kullanarak (titizlikle) sürücünün başlangıcının büyük bir bölümünü kurtarabildim. Fiziksel hasar nedeniyle, süreç boyunca çok sık kapanır ...

Ddrescue verilerini doğrudan çıkardığım 150GB'lık (harici olarak monte edilmiş) küçük bir dizüstü bilgisayar sabit diskim vardı. Alternatif olarak, verileri bir görüntü dosyasına çıkarabilirim ve daha sonra dosyayı monte edebilirdim, ancak verileri daha sabit olmak için doğrudan bir sabit sürücüye yazmayı düşündüm.

Kurtarmanın kilit püf noktası kurtarma sabit diskindeki MBR ve NTFS Önyükleme Sektörü verilerini el ile düzenlemekti. Bunu yapmadan, sabit sürücü herhangi bir işletim sistemi tarafından tanınmaz. Linux'ta bunu yapmak için uygun bir program bulamadım, bu yüzden pencerelere döndüm. Artık desteklenmeyen ancak yine de kullanışlı olan Windows Destek Araçları adlı kullanışlı bir paket var (aşağıdaki bağlantıya bakın)! Bölümü düzenlemek için kullandığım araç Disk Prob'dur. Sabit diskinizin son sektör değerini bildiğinizden emin olun (Ubuntu'da fdisk -l kullandım)

https://en.wikipedia.org/wiki/Windows_Support_Tools

İyi bir hesap makinesi ve yaratıcılık kullanarak sabit sürücüyü Windows'ta Disk Probuna yükledim ve son sektör değerlerini düzenledim. MBR'de iki değer kümesinin değiştirilmesi gerekiyordu: a) sabit sürücü uç sektörü ve b) NTFS bölüm sonu sektörü. NTFS Önyükleme Sektöründe, Toplam Sektörler bölümü değerinin değiştirilmesi gerekiyordu. Her durumda, daha küçük sabit sürücünün azalan "boyutu" ile eşleşmesi için sayısal değer azaltıldı (uç sektörler 750GB'dan 150GB'a değiştirildi). Bu değerleri düzenlemek için Görünüm sekmesini tıklayın.

NTFS Önyükleme Sektörü verilerini düzenleyen bir Disk Probunun görüntüsü Windows Destek Araçları - Disk Probu

Yukarıda belirtilen alanları düzenledikten sonra, Windows bölümü hasar görmüş de olsa geçerli bir bölüm olarak tanıdı. Komut istemine girdim ve Windows programını Chkdsk'i hasarlı sabit sürücüde çalıştırdım (chdsk D :). Bölümün dosyaya geri döndüğünü görmek heyecan vericiydi! Program, bölüm tablosunu yeniden oluşturdu ve hasarlı sabit sürücüden kopyalanan tüm dosyaları başarıyla yeniden eşledi. Kapsama alanı dışında (kopyalanmayan) dosyalar bulunamadı ve bu nedenle elendi.

Sonraki bölüm, pencereleri başarıyla dahil olan 150GB sabit sürücüyü yeniden oluşturduğu için nedenini anlamıyorum. Bununla birlikte, windows yerel olarak dosya görüntüleme için sabit disk bölümünü açamadı (bazı hatalar vardı). Ancak Ubuntu kurtarmaya! Ubuntu'ya yeniden başladım, harici sabit diski monte ettim ve sorunsuz bir şekilde kurtarılan tüm dosyalar geldi!

Umarım büyük bir sabit diskten daha küçük bir sabit diske dosya kurtarmanın bu demir testeresi yöntemi, kendimin yanı sıra diğer bazı kötü ruhlar için de yararlı olacaktır. Şerefe!


1
Bu cevaba açıkça çok fazla düşünce koydunuz. Ne yazık ki, soruya gerçekten cevap vermiyor. " ddrescueBir türevi değildir dd, ne de ilgilidir ddhem bir cihazdan gelen verilerin kopyalama için kullanılabilir olması dışında herhangi bir şekilde. Fark ddrescue Little'ın olarak neden başarısız diskler verileri kopyalama için sofistike bir algoritma kullanır Hasar mümkün. " - Wikipedia. Ayrıca, cevabınız öncelikle burada tipik bir yapılandırma olmayan bir Windows işletim ortamına odaklanmış gibi görünüyor
Fox

1
Orijinal sorgulayıcı olarak, Dan'ın deneyimini en yararlı buluyorum, umutsuz bir durumda neler yapılabileceğini bilmek iyi, tabii ki bu tam iplik için çevresel, ama çok katı olmayalım.
Ray Andrews

0

Önce kaynaktaki bölümleri daraltmanız gerekir (veya bu sınırların dışına çıkmanız gerekir).
Daha ddmuhtemelen kullanarak bölüm tablosu onarmak gerekir ve sonra gdisk /dev/sd<target>
tabloyu onarma ve tuş sırasını v r d w
sana gerekenden daha biraz daha küçük bölümler shring önermek ve sonra geri hedef diskin tam boyutta olacak şekilde genişler.
(Bu cevap, HDD'imi daha küçük bir SSD'ye kopyalarken kişisel deneyimime dayanmaktadır)


+1. Bu yöntem benim için de işe yarıyor: klonlama tüm bölümler hedef sürücüye sığdığında işe yarar :-) Sadece bir yorum: Bir GUID partii tablosu (GPT) yedek bölüm tablosunu onarmanız gerekir, ancak eski bir stil MSDOS varsa bölüm tablosunda, onarılacak yedek bölüm tablosu yoktur.
sudodus
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.