我想通过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)
它需要更长的时间,因为它实际上复制了两倍多的数据量。
| 归档时间: |
|
| 查看次数: |
2189 次 |
| 最近记录: |