重建 Kernel Extension Cache 以解决 macOS 无法关机或重启的问题

上周末我的 MacBook Pro 拿去修了键盘,昨晚正式取了回来,我重装了 Mojave 系统并从 Time Machine 恢复了数据,想着终于可以好好干活了。今天上午正准备升级到 Catalina,却发现系统始终无法重启成功,于是又了这次折腾 macOS 的经历。

正如标题所说的那样,这次折腾总结起来就一句话:重建 Kernel Extension Cache 以解决 macOS 无法关机或重启的问题。我主要写总结一下整个排查过程。

遇到问题

早上我想先升级 Mojave 的安全更新,然后再升级 Catalina,却发现始终卡在重启的界面,只能强制关机。我先怀疑是 Mojave 的安全更新包有问题,于是我直接升级 Catalina,想不到问题一样,甚至我重装 Mojave,也是一样。

直觉告诉我重启有问题,于是我试着啥也不做,只是关机或重启,果然也失败了。强制重启进入系统后,我查看 Console 里面的 system.log,发现卡在这里就没有更多日志了:

Oct 31 11:16:38 TualatrixdeMacBook-Pro loginwindow[99]: There are still active callers

我去搜索相关资料,找不到什么有用的。于是开始了各项排查:

尝试通过终端重启

sudo shutdown -h now

输完命令后,卡在了:

shutdown: / is busy updating; waiting for lock

不知道怎么解决,没有用。虽然终端重启没有用,但至少让我有了后面的更精准的定位问题的方式。毕竟普通重启的话,电脑就卡在黑色+光标的界面,然后什么也做不了。

重置 NVRAM 或 PRAM

根据这篇文章《重置 Mac 上的 NVRAM 或 PRAM》,重置 NVRAM,没有用。

安全模式重启

强制重启电脑,然后按 Shift,进入 macOS 的安全模式,发现能重启成功,这说明载入系统必须的组件是没有问题的,问题可能出在有 Kernel Extension 上。

后来我搜到了一篇帖子,Unable to reboot or shutdown through software,有个回复说,他也遇到了重启问题,后来发现杀掉 kextd 就能重启成功。

我试着 sudo reboot,卡住以后,再手动去杀 kextd 进程,果然就重启成功了。看来问题在 Kernel Extension 无疑了。

重建 Kernel Extension

后来我的思路就变成找到那个出问题的 Kernel Extension,但是怎么找呢?不如先重建一下 Kernel Extension Cache。于是打开终端,执行了这条命令:

sudo touch /System/Library/Extensions && sudo kextcache -u /

可能要执行多次,也可能要在安全模式进行(至少我是的)。重建成功后,我尝试重启电脑。终于,一切正常了…更新系统安全包也能正常进行了。

总结

我猜测,电脑维修后,因为更换了零部件,导致了新硬件和 Kernel Extension Cache 发生了不可描述的冲突,于是就造成电脑无法重启等等怪现象。我这个猜测可能是错的,但至少本次折腾是和这个有关。

这次折腾让我回到了很多年前折腾 Linux 的时代,但是我用 macOS 就是为了省心和不折腾,偏偏近年来系统 Bug 越来越多(这次不算),还是希望 Apple 多花点力气在做稳系统上…

欢迎使用图拉鼎和他的团队开发的作品

One Switch - 多功能开关工具

常驻 macOS 菜单栏的开关工具,可以快速开关 AirPods、睡眠模式、切换黑暗模式等。

2 Comments

我尿得比你远

厉害了

炼金

十分感谢,非常有帮助!

Leave a Comment