来自 /dev/zero 和 /dev/urandom 的不同文件大小

dor*_*and 10 linux dd

我想通过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
Run Code Online (Sandbox Code Playgroud)

输出是:

-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
Run Code Online (Sandbox Code Playgroud)

为什么生成的输出测试文件要/dev/urandom小三倍?我希望 testfile1.ran 的大小为 1000M,testfile2.ran 的大小为 2000M。任何人都可以为什么会发生这种情况?我应该如何生成随机测试文件?

fro*_*utz 18

使用更大的块大小,存在读取不完整的风险。从管道而不是块设备读取时,这种情况也经常发生。

如果您希望收到特定尺寸 ( count* bs),您还必须提供iflag=fullblock.

它可能不是必需的bs=1M或较小的,但仍然建议使用任何一种方式。

dd还将尝试向您展示它有多少不完整的读取。它复制n+m块,n 个完整的和 m 个不完整的。复制不是blocksize倍数的文件时,最后一个block不完整是正常的。

例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它只有不完整的读取,而不是一个完整的 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
Run Code Online (Sandbox Code Playgroud)

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