前言
如题,这个问题笔者没有遇到,最早是一群老外 MDM 管理员发现并报告的,MDM 指的是 Mobile Device Management,是一套苹果公司针对企业推出的资产管理软件服务。打个比方,MDM 管理员相当于公司的 IT 资产管理员,可通过苹果的 MDM 系统远程管理公司的 Mac 电脑资产。
当然,无论是黑苹果还是白苹果,升级到新的 macOS 系统失败的原因多种多样各不相同,本文介绍的是其中一种概率非常高的特殊情况,主要出现在从 macOS High Sierra,macOS Mojave,macOS Catalina 升级到 macOS Big Sur 时失败,卡在第二次重启或第三次重启后的读条位置。主要影响的版本是 Big Sur 11.4 和 Big Sur 11.5,Big Sur 11.6 也有报告。
问题根源
当下述位置中的多个文件夹
/private/var/folders/*/*/C/com.apple.metadata.mdworker
拥有超过 2 万个文件时,升级到 Big Sur 有非常高的概率会失败。这些文件和文件夹主要和 Spotlight 功能关联,在重度 macOS 用户群体中,这些文件夹的文件总数甚至可以超过 50 万个。
解决方法
这里有两种情况,第一种是已经升级失败,由于有重要数据没有备份,想抢救一下的;另一种是,还没有升级,刚好看到本文,想自己也检查一下的;这里先说后一种,「提示」以下方法和步骤黑苹果和白苹果通用。
升级前检查
运行终端,输入以下命令:
sudo find /private/var/folders/*/*/C/com.apple.metadata.mdworker -type d | wc -l
然后输入你的开机密码(输入过程不会显示 * 号,输完直接回车),你会得到一个数字:
~ sudo find /private/var/folders/*/*/C/com.apple.metadata.mdworker -type d | wc -l
Password:
3229
然后输入另一个命令:
sudo find /private/var/folders/*/*/C/com.apple.mdworker.bundle -type d | wc -l
你会得到类似如下结果:
sudo find /private/var/folders/*/*/C/com.apple.mdworker.bundle -type d | wc -l
Password:
519
最后,如果你得到的总数不超过 2 万,那么升级时不会因这个原因卡住。
升级失败原因确认
如果升级失败了,症状和本文所述很类似,并且想找回重要数据,可以安装以下方法进行确认。「提示」以下方法黑白苹果通用。
白苹果:按住电源键强制关机,然后再开机,按住 Command + R 尝试进入恢复模式,当进入 Recovery 时,如果你启用了 FileVault2 或“查找我的 Mac”,系统可能需要你通过授权验证,验证通过后,即进入恢复模式;
黑苹果:在引导工具的系统选择界面,选择 macOS Recovery,经过短暂读条/跑码后,即进入恢复模式。如果你的界面没有 Recovery 选项,如果是 OpenCore,修改 config.plist → Misc → Boot → HideAuxiliary 改为 Disable;如果是 Clover,修改 config.plist → Gui(引导界面) → Hide Volume(隐藏卷) → 删除 Recovery。「提示」黑苹果强烈建议不要开启“查找我的 Mac”,黑果经不起苹果公司的 FMD 网络算法核验,不要自己给自己添堵。
进入 Recovery 后,打开磁盘工具,查看左侧是否已经显示了所有设备并且硬盘已经挂载。
确认硬盘已经挂载后,退出磁盘工具(左上角红色按钮),回到主界面,选择左上角菜单栏中的“工具”(Utilities)→“终端”(Terminal)。接下来在终端中执行以下命令:
「注意」很多人喜欢自己修改硬盘名称,所以在上一步磁盘卷位置那里,显示是什么名称,这里就需要改成什么名称。系统默认是 Macintosh HD - Data(中文系统是 Macintosh HD - 数据 )
find /Volumes/Macintosh\ HD\ -\ 数据/Previous\ System/private/var/folders/*/*/C/com.apple.metadata.mdworker -type d | wc -l
第二个命令:
find /Volumes/Macintosh\ HD\ -\ 数据/Previous\ System/private/var/folders/*/*/C/com.apple.mdworker.bundle -type d | wc -l
「注意」如果耗时太久,说明文件可能过多,此时可以按下 Control + C 终止执行,但终端仍然会给出一个停止前的结果。
执行结果可能如下:
-bash-3.2# ls /Volumes/Macintosh\ HD\ -\ 数据/Previous\ System/private/var/folders/*/*/C/com.apple.m
etadata.mdworker -type d | wc -1
ls: -type: No such file or directory
ls: d: No such file or directory
56715
至此,确定了升级失败极有可能是本文所述原因造成。
删除冗余文件
如果你还没有开始升级,那很简单,直接运行下面的两个命令:
sudo find /private/var/folders/*/*/C/com.apple.mdworker.bundle -mindepth 1 -delete
sudo find /private/var/folders/*/*/C/com.apple.metadata.mdworker -mindepth 1 -delete
每次复制执行 1 行命令即可。如果命令正确执行,首先会要求输入开机密码,然后就结束;如果返回错误,可尝试不使用 sudo,直接 find 就行。如果你的文件很多,这个过程应该会花一些时间。
如果你不想等,也可以尝试以下方案,直接删除整个 /private/var/folders/ 下的文件夹,这是可以的,macOS 后续会自动重建它:
rm -Rf /private/var/folders/*
如果升级已经失败了,在恢复模式下的终端中执行:
find /Volumes/Macintosh\ HD\ -\ 数据/Previous\ System/private/var/folders/*/*/C/com.apple.mdworker.bundle -mindepth 1 -delete
sudo find /Volumes/Macintosh\ HD\ -\ 数据/Previous\ System/private/var/folders/*/*/C/com.apple.metadata.mdworker -mindepth 1 -delete
同样每次执行 1 行。如果你不想等待,也可以直接删除 /private/var/folders/ 下的文件夹:
rm -Rf /Volumes/Macintosh\ HD\ -\ 数据/Previous\ System/private/var/folders/*
删除完成后,重新启动你的 Mac,再次尝试进入升级流程。白苹果一般来说应该就会成功了,黑苹果可能还会遇到其它问题😂,不过那是另一篇文章的内容了。