很久没折腾黑苹果了。先在VMware上用OC4VM1试了一下,发现性能还是很差,可能是跟hypervisor有冲突2,而且GPU图形加速也开不了。因为平时常用的WSL2依赖Hyper-V,不能关掉它,所以就想在Hyper-V上试试装macOS。

准备工作

  1. 首先把OSX-Hyper-V3项目中的文件全克隆到本地

  2. 定位到刚才克隆的项目中的src\config.yml文件,编辑文件中最后一部分的内容

    • 对于 Intel Tiger Lake 及更新的处理器(第 11 代及更新的处理器),需要编辑cpuid将自己伪装为Comet Lake CPU:

      • 文件中的 Kernel -> Emulate 部分添加:

        1
        2
        3
        4
        
        Kernel:
          Emulate:
            Cpuid1Data: Data | <55 06 0A 00 00 00 00 00 00 00 00 00 00 00 00 00>
            Cpuid1Mask: Data | <FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00>
        

        注意缩进格式! Kernel下可能已经有了Patch一项,确保EmulatePatch平级,并自行注意缩进的空格数量!编辑完的最后一部分应该看起来像:

        1
        2
        3
        4
        5
        6
        
        Kernel:
          Patch:
            这一部分保持原有的内容不变
          Emulate:
            Cpuid1Data: Data | <55 06 0A 00 00 00 00 00 00 00 00 00 00 00 00 00>
            Cpuid1Mask: Data | <FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00>
        
    • 对于AMD CPU,请参见官方文档的AMD部分4。由于我不是AMD CPU,就不详细概述这部分内容了。

  3. 构建EFI。在项目目录中打开Powershell,输入Set-ExecutionPolicy Bypass -Scope Process仅在此窗口中禁用安全策略,然后执行.\scripts\build.ps1进行构建。成功后会在项目目录中看到dist/ 目录。

创建虚拟机

可以直接使用.\dist\Scripts\create-virtual-machine.ps1脚本一键创建虚拟机。如需手动创建虚拟机,请参阅官方文档5

安装系统

正常在Hyper-V管理器中启动并进入恢复镜像。安装系统前记得抹掉目标硬盘为APFS格式。

如果启动失败,请定位到虚拟机的配置文件目录,双击挂载EFI.vhdx镜像,然后在镜像的根目录下获取log文件,排查启动错误。

安装完成后看起来好像比VMware性能要好一些。

修改分辨率

首先在macOS中安装Hyper-V相关依赖。在macOS中打开终端:

1
2
cd /Volumes/EFI # Change to the EFI disk
bash ./Scripts/post-install.sh

之后定位到虚拟机的配置文件目录,双击挂载EFI.vhdx镜像。定位到\EFI\OC\Kexts\MacHyperVFramebuffer.kext\Contents\Info.plist文件,定位到SupportedResolutions,下面在加一个dict即可:

1
2
3
4
5
6
<dict>
    <key>Height</key>
    <integer>1080</integer>
    <key>Width</key>
    <integer>1920</integer>
</dict>

显卡直通

省流:新版macOS(High Sierra 10.13之后)+ 新的nVidia显卡(RTX20系列及之后的显卡)不要想了6,而且需要Windows Server才能开启离散设备分配(DDA)

微软只把DDA功能开放给了Windows Server。你仍然可以按照微软官方教程把GPU加到VM上7,但如果不是Windows Server相关的SKU,启动会报错:

“macOS"无法启动。

Virtual Pci Express Port (实例 ID B927A021-DC53-4C54-BF5A-E850F5EDABB8):无法开机,因为发生了错误"虚拟机监控程序功能对于该用户来说不可用。”。

“macOS"无法启动。(虚拟机 ID 0F41CF70-91D2-476E-B0F5-6225E767C7C1)“macOS"Virtual Pci Express Port (实例 ID B927A021-DC53-4C54-BF5A-E850F5EDABB8):无法打开电源,因为发生错误"虚拟机监控程序功能对于该用户来说不可用。“(0xC035001E)。(虚拟机 ID 0F41CF70-91D2-476E-B0F5-6225E767C7C1)

重新安装Windows Server就不说了。不过有其他不用重装系统的方案:Reddit上一位小猪佩奇头像的用户提供了一种野路子,能把普通Windows直接变成Windows Server8;你也可以通过改注册表或Massgrave脚本(既然你都玩Hyper-V了,那大概率之前用过这个脚本😎)将Windows的版本切换为ServerRdsh9。顺便提醒一下,改成Windows Server会破坏部分电源选项(比如开始菜单里看不到睡眠/休眠选项)。

当然,前面也提到过,新版macOS已经不再支持所有nVidia显卡,所以折腾半天显卡直通进去也没用。如果你有旧款nVidia显卡 + 旧版macOS,倒是可以按上面的思路折腾一下。

脚注


  1. https://github.com/DrDonk/OC4VM ↩︎

  2. 详见 https://community.broadcom.com/vmware-cloud-foundation/discussion/disabling-hyper-v-hypervisor-on-windows-11-pro-host-to-get-vmware-17s-cpl0-vs-ulm-monitor-mode 。大概原因是Hyper-V属于Type 1 hypervisor,在Windows上开启后,宿主机自身的Windows会变为一种特殊的Guest虚拟机(在Hyper-V中称为Root Partition)。因此在Windows上再运行虚拟机就是一种嵌套虚拟化,此时要不然继续使用Hyper-V创建子虚拟机,要么VMware等第三方软件需要通过Windows Hypervisor Platform提供的API来调用底层Hyper-V的hypervisor来运行虚拟机。这种间接API调用可能会有一定的性能损失。 ↩︎

  3. https://github.com/Qonfused/OSX-Hyper-V ↩︎

  4. https://github.com/Qonfused/OSX-Hyper-V#amd ↩︎

  5. https://github.com/Qonfused/OSX-Hyper-V#4-setting-up-hyper-v ↩︎

  6. https://dortania.github.io/GPU-Buyers-Guide/#a-quick-refresher-with-nvidia-and-web-drivers ↩︎

  7. https://learn.microsoft.com/zh-cn/windows-server/virtualization/hyper-v/deploy/deploying-graphics-devices-using-dda ↩︎

  8. https://www.reddit.com/r/HyperV/comments/rd1pf5/comment/hp07iw0/ ↩︎

  9. https://www.reddit.com/r/HyperV/comments/1ofyyk7/finally_managed_to_get_dda_working_on_windows_10/ ↩︎