dd命令创建稀疏文件
文章主要是对使用dd命令创建稀疏文件的实践记录。
dd命令的帮助文档中对 seek=N skip N obs-sized blocks at start of output
解释道:略过输出文件前N * obs-sized的空间,然后再向of所指定的输出中写入 count * bs 的空间的数据。
dd if=/dev/zero of=/opt/data bs=1 count=1 seek=20971520
说明:
if=/dev/zero 指定输入为/dev/zero,即用0填充
of=/opt/data 写入到/opt/data文件
bs=1 表示一次读写1个字节,如果不指定单位则默认为byte
count=1 指定bs的数量,这里为1个bs
seek 表示在向of指定的文件写入0时,略过文件前$seek * bs大小的空间,然后再写入
bs * $count大小的数据
实践
seek指定数量,即dd帮助文档中提到的N
示例一:

说明:
ls -k参数显示文件的字节数,这里显示20971521个字节。
计算方式为:$seek * $bs(换算到byte) + $count * $bs(换算到byte),因此这里为:20971520 * 1 + 1 * 1 = 20971521byte,通过-h参数显示则为21M,为什么通过ls显示与通过du显示的结果不同呢,这就是稀疏文件(seek略过)的作用,稀疏文件仅是分配了一定数据量的空间,而实际占用没有这么多。
示例二

说明:
字节数为:20971520 * 1 * 1024 + 20 * 1 * 1024 = 21474856960byte
mydata文件略过前面的20971520K空间,实际写入数据的大小为20K,因此du命令看到的是20K
示例三

说明:
字节数为:20971520 * 1 * 1024 = 21474836480,这里指定的count为0,表示不会向文件中写入数据,因此mydata2文件实际占用空间为0
seek指定具体的大小,比如seek=2G, seek=200M
文件字节计算方式:将seek指定的大小换算到字节(byte),此时该字节数就表示帮助文档中标识的N,接下来的计算方式同上。
示例一

说明:字节数为:10 * 1024 * 1024 * 1024 + 1 * 1 = 10737418241
示例二

说明:字节数为:2 * 1024 * 1024 * 1024 * 5 * 1024 + 20 * 5 * 1024 = 10995116380160
示例三

说明:字节数为:100 * 1024 * 1024 * 1024 * 2 * 1024 = 219902325555200,指定count为0,因此文件的实际大小为0
结语
以上则是对dd命令创建稀疏文件操作的实践记录,希望一起学习、交流。
参考
Linux "man dd"帮助文档