【Linux下快速创建100G文件】

在我们日常工作中,为了验证开发的功能,比如:文件上传功能或者算法的处理效率等,经常需要一些大文件进行测试,有时在四处找了一顿之后,发现竟然没有一个合适的,虽然 Linux 中也有一些命令比如:vim、touch 等可以创建文件,但是如果需要一个 100G 或者 1T 的大文件,这些命令就显得力不从心,此时就需要能快速创建大文件命令,接下来将介绍这些命令的常见用法、命令之间的差异、以及使用时如何选择。

dd命令

dd 命令的语法如下:

dd if=[source] of=[destination] bs=[block-size] count=[counter]

source读取并拷贝内容到 destinationsourcedestination 都是文件,前者是读取的文件,后者是写入的文件

bs 表示块的大小,单位是字节,后缀中带了字母 B的换算单位都是 1000, 比如: 1KB = 1000 Bytes、 1MB = 1000 * 1000 Bytes、1GB = 1000 * 1000 * 1000 Bytes

后缀省略了字母 B的换算单位是 1024, 比如: 1K = 1024 Bytes、 1M = 1024 * 1024 Bytes、1G = 1024 * 1024 * 1024 Bytes

count 表示块的数量,表示 dd 命令需要执行多少次读取并写入的操作

bs 乘以 count 其实就表示目标文件的大小,也即需要创建的文件的大小,比如:下面的命令可以创建一个 10G 大小的文件

root@adlink-aTCA-9300D# dd if=/dev/zero of=/home/adlink/Downloads/test.txt bs=1G count=10
记录了10+0 的读入
记录了10+0 的写出
10737418240 bytes (11 GB, 10 GiB) copied, 8.7252 s, 123 MB/s

root@adlink-aTCA-9300D:/home/adlink/Downloads# du -h test.txt 
10G	test.txt

上面的命令表示从 /dev/zero文件每次读取 1G大小的数据并写入当前目录中的 test.txt文件, bs=1G count=10 表示块大小是1G,总共有10个块, 所以目标文件最终的大小是: 1G * 10 = 10G

/dev/zero 是一个特殊的字符设备文件,当读取它的时候,它会返回空数据,这里表示从 /dev/zero读取空的数据写入 test.txt 中

命令 du -h test.txt 的结果也说明了 test.txt大小是 10G

从结果可以得知,用 dd 命令创建一个 10G 大小的文件花费了约 8.7 秒

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.txt 文件写入,每行的内容是: this is a test content , 一直到文件大小达到 10G

root@adlink-aTCA-9300D:/home/adlink/Downloads# time yes "This is a test content" | head -c 10G > yes.txt

real	1m24.895s
user	0m4.482s
sys	0m26.897s
root@adlink-aTCA-9300D:/home/adlink/Downloads# du -h yes.txt 
10G	yes.txt
root@adlink-aTCA-9300D:/home/adlink/Downloads# 

上述命令中的time命令是为了统计创建文件所消耗的时间,从结果来看,yes命令创建一个10G的文件花费时间要比dd命令要长一些。

fallocate命令

fallocate 命令可以通过下面的语法创建大文件。

fallocate -l [size of file] [name of file]

-l 选项表示文件大小,单位是字节,后面可以接K、KB、M、MB、G、GB等单位;
下面的命令是创建一个10G大小的文件:

root@adlink-aTCA-9300D:/home/adlink/Downloads# time fallocate -l 10G fallocate.txt

real	0m0.154s
user	0m0.000s
sys	0m0.013s
root@adlink-aTCA-9300D:/home/adlink/Downloads# du -h fallocate.txt 
10G	fallocate.txt
root@adlink-aTCA-9300D:/home/adlink/Downloads# 

从结果来看,fallocate命令创建一个10G大小的文件竟然只花费了0.013秒,通过du -h fallocate.txt命令查看创建的文件可以看出也确实创建出了10G的文件。

truncate命令

truncate命令是缩小或者扩展文件至指定大小,它的语法如下:

truncate -s [file -size] [name of the file]

-s 选项表示文件大小,单位是字节,跟 fallocate 命令一样,后面可以接 K、KB、M、MB、G、GB等单位

下面是使用 truncate 命令创建一个 10G的文件的示例

root@adlink-aTCA-9300D:/home/adlink/Downloads# time truncate -s 10G truncate.txt

real	0m0.028s
user	0m0.000s
sys	0m0.002s
root@adlink-aTCA-9300D:/home/adlink/Downloads# du -h truncate.txt 
0	truncate.txt
root@adlink-aTCA-9300D:/home/adlink/Downloads# 

从结果可以得到,truncate 命令 创建一个 10G的文件也只花费了 0.002 秒,和 fallocate 差不多。

但是通过du -h truncatefile 命令查询文件大小,结果表明 truncatefile 大小为 0。

原因是 truncate命令创建的是一个稀疏文件而不是实际的文件 ,稀疏文件不会占用磁盘空间。

注意:fallocate 命令只支持 btrfs、ext4、 ocfs2、xfs 这几种文件系统,而 truncate 命令支持所有的现代文件系统。

创建速度的差异

从上面的几个实例可以看出,同样是创建一个 10G的文件, fallocatetruncate 命令只需要不到 0.1 秒的时间,但是 dd 命令需要 8.7 秒的时间,yes 命令需要 13.2 秒,这中间相差了几百倍,为什么会有这么大的差别呢?

fallocate 将空间分配给文件,但是不会往文件中写入任何数据

truncate 创建的是稀疏文件,和 fallocate 一样,它也不会往文件中写入任何数据

ddyes 都有写文件操作,而这需要大量的 IO 时间,所以同样创建 10G 的文件,它们比 fallocatetruncate 要慢很多

如何选择

dd 、yes、fallocate、truncate 这几个命令都可以创建大文件, 在日常的使用中,我们该如何选择呢 ?

对速度没有很高的要求的情况下,一般首选 dd ,如果希望创建的文件中写入自定义的内容的话,使用 yes

如果想快速的创建大文件,比如 1 秒内创建一个 100G 的文件,选择 fallocatetruncate ,如果还需要确保文件是实际占用磁盘空间的话,就只剩下 fallocate 可选了。

大部分情况下,fallocate 都能满足要求,所以不想仔细分析的话,使用 fallocate 就行了。

小结

本文介绍了Linux下创建大文件的几种方法,并对所提供的方法进行了比较,最后提供了如何选择使用哪种方法的一些建议,文中只对 dd 、yes、fallocate、truncate 命令做了简要的说明,更多的介绍请参考 man 文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值