使用背景

在测试下载速度,或者测试加解密文件,亦或者制作文件系统时都需要一些指定大小的文件。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}$后缀KiBMiBGiBTiBPiBEiBiB为可选,例如,K的含义与KiB的含义相同或后缀KBMBGBPBEB的十进制($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}$后缀KiBMiBGiBTiBPiBEiBiB为可选,例如,K的含义与KiB的含义相同或后缀KBMBGBPBEB的十进制($10^{N}$)。

示例: 生成一个 100M 大小的文件,文件名为efi.img

truncate -s 100M efi.img

参考

Linux 文件空洞与稀疏文件