![/dev/zero 和 /dev/urandom 的文件大小不同](https://linux22.com/image/131859/%2Fdev%2Fzero%20%E5%92%8C%20%2Fdev%2Furandom%20%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%A7%E5%B0%8F%E4%B8%8D%E5%90%8C.png)
我试图通过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
它需要更长的时间,因为它实际上复制了两倍以上的数据量。