Özet: dddoğru kullanımı zor olan huysuz bir araçtır. Size söyleyen çok sayıda öğreticiye rağmen bunu kullanmayın. ddeklenmiş bir "unix sokak kredisi" havası var - ancak ne yaptığınızı gerçekten anlarsanız, 10 metrelik bir direğe dokunmamanız gerektiğini bilirsiniz.
ddreadblok başına sistem çağrısına tek bir çağrı yapar (değeri ile tanımlanır bs). readSistem çağrısının belirtilen arabellek boyutu kadar veri döndürdüğünün garantisi yoktur . Bu normal dosyalar ve blok aygıtlar için çalışma eğilimindedir, ancak borular ve bazı karakter aygıtları için çalışmaz. Bkz . Dd veri kopyalamak için ne zaman uygundur? (veya daha fazla bilgi için okunduğunda () ve yazarken () kısmi) . Eğer readsistem çağrı getiri az bir tam blok, daha sonra ddkısmi blok aktarır. Yine de belirtilen sayıda bloğu kopyalar, bu nedenle aktarılan toplam bayt miktarı istenenden azdır.
“Kısmi okuma” ile ilgili uyarı size tam olarak bunu söyler: okumalardan biri kısaydı, bu yüzden ddeksik bir blok aktarıldı. Blok sayımlarında, +1bir bloğun kısmen okunduğu anlamına gelir; çıktı sayımı olduğundan +0, tüm bloklar okundu olarak yazılmıştır.
Bu, verilerin rasgeleliğini etkilemez: yazılan tüm baytlar ddokuduğu baytlardır /dev/urandom. Ama beklenenden daha az baytınız var.
Linux'un /dev/urandomkeyfi büyük istekleri (kaynak: extract_entropy_userin drivers/char/random.c) barındırdığı için, ddnormalde onlardan okurken güvenlidir. Ancak, büyük miktarda veri okumak zaman alır. İşlem bir sinyal alırsa, readsistem çağrısı çıkış arabelleğini doldurmadan önce geri döner. Bu normal bir davranıştır ve uygulamaların readbir döngü içinde çağrılması gerekir ; ddtarihi nedenlerden dolayı bunu yapmaz ( ddkökenleri bulanıktır, ancak kendine özgü gereksinimleri olan ve asla genel amaçlı bir araç olarak uyarlanmayan bantlara erişmek için bir araç olarak başlamış gibi görünüyor). İlerlemeyi kontrol ettiğinizde, bu ddsürece okuma işlemini kesen bir sinyal gönderir . Kaç bayt olduğunu bilmek arasında bir seçeneğiniz varddtoplam kopyalar (kesintiye uğramamayı unutmayın - ilerleme kontrolü yok, askıya alma yok) veya ddşu ana kadar kaç bayt kopyalandığını bilmek , bu durumda kaç bayt kopyalayacağını bilemezsiniz.
ddGNU coreutils (gömülü olmayan Linux ve Cygwin'de bulunan) sürümü, bir döngüde (ve ditto için ) çağırmayı ve böylece her zaman tam blokları aktarmayı fullblocksöyleyen bir bayrağa sahiptir . Hata iletisi, onu kullanmanızı önerir; çok özel durumlar (çoğunlukla bantlara erişirken) dışında her zaman kullanmalısınız (hem giriş hem de çıkış bayraklarında) - hiç kullanırsanız , yani: genellikle daha iyi çözümler vardır (aşağıya bakın).ddreadwritedd
dd if=/dev/urandom iflag=fullblock oflag=fullblock of=file bs=1M count=1000000
Ne ddyapacağından emin olmanın bir başka olası yolu , 1 blok büyüklüğünü geçmek. Sonra blok sayımından kaç bayt kopyalandığını söyleyebilirsiniz, ancak readilkini okumadan önce a kesilirse ne olacağından emin değilim. bayt (pratikte çok olası değildir, ancak olabilir). Ancak, çalışıyor olsa bile, bu çok yavaş.
Kullanımıyla ilgili genel tavsiye ddolduğunu kullanmayındd . ddGenellikle cihazlara erişmek için düşük seviyeli bir komut olarak ilan edilmesine rağmen , aslında böyle bir şey değildir: cihaz dosyasında (tüm /dev/…) tüm sihir gerçekleşir dd, sadece veri kaybına neden olan yanlış kullanım için yüksek potansiyele sahip sıradan bir araçtır. . Çoğu durumda, en azından Linux'ta istediğinizi yapmanın daha basit ve daha güvenli bir yolu vardır.
Örneğin, bir dosyanın başlangıcında belirli sayıda bayt okumak için şunu çağırmanız yeterlidir head:
head -c 1000000m </dev/urandom >file
Makinemde hızlı bir karşılaştırma yaptım ve ddbüyük bir blok boyutu ile arasında herhangi bir performans farkı gözlemlemedim head.
Eğer başında bazı bayt atlamanız gerekiyorsa, boru tailiçine head:
dd if=input of=output count=C bs=B seek=S
<input tail -c +$((S*B+1)) | head -c $((C*B)) >output
İlerlemeyi görmek istiyorsanız lsof, dosya ofsetini görmek için arayın . Bu, karakter aygıtında değil, yalnızca normal bir dosyada (örneğin çıktı dosyası) çalışır.
lsof -a -p 1234 -d 1
cat /proc/1234/fdinfo/1
Boru hattındaki ek bir kalem pahasına pvbir ilerleme raporu ( dd's'den daha iyi) almak için arayabilirsiniz (performans açısından, zar zor algılanabilir).