Özet: dd
doğru kullanımı zor olan huysuz bir araçtır. Size söyleyen çok sayıda öğreticiye rağmen bunu kullanmayın. dd
eklenmiş 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.
dd
read
blok başına sistem çağrısına tek bir çağrı yapar (değeri ile tanımlanır bs
). read
Sistem ç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 read
sistem çağrı getiri az bir tam blok, daha sonra dd
kı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 dd
eksik bir blok aktarıldı. Blok sayımlarında, +1
bir 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 dd
okuduğu baytlardır /dev/urandom
. Ama beklenenden daha az baytınız var.
Linux'un /dev/urandom
keyfi büyük istekleri (kaynak: extract_entropy_user
in drivers/char/random.c
) barındırdığı için, dd
normalde onlardan okurken güvenlidir. Ancak, büyük miktarda veri okumak zaman alır. İşlem bir sinyal alırsa, read
sistem çağrısı çıkış arabelleğini doldurmadan önce geri döner. Bu normal bir davranıştır ve uygulamaların read
bir döngü içinde çağrılması gerekir ; dd
tarihi nedenlerden dolayı bunu yapmaz ( dd
kö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 dd
sürece okuma işlemini kesen bir sinyal gönderir . Kaç bayt olduğunu bilmek arasında bir seçeneğiniz vardd
toplam 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.
dd
GNU 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ı fullblock
sö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).dd
read
write
dd
dd if=/dev/urandom iflag=fullblock oflag=fullblock of=file bs=1M count=1000000
Ne dd
yapacağı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 read
ilkini 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 dd
olduğunu kullanmayındd
. dd
Genellikle 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 dd
bü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 tail
iç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 pv
bir ilerleme raporu ( dd
's'den daha iyi) almak için arayabilirsiniz (performans açısından, zar zor algılanabilir).