这个原因主要是 bluetoothd 现在会检查虚拟机管理器,一旦发现操作系统位于虚拟机内,它就会拒绝工作。这实际上bluetoothd检查的是kern.hv_vmm_present,如果操作系统在虚拟机中运行,则该值为1。在深入了解了OCLP如何修补内核,通过将kern.hv_vmm_present替换为kern.direct_handoff 来伪造始终为kern.hv_vmm_present=1,我门需要做相反的事情。搜索内核二进制文件,找到了一个始终为0的内核标志,其长度与hv_vmm_present相同,并发现kern.hibernatecount通常会保持为0(因为在我的情况下睡眠被禁用,我认为这对虚拟机来说是不必要的)。通过以下两个内核补丁来切换这两个标志,它可以运行完美!
如果您不使用睡眠模式,可以尝试以下操作:
使用 OCAT GUI 或 OpenCore Configurator 打开 config.plist文件,转到内核 -> 补丁并添加以下两个新项目
Identifier | Base | Count | Find | Limit | Mask | Replace | Skip | Arch |
kernel | 1 | 68696265726E61746568696472656164790068696265726E617465636F756E7400 | 0 | 68696265726E61746568696472656164790068765F766D6D5F70726573656E7400 | 0 | x86_64 | ||
kernel | 1 | 626F6F742073657373696F6E20555549440068765F766D6D5F70726573656E7400 | 0 | 626F6F742073657373696F6E20555549440068696265726E617465636F756E7400 | 0 | x86_64 |
或者直接编辑 config.plist:将两个补丁字典插入到 Patch 数组中:
<dict>
...
<key>Kernel</key>
<dict>
...
<key>Patch</key>
<array>
...
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>Base</key>
<string></string>
<key>Comment</key>
<string>Sonoma VM BT Enabler - PART 1 of 2 - Patch kern.hv_vmm_present=0</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>aGliZXJuYXRlaGlkcmVhZHkAaGliZXJuYXRlY291bnQA</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data></data>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>20.4.0</string>
<key>Replace</key>
<data>aGliZXJuYXRlaGlkcmVhZHkAaHZfdm1tX3ByZXNlbnQA</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
</dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>Base</key>
<string></string>
<key>Comment</key>
<string>Sonoma VM BT Enabler - PART 2 of 2 - Patch kern.hv_vmm_present=0</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>Ym9vdCBzZXNzaW9uIFVVSUQAaHZfdm1tX3ByZXNlbnQA</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data></data>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>22.0.0</string>
<key>Replace</key>
<data>Ym9vdCBzZXNzaW9uIFVVSUQAaGliZXJuYXRlY291bnQA</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
</dict>
...
保存修改,然后重新启动以查看是否有效。从技术上讲,不需要重置 NVRAM。如果您的 hibernatecount 不总是 0,您可能需要找到另一个标志。我使用此命令查找所有带有 14 个字符的 kern 标志:
sysctl kern | grep -E '^kern\.[^.]{14}:'
我的输出是(修补之前):
kern.sugid_coredump: 0
kern.hibernatecount: 0
kern.hv_vmm_present: 1
kern.wq_max_threads: 512
kern.drivercorefile: /private/var/dextcores/%N.core
kern.direct_handoff: 1
kern.consoleoptions: 0
kern.pmcallouttimer: 2000
kern.sleep_abs_time: 0
修补后:
kern.sugid_coredump: 0
kern.hibernatecount: 1
kern.hv_vmm_present: 0
kern.wq_max_threads: 512
kern.drivercorefile: /private/var/dextcores/%N.core
kern.direct_handoff: 1
kern.consoleoptions: 0
kern.pmcallouttimer: 2000
kern.sleep_abs_time: 0
不幸的是,这很可能会破坏 qemu-guest-agent,而 qemu-guest-agent 是主机在 VM 运行时获取 VM 状态或拍摄热快照所必需的。这是因为 qemu-guest-agent 还会检查 hv_vmm_present 标志,但只有当该标志为真 (=1) 时才有效。
使用时风险自负。希望这会有所帮助。
最后附上述补丁的config.plist文件
评论0