ext4的“打洞”功能(punch hole)

最近看ext4代码,注意到了 punch hole (打洞)功能,就是可以把文件中间的一部分内容释放掉,但是剩余部分的文件偏移不变。

于是我问马涛同学这个punch hole一般用在什么场合。

马涛:可以用在虚拟机上,比如你从虚拟机里删掉了一个大文件,虚拟机可以用punch hole在虚拟硬盘把这个文件占用的空间释放掉

我:有哪款虚拟机这样做?

马涛:这是文件系统提供给虚拟机的一个feature,虚拟机有了这个feature的支持就可以节省硬盘空间。比如host上装了多台虚拟机,每个虚拟机都通过punch hole的方式来删除自己虚拟的大文件,这样一段时间后,虽然各虚拟硬盘加起来空间很大,但是实际占用的空间就很小。应该有虚拟机是这样做的,这个我没注意。

我:除了虚拟化呢?还有别的应用场景吗?

马涛:嗯....云计算应该也又用的吧

我:虚拟化,云计算,这都是新概念,早期做这个punch hole是干啥用的,就是早期的应用有吗?

马涛:....早期就是因为有了truncate来去掉文件的尾巴,那么出于逻辑完整,就需要一个调用来去掉文件的头或者中间,于是就有了这个punch hole

我:喔

事后我想了想,如果一个大文件,用户决定了文件中间的一段内容以后不需要再用到了可以删除了,在没有punch hole支持的情况下,似乎只能先mmap,然后memove把中间的内容覆盖掉,然后truncate缩短文件内容。而如果有了punch hole的支持,只需一个系统调用没有内存移动的开销,非常高效,虽然文件用 ls 看起来还是那么大,但实际占用空间(用 du -sh 看)已经缩短了。

也许数据库,搜索引擎里的大文件可以用上,我猜。


相关文章

分类

6 Comments

李帅 said:

昊兄,不知道在ext4或者btrfs中实现这样的功能难不,直接通过修改文件元数据快速切割合并大文件。

DongHao Author Profile Page said:

应该不是很难,但应用场景是?

大笨狗 said:

或许dd命令就可以干这个。

DongHao Author Profile Page said:

@大笨狗,dd命令可以把文件中间的空间释放掉?

深蓝加菲 said:

貌似这个功能很早就有了?还在虚拟机之前?unix高级编程还是哪本经典书就专门说过这个。场景可以是预先构造一个大文件,但是不需要付出相应的空间,就跟预先申请大片内存,但是不commit占用操作系统资源差不多?

DongHao Author Profile Page said:

@深蓝加菲,你说的“预先构造一个大文件”跟我说的“punch hole”应该不是一回事,“预先构造一个大文件”可以直接seek跳过一段offset然后再write,而punch hole是要在已经有完整的内容的大文件的中间“抹掉”一部门数据,同时这一段占用的磁盘空间也要确确实实的释放掉。

留言:

关于文章

This page contains a single entry by DongHao published on 07 27, 2011 2:38 PM.

低碳 was the previous entry in this blog.

看书 is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.