简短回答:“正在准备备份”是 Time Machine 在弄清自上次以来发生了哪些更改。通常它可以从系统维护的更改日志中读取。当该日志无法使用时,它会改为遍历磁盘上的每个文件,这就是四十秒与四小时的区别。
下一节的命令会告诉你是哪种情况,这样你就不用再猜了。
在复制任何一个字节之前,Time Machine 必须决定复制什么。macOS 维护着一份名为 FSEvents 的文件系统更改日志,情况好的时候,Time Machine 会向该日志询问自上次备份以来更改的所有内容,即使磁盘已满也只需几秒。
在情况不好时,该日志无法回答。这时 Time Machine 会退回到深度扫描,即把源上的每个文件逐一与上次备份进行比较。在一台有一百万个文件、大多数都很小的 Mac 上,复制任何东西之前就要花上好几个小时。进度条完全不会告诉你这些。两种情况它都显示“正在准备备份”。
两条命令,都不会改变任何东西。
tmutil status
查看 Percent 和 BytesCopied。在真正的准备阶段,两者都保持为零,这是正常的。你需要的是日志,它会明确说出走的是哪条路:
log show --predicate 'subsystem == "com.apple.TimeMachine"' --last 1h --info | grep -i -E "deep|event|scan|prepar"
出现提到 Deep event scan 或 event database is not usable 的行,就是答案。它在扫描所有内容。如果是关于读取事件和少量路径的行,说明更改日志正常,是别的东西慢。
如果想实时观察,按 Control-C 停止:
log stream --predicate 'subsystem == "com.apple.TimeMachine"' --info
没有更早的备份可供比较,整个磁盘都要读取。通过 USB 备份一块满盘,几个小时是正常的,通过 Wi-Fi 则要久得多。macOS 更新也会使更改日志失效,所以更新后的首次备份必然是深度扫描。插上电源,放一夜,第二天早上先检查再做其他事。
这是运行了一段时间的 Mac 上常见的情况。非正常关机、磁盘已满或修复过的宗卷都可能使 FSEvents 无法使用,此后每次备份都是深度扫描,直到有东西重建它。备份仍然能用,只是每次都要花上几个小时。
很多情况下,重启会重建启动宗卷的日志,这是最省事的尝试。
中断的备份会在目标上留下一个以 .inProgress 结尾的文件夹。Time Machine 在开始任何新任务之前都会尝试处理它,而在网络目标上,这一处理可能比备份本身还要久。在备份驱动器上查找:HFS+ 磁盘在 Backups.backupdb 中,APFS 磁盘在宗卷自己的文件夹中。
删除 .inProgress 文件夹只会丢掉一个未完成的备份,别的都不会动。每个已完成的备份都是独立的文件夹,不受影响。在 Finder 中把它移到废纸篓,清倒废纸篓,然后手动开始一次备份。
深度扫描受文件数量限制,而不是文件大小。一个 40 GB 的视频文件只需比较一次。一个 40 GB 的 node_modules 目录可能要比较两百万次。Xcode 的 DerivedData、npm 和 yarn 缓存、Docker 映像、Homebrew 的 cellar 和 Steam 游戏库是常见的元凶,而且每一个都可以重新生成。
在“系统设置”>“通用”>“时间机器”>“选项”中排除它们。这样做能同时缩短扫描和复制的时间,而且不会让你失去任何你想要找回的东西。
Time Machine 会把磁盘映像写到 NAS 或共享的 Mac 上,每一次文件比较都要经过网络。如果用无线网络,人又在房子的另一头,一次深度扫描可能要一整天。把 Mac 挪到路由器旁边,或者改用以太网,看看同样的备份能不能在一小时内完成。
如果它根本完成不了,问题更可能出在共享本身,而验证是弄清已有内容是否可读的方法。
.inProgress 文件夹产生的原因。可以从菜单栏项或用 tmutil stopbackup 安全地停止 Time Machine。“正在准备备份”是一个状态,无论任务一分钟后完成还是永远不会完成,状态都一样。你真正需要的数字是最后一次成功的备份何时完成,而 Time Machine 把它藏在一个需要打开的菜单后面。
Copy Shelter 在主屏幕上显示最后一次完成的备份距今多久,七天没有成功备份时会提醒你。它还会在工作时说明所处的阶段和正在处理的文件,所以耗时长的任务看起来就是耗时长,卡住的任务看起来就是卡住了。
而当备份真的完成时,“完成”只是对一份没人检查过的副本的说法。Copy Shelter 会按计划依据存储的哈希读回它,所以悄悄变得不可读的备份会在一个普通的周二被你发现。
更改日志正常时,无论磁盘多大,只需几秒到几分钟。退回到深度扫描时则需要几个小时。上面的日志命令会告诉你是哪种情况,这是唯一可靠的判断方法。
可以。在这个阶段还什么都没写入。从菜单栏的“时间机器”项停止它,或运行 tmutil stopbackup。在复制阶段强制退出或拔掉驱动器才有风险,这会留下一个 .inProgress 文件夹。
只有当你排除了无法替代的东西时才会。缓存、构建目录、包管理器文件夹和下载的游戏库都可以从网上重建。Mac 上该备份什么一文逐一介绍了这份清单。
那说明它在扫描源,还没有开始写入。驱动器活动从复制阶段才开始。如果一个小时的日志输出中完全没有来自 TimeMachine 子系统的内容,那么进程本身可能卡死了,下一步就是重启。
它要做同样的工作,也只有同样的两种做法,所以首次运行会读取所有内容。不同的是,它会说明处于哪个阶段、正在处理什么,而主屏幕上的分数计算的是最后一次完成的备份,绝不是刚开始的那次。
相关:Time Machine 提示空间不足、备份停止运行却毫无提示时,以及 Copy Shelter 与 Time Machine 对比。