在工作中,经常遇到想快速创建一个大文件,比如:创建一个100G的文件,达到提升磁盘使用率的目的,下面介绍几种创建大文件的方法。
1. dd命令
创建一个自定义大小的文件
语法
dd if=[source] of=[destination] bs=[block-size] count=[counter]
从 source 读取并拷贝内容到 destination, source 和 destination 都是文件,前者是读取的文件,后者是写入的文件
-
bs : 表示块的大小,单位是字节,如1M、1G、10G
-
count : 表示块的数量,表示 dd 命令需要执行多少次读取并写入的操作,bs 乘以 count 其实就表示目标文件的大小,也即需要创建的文件的大小
示例:创建一个10G的文件
dd if=/dev/zero of=/log/db.log bs=1G count=10
上面的命令表示从 /dev/zero文件每次读取 1G大小的数据并写入/log/db.log文件中, bs=1G count=10 表示块大小是1G,总共有10个块, 所以目标文件最终的大小是: 1G * 10 = 10G
/dev/zero 是一个特殊的字符设备文件,当读取它的时候,它会返回空数据,这里表示从 /dev/zero读取空的数据写入 /log/db.log 中
从结果可以得知,用 dd 命令创建一个 10G 大小的文件花费了约 32.1 秒
2. yes命令
dd 命令创建的是空字符的文件,如果想文件中包含自定义的字符,可以使用 yes 命令。
它的作用是循环输出一行指定的字符串,直到进程结束,为了控制文件的大小并打破循环,我们借助 head 命令来实现,使用 yes 命令创建包含指定内容文件的语法如下:
yes [string] | head -c [size of file] > [name of file]
-
string 是写入文件每一行的字符串
-
head -c [size of file] 是接收指定大小的字符串,单位是字节,后面也可以接 K、KB、M、MB、G、GB等单位
下面的实例是往 yes.log 文件写入,每行的内容是: this is a test content , 一直到文件大小达到 10G
time yes "This is a test content" | head -c 10G > yes.log
上述命令中的time命令是为了统计创建文件所消耗的时间,从结果来看,yes命令创建一个10G的文件花费时间和dd命令差不多。
3. fallocate命令
fallocate 命令可以通过下面的语法创建大文件。
fallocate -l [size of file] [name of file]
- -l 选项表示文件大小,单位是字节,后面可以接K、KB、M、MB、G、GB等单位;
下面的命令是创建一个10G大小的文件:
time fallocate -l 10G fallocate.log
从结果来看,fallocate 命令创建一个10G大小的文件竟然只花费了0.01秒,通过ll命令查看创建的文件可以看出也确实创建出了10G的文件。
创建速度的差异
从上面的几个实例可以看出,同样是创建一个 10G的文件, fallocate 命令只需要不到 0.1 秒的时间,但是 dd 和 yes 命令需要 20多秒,为什么会有这么大的差别呢?
-
fallocate 将空间分配给文件,但是不会往文件中写入任何数据
-
dd 和 yes 都有写文件操作,而这需要大量的 IO 时间,所以同样创建 10G 的文件,它们比 fallocate 要慢很多
如何选择
dd 、yes、fallocate 这几个命令都可以创建大文件, 在日常的使用中,我们该如何选择呢 ?
对速度没有很高的要求的情况下,一般首选 dd ,如果希望创建的文件中写入自定义的内容的话,使用 yes。
如果想快速的创建大文件,比如 1 秒内创建一个 100G 的文件,选择 fallocate
大部分情况下,fallocate 都能满足要求,所以不想仔细分析的话,使用 fallocate 就行了。