最近看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 看)已经缩短了。
也许数据库,搜索引擎里的大文件可以用上,我猜。
昊兄,不知道在ext4或者btrfs中实现这样的功能难不,直接通过修改文件元数据快速切割合并大文件。
应该不是很难,但应用场景是?
或许dd命令就可以干这个。
@大笨狗,dd命令可以把文件中间的空间释放掉?
貌似这个功能很早就有了?还在虚拟机之前?unix高级编程还是哪本经典书就专门说过这个。场景可以是预先构造一个大文件,但是不需要付出相应的空间,就跟预先申请大片内存,但是不commit占用操作系统资源差不多?
@深蓝加菲,你说的“预先构造一个大文件”跟我说的“punch hole”应该不是一回事,“预先构造一个大文件”可以直接seek跳过一段offset然后再write,而punch hole是要在已经有完整的内容的大文件的中间“抹掉”一部门数据,同时这一段占用的磁盘空间也要确确实实的释放掉。