shell dd命令在bs参数太大的时候会出现异常。
现有一个文件
$ ll
-rw-r--r-- 1 server server 2787518108 4月 11 14:13 filea
我们想用dd命令跳过开头16448字节,得到剩下的内容。
$ dd if=filea of=filea.23 bs=16448 skip=1;
169473+1 records in
169473+1 records out
2787501660 bytes (2.8 GB) copied, 3.80907 s, 732 MB/s
$ ll
-rw-rw-r-- 1 server server 2787501660 4月 12 16:17 filea.23
2787518108 - 2787501660 = 16448
此时得到的filea.23大小是预期的。
如果我们想用dd命令得到开头2787501100 Byte大小的内容,
$ dd if=filea.23 of=filea.2 bs=2787501100 count=1;
0+1 records in
0+1 records out
2147479552 bytes (2.1 GB) copied, 2.96711 s, 724 MB/s
$ ll
-rw-rw-r-- 1 server server 2147479552 4月 12 16:19 filea.2
我们并没有得到大小2787501100的文件,只得到了大小2147479552的文件。
这个值2147479552
是上限吗?
2147479552
的十六进制是 0x7ffff000
继续实验:
$ dd if=/dev/zero of=zero.2147479551 bs=2147479551 count=1
$ dd if=/dev/zero of=zero.2147479552 bs=2147479552 count=1
$ dd if=/dev/zero of=zero.2147479553 bs=2147479553 count=1
$ dd if=/dev/zero of=zero.2G bs=2147483648 count=1
$ dd if=/dev/zero of=zero.2Gminus1 bs=2147483647 count=1
不同的bs,得到的image的size如下:
-rw-rw-r-- 1 server server 2147479551 Apr 12 16:43 zero.2147479551
-rw-rw-r-- 1 server server 2147479552 Apr 12 16:43 zero.2147479552
-rw-rw-r-- 1 server server 2147479552 Apr 12 16:41 zero.2G
-rw-rw-r-- 1 server server 2147479552 Apr 12 16:42 zero.2Gminus1
其中
生成zero.2G时bs的参数为 1024 * 1024 * 1024 * 2
。
生成zero.2Gminux1时bs的参数为 1024 * 1024 * 1024 * 2 -1
。
即dd的bs的上限是2147479552
bs超过这个上限,就只能dd这么多了。