DD neden çok uzun sürüyor?


18

Bir diski diğerine kopyalamam gerekiyor. Aşağıdaki komutla denedim ve federo'da 1 TB disk kopyalamak neredeyse bir gün sürüyor.

dd if=/dev/sda of=/dev/sdb 

Aynısını aşağıdaki komutla Unix (HP-UX) sisteminde de denedim ve birkaç saat içinde tamamlandı

dd if=/dev/sda of=/dev/rdsk

Diskten diske daha hızlı kopyalamak için kullanabileceğim alternatif nedir?


2
cp /dev/sda /dev/sdbveya ( pv /dev/sda > /dev/sdb ilerleme çubuğu almak için) çok daha hızlı olurdu. Neden ddburada kullanasýn ki ? ddyalnızca conv=sync,noerrorhataları olan diskleri işlemek gibi şeyler için yararlı olabilir , ancak o zaman bile ddrescuebunun yerine bu tür şeyleri kullanmak daha mantıklı olacaktır (ayrıca bkz . pv' -Eseçeneği).
Stéphane Chazelas

1
@ StéphaneChazelas catdaha hızlı olabilir, ancak fark o kadar da çarpıcı değildir (cihazımdaki cihaz için denememdeki gibi dosyadan dosyaya daha büyük olabilir).
Gilles 'SO- kötü olmayı bırak'

8
"Aynı şeyi bir Unix sisteminde denedim" - Peki, bir Unix olmasaydı ilk olarak ne tür bir sistem denediniz ? Ayrıca, hangi donanım, vb, yaddayadda.
marcelm


HP-UX (Integrity blade) ve daha önce Solaris makinesinde de ilk kullanıldı.
KKD

Yanıtlar:


28

ddbirçok (garip) seçeneği vardır, bkz. dd (1) .

Arabellek boyutunu açıkça belirtmelisiniz, bu yüzden deneyin

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

IIRC, varsayılan arabellek boyutu sadece 512 bayttır. Yukarıdaki komut 16 megabayta ayarlar. Daha küçük bir şey deneyebilirsiniz (örneğin bs=1M) varsayılandan daha fazlasını kullanmalısınız (özellikle 4Kbayt, yani Gelişmiş Biçim sektörlerine sahip son disk donanımlarında ). En azından bir megabayt olan iki güç tavsiye ediyorum.

Varsayılan 512 bayt arabellek boyutu ile, donanımın çekirdeğin her 512 bayt bloğu için 4K aktarmasını gerektirdiğini tahmin ediyorum (ama çok yanlış olabilirim) .

İlgili rdsk, sd (4) man sayfaları ki:

Şu anda, yalnızca blok cihazlar sağlanmıştır. Ham cihazlar henüz uygulanmadı.

DD'nin arabellek boyutunun artması, okuma ve yazma işlemleri için size daha fazla performans sağlayacaktır. Artık tüm disklerde donanım okuma / yazma tamponu var. Ancak dd'nin tampon boyutunu donanım arabelleğinden daha fazla artıracaksanız, performansı düşecektir çünkü dd, ikinci disk kendi donanım arabelleğinden yazdığında ilk diskten arabelleğe okuyacaktır. bsFarklı cihazlar için her seferinde farklı değerlerde dd komutu ayarlamanız gerekir .


Rdsk Linux sistemlerinde kullanılabilir mi? Unix sistemlerinde kullandım.
KKD

1
Sayfa önbelleği, ne yaparsanız yapın muhtemelen 4Kb bloklarıyla ilgilenecektir, ancak bu 4Kb'yi okumak için dd'nin kaç sistem çağrısı kullandığını kontrol edebilirsiniz. Eminim yukarıda yazma yazma maliyetinin kaydedilen sistem çağrılarından daha pahalı olduğu, ancak tatlı noktanın nerede olduğu hakkında hiçbir fikrim yok.
Yararsız

Birkaç MB bir blok boyutu daha iyi varsayılan 512B daha ama ben benchmarked zaman bu bunu buldum catsadece yanı sıra (dosya sistemi-to-dosya sistemi transferi için, doğrudan bloğu-blokta farklı performans özelliklerine sahip olabilir) yoktu. Ancak fark her durumda dramatik değildi.
Gilles 'SO- kötü olmayı bırak'

1
İlginç bir şekilde, macOS'ta (SUS sertifikalı, btw) gerçekleştirirken hedef olarak kullanmak daha hızlıdır/dev/rdiskXdd .
adib

1
ne olup bittiğini merak ediyorsanız (yaptığım gibi) status=progresstüm operasyon ilerlemesini yazdıracak.
Aleksander Lech

17

Unix-land'da yıllar önce ddbir blok cihazı kopyalamak için gerekli yol vardı. (En azından Linux tabanlı sistemlerde) catneredeyse her zamankinden daha hızlı olmasına rağmen bu, kargo kült bilgisi olarak ilerlemiştir dd.

Bununla birlikte, geçmişte iyi bir blok boyutu bile, her sistem çağrısının bir G / Ç işlemini tetiklediği göz önüne alındığında, (yavaş) sistem çağrılarının sayısını azaltmaya yardımcı oldu. Varsayılan blok boyutu 512 bayttır (bir disk sektörü). Birden çok disk bloğunu tek bir okumada bir araya getirmek de kabul edilebilirdi. Bu örnekte 32 MB'lık bir blok boyutu kullanılmıştır:

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

Mevcut Linux tabanlı sistemlerde, diskler en verimli şekilde basit bir cat

cat /dev/source >/dev/target

(Sorunuzdaki yorumlarda belirtildiği gibi, pvyerine geçebilir catve size ilerleme ve verim göstergesi verecektir.)


3
Özellikle, dd'nin kullanılmasının nedeni, GNU cp'de bir hata ve 90'lı yılların başında linux çekirdeğindeki bir hataydı. Dd'yi tarihsel unix sistemlerinde kullanmanın nedenleri çok farklıydı ve tüm bir blok cihazını kopyalamak istemek, sıra dışı bir şeydi.
Random832

1
@ Random832 tüm bir diski kopyalamak isteyen olağandışı olurdu, ama etrafındaki bölümleri kopyalamaya ihtiyacım olduğunu hatırlıyorum (büyük olanlar - 150 hatta
200 MB

3
(Hataların özellikleri: çekirdek, disk kullanım boyutlarını yanlış bildirmiştir [cp'nin her kaynak dosyanın seyrek bir dosya olduğu sonucuna varması) ve cp, seyrek bir dosyadan bir aygıt hedefine kopyalanırken blokları sıfırlamamıştır. kaynağınızdaki blok zaten
çöpte

Bu tür bir cevabı seviyorum. Bilgi için teşekkürler. İşte senin yükselişin.
catbadger

7

Genellikle, ddbazı alternatifler lehine kaçınılabilir. ddrescueBunun yerine GNU kullanmak için birkaç iyi neden var . Ubuntu'da aşağıdakileri yükleyebilirsiniz:

sudo apt-get install gddrescue

ve sadece ddrescuekullanımı basit . Paket adından farklı olarak, yürütülebilir dosyada ilk adın bulunmadığını unutmayın g.

Kullanmak şu kadar basit:

ddrescue inputFile outputFile logFile

Günlük dosyası (seçtiğiniz herhangi bir adla adlandırılır), önceki işi yeniden yapmanıza gerek kalmadan duraklatmanıza / durdurmanıza ve yeniden başlatmanıza olanak tanır. Varsayılan olarak ilerleme durumunu, geçerli kopyalama hızını, ortalama kopyalama hızını ve bulunan bozuk blok sayısını görüntüler.

Blok boyutu için mantıklı varsayılanlar kullanır, bu nedenle kopyalama hızı her zaman cihazın işleyebildiği kadar hızlıdır, en azından tecrübemle (Bununla birlikte, tüm boyutlar ve türler ile yüzlerce sürücüyü klonladım).

Çoğu zaman, arızalanmaya başlayan sürücülerin zaman zaman yavaşlama, düşük ortalama hız, ani uzun duraklamalar (kötü sektörler) veya tam sıfırlamalar (ciddi yüzey hataları) gibi hız sorunları vardır. ddrescueyukarıdakilerin tümünü tanımlamanıza ve sürücünüz kendisini sıfırlasa bile klonunuzu (bir günlük dosyası belirtmeniz koşuluyla) yeniden başlatmanıza yardımcı olabilir.


6

Çok güzel bir soru. Ham arayüz bazı unix sistemlerinde (tru64, hpux, solaris) uygulanır ancak linux üzerinde uygulanmaz. Ham arabirim aktarımı hızlandırır çünkü unix I / O atlanır. Blok arayüzü ( /dev/dskveya /dev/disk), unix I / O sistemini kullandığından daha yavaştır. Hızlandırmak için dd(gnu dd can) kullanın bs=30Mveya bs=20Mhw'nize bağlı olarak. Kısa cevap: HAYIR, en azından bildiğim kadarıyla uygulanmıyor. Çekirdek sürüm 2.2 eski zamanlardan beri linux kullanıyorum ve rdskunix üzerinde hiç görmedim .


6
Neden ikisinin gücü olmayan bir blok boyutu öneriyorsunuz?
Basile Starynkevitch

2
@Disk bloğu boyutunun katları yeterlidir, bu nedenle 20MiB iyi olur.
roaima
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.