web-dev-qa-db-ja.com

/ dev / zeroおよび/ dev / urandomとは異なるサイズのファイル

ddコマンドを使用してランダムな1Gテストファイルを作成しようとしています。

dd status=progress if=/dev/zero of=/tmp/testfile.zer bs=100M count=10
dd status=progress if=/dev/urandom of=/tmp/testfile1.ran bs=100M count=10
dd status=progress if=/dev/urandom of=/tmp/testfile2.ran bs=100M count=20

出力は次のとおりです。

-rw-rw-r-- 1 dorinand dorinand  320M dub 21 12:37 testfile1.ran
-rw-rw-r-- 1 dorinand dorinand  640M dub 21 12:37 testfile2.ran
-rw-rw-r-- 1 dorinand dorinand 1000M dub 21 12:37 testfile.zer

なぜ出力テストファイルは/dev/urandomから3倍小さく生成されるのですか? testfile1.ranのサイズは1000M、testfile2.ranのサイズは2000Mになると思います。なぜこれが起こっているのですか?ランダムなテストファイルをどのように生成する必要がありますか?

10
dorinand

ブロックサイズが大きいと、読み取りが不完全になるリスクがあります。これは、ブロックデバイスではなく、パイプから読み取るときにもよく起こります。

特定のサイズ(count * bs)を受け取ることが予想される場合は、iflag=fullblockも指定する必要があります。

bs=1M以下では必要ない場合がありますが、どちらの方法でも推奨されます。

ddはまた、それが取得した不完全な読み取りの数を表示しようとします。 n+mブロック、n個の完全なブロック、m個の不完全なブロックをコピーします。ブロックサイズの倍数ではないファイルをコピーする場合、通常、最後のブロックが不完全になります。

例:

$ dd status=progress if=/dev/urandom of=/dev/null bs=100M count=20 
dd: warning: partial read (33554431 bytes); suggest iflag=fullblock
536870896 bytes (537 MB, 512 MiB) copied, 2 s, 254 MB/s
0+20 records in
0+20 records out
671088620 bytes (671 MB, 640 MiB) copied, 2.64391 s, 254 MB/s

この場合、それは不完全な読み取りのみを取得し、単一の完全な100Mブロックは取得しませんでした。明らかに、/ dev/urandomは、1回の読み取りでその量のデータを提供することに消極的です。私のバージョンのddでは、iflag=fullbockを直接使用するように指示されています。

フルブロックですべてがOKです:

$ dd status=progress if=/dev/urandom of=/dev/null bs=100M count=20 iflag=fullblock
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 8 s, 255 MB/s 
20+0 records in
20+0 records out
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 8.22914 s, 255 MB/s

実際には2倍を超える量のデータをコピーするため、時間がかかります。

17
frostschutz