1. fallocate和posix
fallocate这货是Linux特有的系统调用,并不符合POSIX标准,为了兼容posix标准的fallocate,glibc专门做了一个posix_fallocate函数,看名字就知道这个函数是对应posix标准实现的。然而它和我们要说的fallocate没有任何关系,虽然它从功能上好像是实现的fallocate的基本功能,但是本质上它们是两回事。fallocate是文件系统层提供的实现,它的很多特性必须得到文件系统底层的支持。而posix_fallocate是在上层的实现,就算文件系统底层不支持任何fallocate的操作,你也可以使用posix_fallocate。但是此时我更愿意用dd。。。
2. fallocate上的五种mode
先来看一下fallocate的定义:
int fallocate(int fd, int mode, off_t offset, off_t len);
很显然fallocate就是对fd所指向的文件的offset+len区间做mode指定的操作。那么这个mode就是我们要重点说的。事先声明,现在是2016-04-01,目前最新的Linux版本是Linus刚刚合并完成的Linux-v4.6-rc1。截至目前fallocate在不同的文件系统上共支持五种不同类型的操作,一一列举如下:
I. Allocating disk space
这是默认的操作,对应mode等于0。它所作的工作是如果分配从offset开始到offset+len的一段空间,这个是真的分配磁盘空间,不是hole,新分配的空间以0填充数据。当然这个操作一般在offset+len大于现有文件长度时才会起到增加文件数据空间的作用。
一般情况下新增加空间后文件的size也会随着调