dd
adalah dirancang untuk memblokir - biasanya alat terbaik yang Anda inginkan untuk membaca dari input berukuran variabel jika Anda membutuhkannya dilakukan segera karena dd
tidak akan buffer saat membaca ke dalam beberapa masa depan write()
(kecuali jika Anda sangat eksplisit mengkonfigurasinya seperti itu dengan obs lebih besar dari IBS) , tetapi akan sebaliknya write()
semua yang dibacanya segera setelah read()
itu (dan secara opsional memprosesnya) .
Berikut ini beberapa definisi penting :
ibs=
expr
- Tentukan ukuran blok input, dalam bytes, oleh (standarnya adalah 512) .
expr
obs=
expr
- Tentukan ukuran blok output, dalam bytes, oleh (standarnya adalah 512) .
expr
bs=
expr
- Atur ukuran blok input dan output ke
expr
byte, menggantikan ibs=
dan obs=
. Jika tidak ada konversi selain sync
,, noerror
dan notrunc
ditentukan, setiap blok input harus disalin ke output sebagai satu blok tanpa mengagregasi blok pendek.
Jadi Anda lihat, ketika ibs
dan obs
didefinisikan bersama sebagai bs
maka ibs
diutamakan - tetapi sebaliknya, jika Anda tertentu, maka baik obs
atau cbs
tidak.
Berikut adalah contoh yang ibs
paling penting. Anda mungkin melakukan sesuatu seperti ini jika Anda ingin melacak seberapa cepat /dev/random
kolam diisi ...
dd "ibs=$size" conv=sync "count=$lmt" \
if=/dev/random of="$somefile"
Asalkan if=
target dapat dibaca sama sekali, itu akan selalu menghasilkan file output berukuran sama, karena dd
akan sync
hronize blok read-in pada nulls. Dengan kata lain, jika dd
read()
s untuk input-blok $((size=10))
$((count=5))
kali dan read()
file mengembalikan 2 byte, lalu 8 byte, lalu 12 byte, lalu 2 byte, maka 4 byte, dd
akan menulis ke sesuatu yang lebih besar dari file seperti
2 read bytes 8NULs \
8 read bytes 2NULs \
10 read bytes 0NULs \
4 read bytes 6NULs \
4 read bytes 6NULs
... karena dd
, secara default, tidak menunda. Jadi, jika Anda perlu melacak streaming dan membatasi penulisan beberapa proses lainnya, dd
adalah alat untuk Anda.
Jika Anda hanya menulis sejumlah data ke file biasa, berlawanan dengan pernyataan lain yang dibuat di sini, Anda juga dapat menggunakan dd
ini - dan cukup mudah - tetapi Anda akan membutuhkan lebih dari satu dan faktor pemblokiran yang andal .
Misalnya, jika Anda melakukannya:
{ dd ibs="$size" obs="${size}x$block_factor" |
dd bs="${size}x$blockfactor" "count=$lmt"
} <infile >outfile
... yang pertama dd
akan buffer sebanyak mungkin ibs="$size"
blok input yang diperlukan untuk mengisi setidaknya satu obs="${size}x$block_factor"
blok output untuk setiap write()
ke pipa di antara itu dan yang kedua dd
. Ini berarti bahwa yang kedua dd
dapat membatasi output dengan andal count="$lmt"
karena semua write()
s yang pertama dibuat akan cocok dengan blokir i / o - terlepas dari berapa banyak read()
yang pertama dd
harus dilakukan untuk membuatnya jadi.
Dan itulah cara yang dapat Anda gunakan dd
untuk secara andal membaca pipa atau jenis file khusus lainnya - hanya dengan sedikit matematika.
/dev/random
akan memblokir jika tidak ada cukup entropi yang tersedia untuk menghasilkan jumlah digit yang Anda inginkan. hanya perlu waktu untuk mengumpulkan jumlah "acak" acak psuedo acak berkualitas tinggi ... Baik gunakan/dev/urandom
untuk nilai "acak" yang kurang acak, atau periksa kumpulan entropi Anda (dalam satu lingkaran, dan tunggu seperlunya) ...