Dari spec :
- Jika
bs=
expr
operan ditentukan dan tidak ada konversi selain sync
,, noerror
atau notrunc
diminta, data yang dikembalikan dari setiap blok input harus ditulis sebagai blok output terpisah; jika read()
pengembalian kurang dari blok penuh dan sync
konversi tidak ditentukan, blok output yang dihasilkan harus sama dengan blok input.
Jadi ini mungkin yang menyebabkan kebingungan Anda. Ya, karena dd
ini dirancang untuk memblokir, secara default parsial read()
s akan dipetakan 1: 1 sampai parsial write()
s, atau sync
d pada ekor bantalan NUL atau karakter ruang untuk bs=
ukuran ketika conv=sync
ditentukan.
Ini berarti bahwa dd
adalah aman digunakan untuk menyalin data (w / tidak ada risiko korupsi karena membaca sebagian atau write) di setiap kasus tapi satu di mana ia sewenang-wenang dibatasi oleh count=
argumen, karena jika tidak dd
akan dengan senang hati write()
output dalam blok berukuran identik untuk mereka yang inputnya read()
sampai read()
benar-benar melewatinya. Dan bahkan peringatan ini hanya berlaku bila bs=
ditentukan atau obs=
yang tidak ditentukan, sebagai kalimat berikutnya di negara-negara spesifikasi:
- Jika
bs=
expr
operan tidak ditentukan, atau konversi selain sync
,, noerror
atau notrunc
diminta, input harus diproses dan dikumpulkan ke dalam blok output berukuran penuh sampai akhir input tercapai.
Tanpa ibs=
dan / atau obs=
argumen ini tidak masalah - karena ibs
dan obs
keduanya berukuran sama secara default. Namun, Anda bisa mendapatkan secara eksplisit tentang buffer input dengan menentukan ukuran yang berbeda untuk salah satu dan tidak menentukan bs=
(karena itu diutamakan) .
Misalnya, jika Anda melakukannya:
IN| dd ibs=1| OUT
... maka POSIX dd
akan write()
dalam potongan 512 byte dengan mengumpulkan setiap read()
byte tunggal ke dalam satu blok output.
Jika tidak, jika Anda ...
IN| dd obs=1kx1k| OUT
... POSIX dd
akan read()
maksimal 512 byte pada satu waktu, tetapi write()
setiap blok output berukuran megabyte (kernel memungkinkan dan mengecualikan yang terakhir - karena EOF) secara penuh dengan mengumpulkan input ke dalam blok output berukuran penuh .
Juga dari spec, meskipun:
count=n
- Salin hanya n blok input.
count=
peta ke i?bs=
blok, dan untuk menangani batas sewenang-wenang count=
portable Anda akan membutuhkan dua dd
s. Cara paling praktis untuk melakukannya dengan dua dd
s adalah dengan menyalurkan output dari satu ke input yang lain, yang tentunya menempatkan kita dalam bidang membaca / menulis file khusus terlepas dari jenis input asli.
Pipa IPC berarti bahwa ketika menetapkan [io]bs=
argumen bahwa, untuk melakukannya dengan aman, Anda harus menyimpan nilai-nilai tersebut dalam PIPE_BUF
batas yang ditentukan sistem . POSIX menyatakan bahwa sistem kernel hanya harus menjamin atom read()
dan write()
s dalam batas-batas PIPE_BUF
sebagaimana didefinisikan dalam limits.h
. POSIX menjamin bahwa PIPE_BUF
menjadi setidaknya ...
{_POSIX_PIPE_BUF}
- Jumlah maksimum byte yang dijamin atom saat menulis ke pipa.
- Nilai: 512
... (yang juga merupakan default dd
i / o blocksize) , tetapi nilai sebenarnya biasanya setidaknya 4k. Pada sistem linux yang terbaru, secara default, 64k.
Jadi ketika Anda mengatur dd
proses Anda, Anda harus melakukannya pada faktor blok berdasarkan pada tiga nilai:
- bs = (obs =
PIPE_BUF
atau lebih kecil)
- n = jumlah total byte yang diinginkan yang dibaca
- hitung = n / bs
Suka:
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
Anda harus menyinkronkan i / ow / dd
untuk menangani input yang tidak dapat dicari. Dengan kata lain, buat penyangga pipa eksplisit dan tidak lagi menjadi masalah. Itu untuk apa dd
. Kuantitas yang tidak diketahui di sini adalah yes
ukuran buffer - tetapi jika Anda memblokirnya ke kuantitas yang diketahui dengan yang lain, dd
maka penggandaan informasi yang sedikit dapat membuat dd
aman untuk digunakan untuk menyalin data (tanpa risiko korupsi karena membaca atau menulis sebagian) bahkan ketika secara sewenang-wenang membatasi input w / count=
w / sembarang tipe input sembarang pada sistem POSIX dan tanpa melewatkan satu byte pun.
Berikut cuplikan dari spec POSIX :
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.
Anda juga akan menemukan beberapa penjelasan yang lebih baik di sini .