记一次 TimeMachine 存储瘦身-诺墨的博客站

前情回顾

当前的开发和工作主力机是 20 年买入的 2019 款 MacBook Pro(16-inch/2T/i9/64GB/5600M),在今年年初的时候曾因电池性能问题,在天才吧保内更换过一次电池。

当时在天才吧检测出机器主板上有一个 CPU 传感器存在故障,但因为机器属于定制机,零售店没有可用配件,需要专门下单调取新主板配件才能进行更换,遂作罢,只更换了 C 面键盘和全新电池。

事实上另一个原因是:19 款的 MacBook Pro 硬盘和主板是焊死的,更换配件意味着要抹掉系统,伴随的是本地大量数据文件的整理和软件开发环境的配置迁移,重装一次的代价对我无异于连续通宵熬上一周。当初买的时候敢花钱,AC+ 还有一年多,果断放弃,想着等快过保来换个新硬件也不错。。。=皿=。

故事的开始

最近设备因为散热问题频繁死机。趁着周末去了一趟天才吧,得知店内尚有一块匹配配置的主板配件,于是沟通预定,开始了整理文件做系统迁移的前期准备。

本想着把文件整理到 NAS 上就够了,登录到 NAS 后,意外发现 NAS 存储告警,心里瞬间一凉(两年前曾经坏过盘的阴影还在),以为又要坏盘了。仔细一看:存储良好,存储空间不够了。。。

记一次 TimeMachine 存储瘦身-诺墨的博客站

通过 群晖存储空间分析器 进行分析,发现是 时间机器(Time Machine)备份占用了大量空间。归根结底,还是平时只顾备份,却没有想着清理。于是有了这篇文章。清理 NAS 上的 Time Machine 存储

记一次 TimeMachine 存储瘦身-诺墨的博客站

时间机器命令行工具

Apple 为 时间机器备份管理提供了一个叫 tmutil 的命令行工具,对应翻译应该就是 Time Machine Util(时间机器实用程序)。能实现的功能可以通过 tmutil --help 进行查看,输出如下:

➜  ~ tmutil --help
Usage: tmutil version
Usage: tmutil enable
Usage: tmutil disable
Usage: tmutil startbackup [-a | --auto] [-b | --block] [-r | --rotation] [-d | --destination dest_id]
Usage: tmutil stopbackup
Usage: tmutil delete [-d backup_mount_point -t timestamp] [-p path]
Usage: tmutil deleteinprogress machine_directory
Usage: tmutil restore [-v] src ... dst
Usage: tmutil compare [-@acdefghlmnstuEX] [-D depth] [-I name]
       tmutil compare [-@acdefghlmnstuEX] [-D depth] [-I name] snapshot_path
       tmutil compare [-@acdefghlmnstuEUX] [-D depth] [-I name] path1 path2
Usage: tmutil setdestination [-a]  mount_point
       tmutil setdestination [-ap] afp://user[:pass]@host/share
Usage: tmutil removedestination destination_id
Usage: tmutil destinationinfo [-X]
Usage: tmutil addexclusion [-p|-v] item ...
Usage: tmutil removeexclusion [-p|-v] item ...
Usage: tmutil isexcluded item ...
Usage: tmutil inheritbackup machine_directory
       tmutil inheritbackup sparse_bundle
Usage: tmutil associatedisk [-a] mount_point volume_backup_directory
Usage: tmutil latestbackup [-m] [-t] [-d mount_point]
Usage: tmutil listbackups [-m] [-t] [-d mount_point]
Usage: tmutil machinedirectory
Usage: tmutil calculatedrift machine_directory
Usage: tmutil uniquesize path ...
Usage: tmutil verifychecksums path ...
Usage: tmutil localsnapshot
Usage: tmutil listlocalsnapshots <mount_point>
Usage: tmutil listlocalsnapshotdates [<mount_point>]
Usage: tmutil deletelocalsnapshots [<mount_point> | <snapshot_date>]
Usage: tmutil thinlocalsnapshots <mount_point> [purgeamount] [urgency]

查看时间机器快照并尝试删除

在这里,我仅用到了几个简单且常用的命令:

  • tmutil listlocalsnapshots: 列出当前本机的时间机器存储备份
  • tmutil listbackups: 列出当前使用的时间机器存储备份
  • tmutil delete: 删除指定的时间机器备份

第一个 tmutil listlocalsnapshots 在我的 MBP 本地存储空间告急的时候曾经帮了大忙,但这次并不会用到。选择使用 tmutil listbackups 查看 NAS 上的备份数据。

