仕様から:
- 場合
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_BUFlimits.hPIPE_BUF
{_POSIX_PIPE_BUF}
- パイプへの書き込み時にアトミックであることが保証される最大バイト数。
- 値:512
... (これはデフォルトのddI / 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指定され、各入力ブロックはショートブロックを集約することなく、単一のブロックとして出力にコピーされなければなりません。
また、ここで説明されているものもあります。