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になると予想しました。なぜこれが起こるのかを説明できる人はいますか?ランダムテストファイルを作成するにはどうすればよいですか?
答え1
ブロックサイズが大きいほど、読み取りが不完全になる危険があります。これは、ブロックデバイスではなくパイプから読み取るときにも頻繁に発生します。
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は一度の読み取りであまりにも多くのデータを提供したくありません。私のバージョンの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倍以上をコピーするため、時間がかかります。