➜  ~ tmutil listbackups
2021-10-20-085701.backup
2021-10-31-043627.backup
...
2022-10-15-200347.backup
2022-10-15-225734.backup

果然好多没有意义的老备份。。。于是执行 tmutil delete 删除时间机器快照。

➜  ~ sudo tmutil delete 2021-10-20-085701.backup
Specify either a path or a mountpoint and timestamp
Usage: tmutil delete [-d backup_mount_point -t timestamp] [-p path]

怎么回事,要求指定一个路径或挂载点或时间戳?难道 ******.backup 并不是具体的挂载点名称?执行 tmutil machinedirectory 获取时间机器目录位置

➜  ~ tmutil machinedirectory
Password:
/Volumes/Normal's Mac Book Pro 16的备份

执行 cd /Volumes/Normal\'s\ Mac\ Book\ Pro\ 16的备份 && ls 查看当前挂载的时间机器存储文件列表,发现并没有如同 tmutil listbackups 命令显示的数据目录。

➜  /Volumes cd Normal\'s\ Mac\ Book\ Pro\ 16的备份 && ls
2022-10-15-225734.previous backup_manifest.plist

由于时间机器并不是完全按照目录形式进行存储,自然看不到。。心生一计,执行 open . 通过访达(Finder)打开,于是看到了日常不太可能会发现的一个时间机器管理界面。。Bingo~ 跟命令行内容对上了。

这个地方也是 Apple Time Machine 的设计导致,在终端下文件系统并不能让你看到备份的历史结构,因为 Time Machine 一开始就不是纯粹按照目录存储进行设计的。Apple 提供了时间机器管理工具,但却没有提供一个轻松进入这个界面的入口…… 也不知道是设计缺陷还是产品经理故意为之

记一次 TimeMachine 存储瘦身-诺墨的博客站

再次删除历史快照

接下去的操作就简单了,直接 GUI 上右击立即删除,确认后就相当于删除了你指定删除的快照了。再次执行 tmutil listbackups 查看,发现 2021-10-20-085701.backup 居然还在……

➜  ~ tmutil listbackups
2021-10-20-085701.backup
2021-10-31-043627.backup
...

重新查看 tmutil listbackups 的参数,发现可以带上 -m 执行:tmutil listbackups -m

➜  ~ tmutil listbackups --help
tmutil: unrecognized option `--help'
Usage: tmutil listbackups [-m] [-t] [-d mount_point]

➜  ~ tmutil listbackups -m
/Volumes/.timemachine/EB99225E-1A86-4610-A1D9-4326F69D3519/2021-10-20-085701.backup/2021-10-20-085701.backup
/Volumes/.timemachine/EB99225E-1A86-4610-A1D9-4326F69D3519/2021-10-31-043627.backup/2021-10-31-043627.backup
...
/Volumes/.timemachine/EB99225E-1A86-4610-A1D9-4326F69D3519/2022-10-15-200347.backup/2022-10-15-200347.backup
/Volumes/.timemachine/EB99225E-1A86-4610-A1D9-4326F69D3519/2022-10-15-225734.backup/2022-10-15-225734.backup

再试试 sudo tmutil delete -p

➜  ~ sudo tmutil delete -p /Volumes/.timemachine/EB99225E-1A86-4610-A1D9-4326F69D3519/2021-10-20-085701.backup/2021-10-20-085701.backup
/Volumes/.timemachine/EB99225E-1A86-4610-A1D9-4326F69D3519/2021-10-20-085701.backup/2021-10-20-085701.backup: Invalid deletion target (error 22)
Total deleted: Zero KB

额。。。老老实实面向搜索引擎,发现需要同时指定 -d-t,形式参考 sudo tmutil delete -d /Volumes/TimeMachineBackups -t XXXX-XX-XX-XXXXXX

➜  ~ sudo tmutil delete -d /Volumes/Normal\'s\ Mac\ Book\ Pro\ 16的备份 -t 2021-10-20-085701
(null): Resource busy (error 16)

emmmm,资源繁忙,感情是存储读写管理导致的问题。时间机器果然还是上一代的技术。。。断网重新接入 Wifi 释放磁盘链接,重新 tmutil listbackups 确保重新连上后,

➜  ~ sudo tmutil delete -d /Volumes/Normal\'s\ Mac\ Book\ Pro\ 16的备份 -t 2021-10-20-085701
Password:
1 backups deleted
➜  ~ tmutil listbackups
2021-10-31-043627.backup
2022-01-24-004051.backup
...
2022-10-15-200347.backup
2022-10-15-225734.backup

再次查看快照列表,快照已被成功删除。