/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/urandom小三倍?我预计 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

它需要更长的时间,因为它实际上复制了两倍以上的数据量。

相关内容