【问题标题】:kernel extension is not always loaded at boot time on OSX在 OSX 上,内核扩展并不总是在启动时加载
【发布时间】:2016-09-15 02:20:41
【问题描述】:

我确实有一个使用 IOKitPersonalities 的 USB 设备的内核扩展。重新插入其中一个设备,kext 将始终按预期加载,但对于在启动时已连接的设备,这有时会失败。在这种情况下,设备本身可以被系统识别,并且可以在 SystemInformation/USB 中找到。 Icon 是来自苹果的标准黄色图标,而不是我们 kext 提供的绿色图标。 一个有趣的事实: 当我连接了两台设备时,一台直接在 mac pro 上,另一台在键盘集线器上,可能只有集线器上的一个会触发 kext 加载。这个在 syslog 中总是比另一个晚大约 2 秒:

27.04.16 10:17:58,000 kernel[0]: USBMSC Identifier (non-unique): 000003448813 0x64f 0x3e9 0x100, 1  
...  
27.04.16 10:17:59,000 kernel[0]: USBMSC Identifier (non-unique): 000000506497 0x64f 0x3e9 0x100, 1  
...  
27.04.16 10:18:01,000 kernel[0]: XXXXXXX KEXT.5G/K64 (Version: 5.20.078 - G) loaded.

如果所有设备都被成功识别,“Kext 加载行”将在每个设备之后找到。

关于 kext 的一些事实:
- 它被安装到 /Library/Extensions (系统/库/前 Mavericks 的扩展)。根据http://asciiwwdc.com/2013/sessions/707 去的地方。
- 已签名(在 SystemInformation/Software/Extensions 中验证)
- 安装需要重启
- 触摸 /System/Library/Extensions 和
- 在安装结束时调用 touch /Library/Extensions
- 安装后内核缓存似乎更新了

我最初认为系统可能不会在重启时重新构建预链接的内核,但在 syslog 中发现了这一点:

28.04.16 17:02:28,000 kernel[0]: Resetting IOCatalogue.  
28.04.16 17:02:29,253 com.apple.kextd[47]: '/' updating, delaying reboot.  
28.04.16 17:02:29,254 com.apple.kextcache[874]: rebuilding //System/Library/PrelinkedKernels/prelinkedkernel  
28.04.16 17:02:29,257 com.apple.kextcache[878]: / locked; waiting for lock.  
28.04.16 17:02:30,424 com.apple.kextcache[879]: kext file:///System/Library/Extensions/JMicronATA.kext/ is in hash exception list, allowing to load  
28.04.16 17:02:34,645 com.apple.kextcache[880]: / locked; waiting for lock.  
28.04.16 17:02:52,470 com.apple.kextcache[879]: Created old kernelcache copy "/System/Library/Caches/com.apple.kext.caches/Startup/kernelcache"  
28.04.16 17:02:52,470 com.apple.kextcache[879]: Created prelinked kernel "/System/Library/PrelinkedKernels/prelinkedkernel"  
28.04.16 17:02:52,470 com.apple.kextcache[879]: Created prelinked kernel using "/System/Library/Kernels/kernel"  
28.04.16 17:02:52,490 com.apple.kextcache[874]: /System/Library/PrelinkedKernels/prelinkedkernel not cached.  
28.04.16 17:02:52,000 kernel[0]: hfs: mounted Recovery HD on device disk0s3  
28.04.16 17:02:52,513 mds[62]: (Volume.Normal:2464) volume:0x7fd77c06be00 ********** Bootstrapped Creating a default store:0 SpotLoc:(null) SpotVerLoc:(null) occlude:0 /Volumes/Recovery HD  
28.04.16 17:02:52,565 fseventsd[48]: Logging disabled completely for device:1: /Volumes/Recovery HD  
28.04.16 17:02:53,100 com.apple.kextcache[874]: Successfully updated disk0s3.  
28.04.16 17:02:53,000 kernel[0]: hfs: unmount initiated on Recovery HD on device disk0s3  
28.04.16 17:02:53,154 com.apple.kextd[47]: / is still busy, delaying reboot.  
28.04.16 17:02:53,154 com.apple.kextcache[878]: Lock acquired; proceeding.  
28.04.16 17:02:53,157 com.apple.kextcache[878]: /: helper partitions appear up to date.  
28.04.16 17:02:53,157 com.apple.kextd[47]: / is still busy, delaying reboot.  
28.04.16 17:02:53,157 com.apple.kextcache[880]: Lock acquired; proceeding.  
28.04.16 17:02:53,159 com.apple.kextcache[880]: /: helper partitions appear up to date.  
28.04.16 17:02:53,160 com.apple.kextd[47]:  up to date; unblocking reboot.  
28.04.16 17:02:53,160 shutdown[871]: reboot by ls:   
28.04.16 17:02:53,000 kernel[0]: Kext loading now disabled.  
28.04.16 17:02:53,000 kernel[0]: Kext unloading now disabled.  
28.04.16 17:02:53,000 kernel[0]: Kext autounloading now disabled.  
28.04.16 17:02:53,000 kernel[0]: Kernel requests now disabled.  
28.04.16 17:03:02,000 bootlog[0]: BOOT_TIME 1461855782 0  

时间和地点:
- 我在 10.11.4 上确实遇到过这个问题,但在 10.10 上也看到过这个问题
- 我的印象是,如果它在安装后直接工作,它永远不会失败。所以我认为问题可能与某些“启动时加载列表”中缺少的kext有关。

我希望有人知道我可以在哪里进行研究。

【问题讨论】:

  • @trojanfoe apple.stackexchange.com 用于系统管理员/用户级别的问题;这显然是一个只与 kext 开发相关的问题,因此是这里的主题。 (尤其是在 kext 和 iokit 标签中)
  • @pmdj 我没有得到 OP 正在开发这个内核扩展的印象,只是他们“拥有它”。如果这是真的,那么它不是主题。
  • 这是关于 kext 开发的,尽管我希望它不必更改 kext 本身。

标签: macos usb iokit kernel-extension


【解决方案1】:

你没有说清楚,但是从关于图标的评论中,我认为这是一个 USB 大容量存储设备?

OS X 可以从 USB 驱动器启动,因此标准 USB 大容量存储驱动程序必须位于 kext 缓存/预链接内核中。我怀疑你没有配置你的 kext 来包含在其中,所以如果系统在安装根文件系统和扫描 /Library/Extensions 之前检测到你的设备,它将最终使用标准驱动程序。

解决方案是 kext 的 Info.plist 文件中的 the OSBundleRequired property。如果您将其设置为Local-Root,它会告诉系统它可以从您的设备/kext 启动/root,并且它应该包含在本地 kext 缓存中。

每当您修改或touch/Library/Extensions/System/Library/Extensions 目录时,都会重建kext 缓存;不管它是否真的需要重建,或者添加的 kext 是否包含在缓存中:当这种情况发生时,它总是会重建它。 OSBundleRequired 属性控制包含哪些 kext。

【讨论】:

  • OSBundleRequired 已设置为 Local-Root。我观察到有时/System/Library/Caches/com.apple.kext.caches/Startup/loadedkextmt.plist 中会保留一些旧条目。卸载 kext 后,它仍然在此列表中。更新loadedkextmt.plist时你有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多