仕様から:
- 場合
bs=
expr
オペランドを指定しないと以外に変換されるsync
、noerror
またはnotrunc
要求され、データは、各入力ブロックから返される個別の出力ブロックとして書き込まれなければなりません。場合read()
戻るフルブロックよりも少ないとsync
、変換が指定されていない、結果として得られる出力ブロックは、入力ブロックと同じサイズでなければなりません。
したがって、これがおそらくあなたの混乱の原因です。はい、ためがdd
されて設計され、デフォルトでは、部分的に遮断するためにread()
、部分的に1:sが1にマッピングされますwrite()
S、または他sync
にテールパディングNULまたはスペース文字に出日間bs=
時にサイズconv=sync
指定されています。
これは、手段dd
である(これは部分的な読み取りまたは書き込みの破損のリスクなし/ w)のコピーデータに使用するのに安全なすべての場合に、それを任意により制限される一count=
別段ので、引数dd
喜んであろうwrite()
同じサイズのブロックで、その出力入力が完全に完了するread()
まで入力があったものread()
に。さらには、この注意点はある唯一の真の時にbs=
指定されているか、obs=
されないスペックの状態では非常に次の文のように、指定されました:
- 場合
bs=
expr
オペランドを指定し、又は以外変換されていないsync
、noerror
またはnotrunc
要求され、入力が処理されなければならないフルサイズの出力ブロックに集め入力の終わりに到達するまで。
ibs=
および/またはobs=
引数がなければ、これは問題になりません- ibs
とobs
は両方ともデフォルトで同じサイズであるためです。ただし、(優先するため)を指定せずに、いずれかに異なるサイズを指定することにより、入力バッファリングについて明示的に取得できます。bs=
たとえば、次の場合:
IN| dd ibs=1| OUT
...次に、POSIX dd
はwrite()
、すべての単一バイトを単一の出力ブロックに収集することにより、512バイトのチャンクになりますread()
。
そうでなければ、あなたが...
IN| dd obs=1kx1k| OUT
... POSIX dd
は一度にread()
最大 512バイトですが、フルサイズの出力ブロックに入力を収集することにより、write()
メガバイトサイズのすべての出力ブロック(EOFであるため、おそらく最後のカーネルを許可および除外します)。
ただし、仕様からも:
count=
i?bs=
ブロックにマップするため、count=
移植性のある任意の制限を処理するには、2が必要dd
です。2つdd
のsでそれを行う最も実用的な方法は、一方の出力を別の入力にパイプすることです。これにより、元の入力タイプに関係なく、確実に特殊ファイルの読み取り/書き込みの領域に入れられます。
IPCパイプと[io]bs=
は、安全に指定するために、システムで定義されたPIPE_BUF
制限内にそのような値を維持する必要がある引数を指定することを意味します。POSIXは、システムカーネルがで定義されている範囲内のatomic read()
とwrite()
s のみを保証する必要があると述べています。POSIXは、それは保証すること、少なくとも ...PIPE_BUF
limits.h
PIPE_BUF
{_POSIX_PIPE_BUF}
- パイプへの書き込み時にアトミックであることが保証される最大バイト数。
- 値:512
... (これはデフォルトのdd
I / Oブロックサイズでもあります)が、実際の値は通常少なくとも4kです。最新のLinuxシステムでは、デフォルトで64kです。
したがって、dd
プロセスをセットアップするときは、次の3つの値に基づいたブロックファクターで実行する必要があります。
- bs =(obs =
PIPE_BUF
以下)
- n =読み取った合計バイト数
- カウント= n / bs
好む:
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
シークできない入力を処理するには、i / ow /を同期する必要があります。言い換えれば、パイプバッファを明示的にすると、問題がなくなります。それdd
が目的です。ここでの不明な量はyes
のバッファサイズです-ただし、既知の量に他の量をブロックする場合dd
、少し情報に基づいた乗算でdd
データのコピーに安全に使用できます(部分的な読み取りまたは書き込みによる破損のリスクなし)count=
任意のPOSIXシステムで任意の入力タイプを使用して任意の入力を任意に制限する場合でも、1バイトが欠落することはありません。
POSIX仕様の抜粋を次に示します。
ibs=
expr
- 入力ブロックサイズをバイト単位で指定します(デフォルトは512)。
expr
obs=
expr
- 出力ブロックサイズをバイト単位で指定します(デフォルトは512)。
expr
bs=
expr
- 両方の入力と出力ブロックサイズを設定し
expr
、バイト取って代わるibs=
とobs=
。より変換なし他の場合sync
、noerror
およびnotrunc
指定され、各入力ブロックはショートブロックを集約することなく、単一のブロックとして出力にコピーされなければなりません。
また、ここで説明されているものもあります。