/dev/zero と /dev/urandom のファイルサイズが異なります。

/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/urandom3倍小さいのはなぜですか? testfile1.ranのサイズは1000M、testfile2.ranのサイズは2000Mになると予想しました。なぜこれが起こるのかを説明できる人はいますか?ランダムテストファイルを作成するにはどうすればよいですか?

答え1

ブロックサイズが大きいほど、読み取りが不完全になる危険があります。これは、ブロックデバイスではなくパイプから読み取るときにも頻繁に発生します。

count特定のサイズ(*)を受け取るには、そのbsサイズも提供する必要がありますiflag=fullblock

必要ないか小さいかもbs=1Mしれませんが、それでもお勧めです。

ddまた、不完全な読み取り数を表示しようとします。n+mn個の完全なブロックと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は一度の読み取りであまりにも多くのデータを提供したくありません。私のバージョンのddでは、直接使用するように指示することもありますiflag=fullbock

fullblockを使用すると、すべてがうまく機能します。

$ 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倍以上をコピーするため、時間がかかります。

関連情報