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.有人为什么会这样?我该如何生成随机测试文件?
解决方法:
使用较大的块大小,存在获取不完整读取的风险.从管道而不是块设备读取时也会发生这种情况.
如果您希望收到一定的大小(计数* bs),您还必须提供iflag = fullblock.
对于bs = 1M或更小,它可能没有必要,但仍然推荐它.
dd还会尝试向您展示它获得了多少不完整的读数.它复制n m个块,n个完整块和m个不完整块.复制不是blocksize的多个文件时,最后一个块的不完整是正常的.
例:
$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
它需要更长的时间,因为它实际上复制了两倍以上的数据量.
标签:linux,dd
来源: https://codeday.me/bug/20190809/1629419.html