使用背景
在测试下载速度,或者测试加解密文件,亦或者制作文件系统时都需要一些指定大小的文件。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