使用背景
在测试下载速度,或者测试加解密文件,亦或者制作文件系统时都需要一些指定大小的文件。Linux 有一些命令可以快速完成这样的任务。接下来介绍几个好用的命令。
空洞文件
在 Unix 文件操作中,操作文件的位移量可以大于文件的当前长度,在下一次写操作时,就会把文件撑大(Extend),在文件里创建空洞(Hole),没有被实际写入的部分都是 0。空洞文件是否占用实际磁盘空间由文件系统觉得,Linux 中空洞文件不占用实际磁盘空间。
fallocate
fallocate用于将块预分配给文件。对于支持fallocate系统调用的文件系统,这可以通过分配块并将其标记为未初始化来快速完成,因此不需要对数据块进行 I/O 操作。这是创建文件而不是用零填充的更快的方法。大文件几乎可以立即创建,而不必等待任何 I/O 操作完成。
语法:
fallocate [-n] [-o offset] -l length filename
d: 检测零并替换为空洞。-n:指定文件的大小,单位为字节。-o:指定文件的偏移量,可以跟二进制$2^{N}$后缀KiB,MiB,GiB,TiB,PiB和EiB(iB为可选,例如,K的含义与KiB的含义相同或后缀KB,MB,GB,PB和EB的十进制($10^{N}$)。-l:指定文件的大小,单位同上。-p, --punch-hole: 将某个范围替换为空洞 (连带打开 -n)。filename:指定文件名。
示例:
分配一个大小为512MB的文件,文件名为efi.img:
fallocate -l 512M efi.img
将efi.img文件中的0替换为空洞:
fallocate -d efi.img
从偏移 128M 的位置挖一个 10M 大小的洞
fallocate -p -o 128M -l 10M efi.img
dd
Linux dd 命令用于读取、转换并输出数据。dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出
dd 的原意为 data duplicator,但由于 dd 属于较低阶的资料处理工具,通常都会以管理者(root)权限来执行,如果稍有不慎,也很容易造成严重的后果(例如整颗硬碟的资料不见等等),所以有些人也把 dd 取名为 data destroyer。dd 指令教学与实用范例,备份与回复资料的小工具 - GT Wang
if=FILE: 指定输入文件,若不指定则从标注输入读取。这里指定为/dev/zero 是 Linux 的一个伪文件,它可以产生连续不断的 null 流(二进制的 0)。of=FILE: 指定输出文件,若不指定则输出到标准输出。bs=BYTES: 每次读写的字节数,可以使用单位 K、M、G 等等。另外输入输出可以分别用 ibs、obs 指定,若使用 bs,则表示是 ibs 和 obs 都是用该参数。count=BLOCKS: 读取的 block 数,block 的大小由 ibs 指定。
示例:
生成一个1g大小的文件,内容全为0,块大小为1M,文件名为efi.img:
dd if=/dev/zero of=efi.img bs=1M count=1024
生成一个1g大小的文件,内容为随机数,块大小为10M,文件名为efi.img:
dd if=/dev/urandom of=efi.img bs=10M count=1024
truncate
-s:指定文件的大小,可以跟二进制$2^{N}$后缀KiB,MiB,GiB,TiB,PiB和EiB(iB为可选,例如,K的含义与KiB的含义相同或后缀KB,MB,GB,PB和EB的十进制($10^{N}$)。
示例:
生成一个 100M 大小的文件,文件名为efi.img:
truncate -s 100M efi.img