fallocate创建空洞文件

Fallocate特性目前在ext4、xfs、btrfs、SMB3中已经原生支持,部分功能需要特定版本与内核支持。

命令方式

Fallocate命令 ,如何瞬间创建一个10G的空洞文件。
命令:
fallocate -l 10G test.file
注:
fallocate命令可以为文件预分配物理空间。-l后接空间大小,默认单位为字节。也可后跟k、m、g、t、p、e来指定单位,可以是大写,分别代表KB、MB、GB、TB、PB、EB。
我们最常用-l参数即可。

API方式:

#include <fcntl.h>
int fallocate(int fd, int mode, off_t offset, off_t len);
fd就是open产生的文件描述符
offset就是进行fallocate的文件偏移位置
len为fallocate的的长度
offset和len一起构成了要释放的文件范围。

mode,它决定了fallocate的行为。
Allocating disk space
这是默认的操作,对应mode等于0。它所作的工作是如果分配从offset开始到offset+len的一段空间,这个是真的分配磁盘空间,不是空洞hole,新分配的空间以0填充数据。当然这个操作一般在offset+len大于现有文件长度时才会起到增加文件数据空间的作用。
一般情况下新增加空间后文件的size也会随着调整,但是有一个特殊情况,就是当FALLOC_FL_KEEP_SIZE出现在mode中时,在增加文件空间后不会改变文件的size。这样的操作算是一种在文件结尾处的预分配,对于后期的append写入操作有优化作用。
Deallocating file space
释放文件的某段范围的磁盘空间 (文件打洞)
FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE
此mode虽然并不会改变文件的大小,但其实却释放了offset和len所在范围的磁盘块,将它们归还给了文件系统。fallocate成功后,后续对offset和len所在的文件范围进行读操作,将会读到0。

FALLOC_FL_ZERO_RANGE特性就需要3.15以上内核。

参数描述可以参考man 2 fallocate

示例程序请参考:
https://blog.csdn.net/weixin_36145588/article/details/78822837
示例程序已测试通过。

参考资料

Linux:man 1 fallocate
Linux:man 2 fallocate
用fallocate进行"文件预留"或"文件打洞":https://blog.csdn.net/weixin_36145588/article/details/78822837

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值