内核扩展并不总是在OSX上的引导时加载

时间:2016-05-18 14:15:16

标签: macos usb iokit kernel-extension

我使用IOKitPersonalities为USB设备提供内核扩展。重新插入其中一个设备将始终按预期加载kext,但对于已在启动时连接的设备,这有时会失败。在这种情况下,设备本身可以被系统识别,可以在SystemInformation / USB中找到。 Icon是标准的黄色,而不是我们的kext提供的绿色。 一个有趣的事实: 当我连接两个设备时,一个直接在Mac上,另一个连接在键盘集线器上,可能会发生只有集线器上的设备触发了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(系统/库/ Extensions for pre Mavericks)。根据{{​​3}}所说的地方 - 签名(在SystemInformation / Software / 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。

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

1 个答案:

答案 0 :(得分:0)

你没有明确说出来,但是从关于图标的评论来看,我认为这是一个USB大容量存储设备?

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

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

只要您修改touch /Library/Extensions/System/Library/Extensions目录,就会重建kext缓存;如果它确实需要重建,或者如果添加的kext包含在缓存中,则无关紧要:当发生这种情况时,它将始终重建它。 OSBundleRequired属性控制包含哪些关键字。