ddのbsパラメータの最大値はいくらですか?

ddのbsパラメータの最大値はいくらですか?

STDINから指定されたバイト数を読み取る必要があるCGIを作成したいと思います。私の考えは次のとおりです。

dd bs=$CONTENT_LENGTH count=1

しかし、ブロックサイズがRAM以外のものによって制限されるかどうかを知りたいです。

$ dd bs=1000000000000
dd: memory exhausted by input buffer of size 1000000000000 bytes (931 GiB)

GNU coreutils のマニュアルページに制限はありません。

ベストアンサー1

POSIX仕様dd最大値を明示的に指定しないでください。しかし、いくつかの制限があります。

64ビットプラットフォームでは、size_t長さは64ビットです。また、符号がないため、2 64dd - 1より大きい値を指定すると失敗します。

$ dd if=/dev/zero of=/dev/null bs=18446744073709551616
dd: invalid number: ‘18446744073709551616’

64ビットx86 Linuxでは、入力制限であるSSIZE_MAX0x7ffffffffffffffffffL(実行して確認)です。echo SSIZE_MAX | gcc -include limits.h -E -

$ dd if=/dev/zero of=/dev/null bs=9223372036854775808
dd: invalid number: ‘9223372036854775808’: Value too large for defined data type

$ dd if=/dev/zero of=/dev/null bs=9223372036854775807
dd: memory exhausted by input buffer of size 9223372036854775807 bytes (8.0 EiB)

許容値が見つかった場合、次の制限は割り当て可能なメモリ量です。ddバッファを読み込む前にバッファを割り当てる必要があるからです。

割り当て可能な値が見つかると、read限界に達します(Linuxや同様の制限がある他のシステムの場合)。GNUを使用ddして指定しない限りiflag=fullblock:

$ dd if=/dev/zero of=ddtest bs=4294967296 count=1
0+1 records in
0+1 records out
2147479552 bytes (2.1 GB, 2.0 GiB) copied, 38.3037 s, 56.1 MB/s

231ddバイト未満のコピー、つまり上記のLinuxの制限は、私が必要とするものの半分にもなりません。

上記のQ&Aで説明されているように、fullblock1より大きい値については、いかなる場合でもすべての入力データを確実にコピーする必要があります。bs

おすすめ記事