APFS是苹果新出品的文件系统,拥有很多新特性,比如拷贝文件时是浅拷贝(也就是说复拷贝一个10GB的文件,磁盘占用量并不会增加10GB,而是几乎没有增加),在真正修改时也只保存修改的部分。还有其他更多的新特性,这里不再赘述了,因为这不是本文的重点。

本文的重点在于,有些新特性可能导致很多在“系统信息”层面的可用空间,在实际上并不一定完全可用。为什么呢?

原来APFS有一些新特性会隐藏的占用很多磁盘空间,在采用完全兼容APFS的系统调用时,如果系统空间不足,这部分占用空间将会自动释放。比如“iCloud云盘”就会在系统空间不足时,自动释放掉缓存在本地的内容,从而给系统释放回空间。再比如,在Finder中通过Command+I查看磁盘的信息,就会看到有“可清除”空间的提示:

APFS空间占用

但是很多应用并不能完全兼容APFS的系统调用,所以往往无法兼容到这一特性,获取并使用到这部分磁盘。比如最简单的,直接在终端中执行df命令,返回的可用空间就不会包括这类“可自动释放”的空间。

这部分空间里,有个大头,就是被称作TimeMachine本地快照的东东。TimeMachine大家都知道,是在外置磁盘或者时间胶囊里,用于保存当前系统过去一段时间的磁盘快照的一种服务。这服务只会占用外置磁盘或者时间胶囊的磁盘空间。

然而,在APFS文件系统里,系统在磁盘本地(而非外置的TimeMachine磁盘)也会保存本地级别的快照。默认情况下,即便是没有设置和挂载外置TimeMachine磁盘,也能打开TimeMachine时光机,回溯文件的历史快照。这部分快照的保存频率、数量取决于当前磁盘的大小和剩余空间。

虽然这是苹果从用户体验上去做的“优化”。但是顶不住我们有时候真的需要这些“可释放空间”真正释放出来。比如使用iTunes为iOS设备备份的时候,就必须要“真实可用的剩余空间”,而非“名义上的剩余空间”。这个时候应该怎么操作呢?这就要祭出我们的大杀器——tmutil工具了。

首先,列出所有的本地快照

sudo tmutil listlocalsnapshots /

该操作回返回类似下面结果。

com.apple.TimeMachine.2017-12-07-205337 com.apple.TimeMachine.2017-12-07-230541

每一行对应一个快照。快照名格式是com.apple.TimeMachine.的前缀加上一个快照编号。要删除对应的快照,只需要执行:

sudo tmutil deletelocalsnapshots 快照编号

例如:

sudo tmutil deletelocalsnapshots 2017-12-07-205337