Gönderen spec :
- Eğer
bs=
expr
işlenen belirtilen ve daha dönüşüm için diğer bir sync
, noerror
ya da notrunc
istenen, her bir giriş bloğu dönen verilerin ayrı bir çıkış bloğu olarak yazılır; Eğer read()
döner bir tam bloğun daha az ve sync
dönüşüm belirtilmemişse, elde edilen çıkış bloğu, giriş bloğu ile aynı boyutta olacaktır.
Demek muhtemelen kafan karışıyor. Evet, çünkü dd
edilir tasarlanmış varsayılan olarak, kısmi engelleme için read()
kısmi 1: s 1 eşleştirilir write()
s, ya da başka sync
kuyruk dolgusu NUL veya boşluk karakter üzerinde d bs=
zaman boyutu conv=sync
belirtilir.
Bu şu demektir dd
olan (bozulma riski / ağırlık nedeniyle kısmi okuma veya yazma için) kopyalama verisi için kullanılacak güvenli keyfi bir sınırlı edildiği her durumda ancak bir count=
argüman, çünkü aksi halde dd
olacak mutlu write()
aynı büyüklükte bloklar olarak çıkışında girişi tamamen read()
geçinceye kadar olanlara read()
. Ve hatta bu ihtar tek gerçek olduğunda bs=
belirtilen veya obs=
edilir değil Spec devletlerde hemen ertesi cümlede olarak, belirtilen:
- Eğer
bs=
expr
işlenen belirtilen veya daha dönüşüm başka değildir sync
, noerror
ya da notrunc
talep edilir, giriş işlem görecektir ve tam boyutlu çıkış bloklar halinde toplanan girdi sonuna ulaşılıncaya kadar.
Olmadan ibs=
ve / veya obs=
argümanlar bu önemli olamaz - çünkü ibs
ve obs
varsayılan olarak aynı boyutta her ikisi de. Ancak, açık alabilirsiniz belirterek girdi ara bellek hakkında farklı boyutlarda biri için ve değil belirterek bs=
(o önceliklidir çünkü) .
Örneğin, yaparsanız:
IN| dd ibs=1| OUT
... sonra bir POSIX dd
, her bir baytı tek bir çıkış bloğunda toplayarakwrite()
512 baytlık parçalar halinde olacaktır .read()
Aksi takdirde, eğer ...
IN| dd obs=1kx1k| OUT
... bir POSIX bir seferde en fazla 512 bayt dd
olacaktır , ancak her megabayt boyutlu çıktı bloğu (çekirdeğin sonuncuya izin veren ve hariç olan - hariç, çünkü bu EOF'dir) girişi tam boyutlu çıktı bloklarına toplayarak .read()
write()
Ayrıca, özelliklerinden olsa da:
count=n
- Sadece n giriş bloğunu kopyala .
count=
i?bs=
blokları eşler ve böylece keyfi bir sınırlamayı ele almak için count=
taşınabilir olarak iki dd
saniyeye ihtiyacınız olur . İki dd
s ile yapmanın en pratik yolu , bir çıktının bir başkasının girişine bağlanmasıdır; bu da bizi orijinal giriş türünden bağımsız olarak özel bir dosyayı okuma / yazma alanına sokar .
Bir IPC borusu [io]bs=
, güvenli bir şekilde yapmak için, bu tür değerleri sistemin tanımlanmış PIPE_BUF
limiti dahilinde tutmanız gerektiğini belirtir . POSIX, sistem çekirdeğinin yalnızca içinde read()
ve write()
içinde PIPE_BUF
tanımlandığı şekilde atom atomunu garanti etmesi gerektiğini belirtir limits.h
. POSIX garanti PIPE_BUF
olması , en azından ...
{_POSIX_PIPE_BUF}
- Bir boruya yazarken atomik olması garanti edilen maksimum bayt sayısı.
- Değer: 512
... (ayrıca varsayılan giriş dd
/ çıkış blok büyüklüğü olur ) , ancak gerçek değer genellikle en az 4k'dir. Güncel bir linux sisteminde, varsayılan olarak 64k'dir.
Dolayısıyla, dd
süreçlerinizi ayarlarken bunu üç değere dayalı bir blok faktörü üzerinde yapmalısınız :
- bs = (obs =
PIPE_BUF
veya daha az)
- n = okunan toplam bayt sayısı
- sayım = n / bs
Sevmek:
yes | dd obs=1k | dd bs=1k count=10k of=/dev/null
10240+0 records in
10240+0 records out
10485760 bytes (10 MB) copied, 0.1143 s, 91.7 MB/s
dd
Aranamayan girdileri işlemek için i / ow / ile senkronize etmeniz gerekir . Başka bir deyişle, boru tamponlarını belirginleştirin ve problem olmaktan çıkın. Bunun dd
için var. Buradaki bilinmeyen miktarın yes
arabellek boyutu - ancak bunu başka bir taneyle bilinen bir miktarın üzerine çıkarırsanız dd
, az miktarda bilgilendirilmiş bir çarpma dd
verilerin kopyalanması için güvenli hale getirebilir (kısmi okuma veya yazma nedeniyle bozulma riski olmadan)count=
herhangi bir POSIX sistemindeki herhangi bir isteğe bağlı giriş tipini isteğe bağlı olarak sınırsızken ve bir bayt eksik olmadan bile olsa .
İşte POSIX özelliklerinden bir pasaj :
ibs=
expr
- Giriş bloğu boyutunu bayt olarak belirtin (varsayılan 512) .
expr
obs=
expr
- Çıkış bloğu boyutunu bayt olarak belirtin (varsayılan 512) .
expr
bs=
expr
- İçin hem giriş hem de çıkış bloğu boyutlarını ayarlama
expr
bayt yerine geçer ibs=
ve obs=
. Daha dönüşüm için diğer ise sync
, noerror
ve notrunc
belirtilen her bir giriş bloğu kısa blok yığılmasma neden olmadan tek bir blok olarak çıkışına kopyalanmalıdır.
Ayrıca burada daha iyi anlatılanları da bulacaksınız .