Trim Enabler 在 Yosemite 上的适配问题 走向封闭的苹果帝国

前言

简而言之,SSD 的性能是会随着已使用容量的变化而改变的,Trim 功能可以让操作系统软件和 SSD 硬件通力合作,尽可能保持新盘的读写效率。

然后,众所周知,Apple 的生态圈是出了名的封闭。比如 Trim 这个 SSD 必备的 feature,OS X 只会在 Apple 御用的 SSD 上打开,而自己买的第三方则不行。

那么,我们需要给 OS X 的硬盘驱动(一个.kext文件)打个包,让其误认为现在这块 SSD 是御用的。这个方法在 10.9 以前都没有什么问题。但从 10.10 DP5 开始,OS X 只加载带有信任的签名的驱动。也就是说,10.10 要打开第三方的 trim,不仅要给 kext 打 patch,还要关闭签名验证。

症状

今天上午手贱用了一下 Trim Enabler,重启时杯具了:开机进度条到三分之一左右,苹果 LOGO 变成了一个灰色的禁止图标。

原因

根据判断,大概是没有正确关闭签名验证。

解决方案

  • 关机。按住⌘R的同时开机,进入安全模式。
  • 打开终端,键入以下命令(YourDisk 用你的系统分区名代替):
nvram boot-args=kext-dev-mode=1
cd /Volumes/YourDisk
touch System/Library/Extensions
kextcache -prelinked-kernel System/Library/Caches/com.apple.kext.caches/Startup/kernelcache\
  -K System/Library/Kernels/kernel System/Library/Extensions
  • 重启。有一部分人应该能解决问题了。如果没解决,继续往下走。
  • 依然进入安全模式,再打一遍上述命令(第一行nvram什么的就不需要了),重启。
  • 如果还不行,在执行kextcache一行时,观察有哪些行有invalid signature信息。记下有这些信息对应的 kext 名。
  • 进入/Volumes/YourDisk/System/Library/Extensions,删除第一个签名有问题的 kext (使用rm -rf)。重启。
  • 我到这儿就解决问题了。如果你还是不行,继续往下删除第二个、第三个带invalid signature的 kext。但注意不要删除诸如IOAHCIBlockstorage.kext等系统核心驱动。看名字,你会知道哪些能删哪些不能删的。

后记

目前,在 OS X 上使用第三方 SSD,Trim Enabler 依然是不二选择。据作者说,3.2.5 版已经可以在 10.10 DP5 上正常使用。

关于 kext 的签名机制,我翻译一段 Trim Enabler 开发者的话:

显然 Apple 想要屏蔽那些会对 OS X 体验有影响的应用。虽然禁用 kext 签名审查还能让 Trim Enabler 正常工作,我还是希望启用 Trim 的过程能更顺畅些。我第一个想到的是自己写一个内核扩展(kext)来达到目的。但这段详细资料说:

kext 签名意味着一个合法、被签名的内核扩展只能在给苹果交每年99刀保护费、拿到证书后才能创建。另外,开发者必须填一个表格来解释为什么他们需要这个证书。kext 证书只会在申请批准后发出。

Apple 现在用这种方式有效地控制着什么 kext 能在 OS X 上用,由此来控制开发者(比如我)写的什么新功能可以在 OS X 上实现。既然 Apple 已经花了这么大力气阻止第三方 SSD 拿到 Trim 的功能,我猜如果有个什么人写了这样一个(打开 Trim 功能的) kext 的话,申请证书环节也一定会被 Apple 拒。所以就目前而言,使用 Trim Enabler 3.2.5 或以上版本是在 OS X 上开启 Trim 的最好办法。

我相信 Apple 对 OS X 的这个新导向是不合适(unfortunate)的,其最终会以讨好初级用户为由大幅限制高级用户的手脚。我认为,「越狱」 Mac 的日子也不远了。

参考资料