使用 OpenCore 引导黑苹果

前言

之前使用 Clover 作为系统系统引导,再加上本身接触的比较晚,查阅很多资料都是老版本,包括一些驱动什么的,版本众多,看着迷糊,虽然使用没啥问题,无奈有时间遇到一个小问题需要花大量的时间去查找寻找时间,所以这段时间尝试使用 OpenCore 作为新的系统引导(下文简称 OC)。因为 OC 出世不长,有些资料版本比较新,很适合像我这种不需要了解某个事物历史等因素。还好这次入坑遇到不少人帮助,非常感谢一些朋友的帮助让我少走一点弯道,到此为止现在系统能够正常使用。

准备

前一段时间虽然成功,但因为网卡和显卡驱动问题一直拖到这个月,所以这次换了一部分硬件,不知道算是降级体验吗?

  • 主板:微星 Z370-OC-Pro MS-7B48
  • CPU:Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz
  • 显卡:NVIDIA GeForce GTX 1070 Ti => 降级替换 蓝宝石 RX590 8G D5 超白金 极光特别版 (2304个流处理器)
  • 磁盘:WDC WDS240G2G0A-00JH30 (240GB) / NVMe Asgard AN3 1TNVM (1.0TB) / ST2000DM006-2DM164 (2.0TB)
  • 内存条:阿斯加特 - 16.0GB
  • 板载网卡:Realtek PCIe GbE Family Controller
  • 无线网卡:Killer(R) Wi-Fi 6 AX1650x 160MHz Wireless Network Adapter (200NGW) => BCM94360CD
  • 声卡:Realtek High Definition Audio
  • 显示器:一个飞利浦 直面 1080P / 俩个三星 曲面屏 1080P => 三星直板 4K 分辨率支持HDR 显示器 - 俩个

因为手里有三星设备,想体验Sumsunng Dex 系统,加上三星品控不错,所以入了三星显示器。至此为止,硬件基本满足黑苹果的需求,下面进行引导替换。由于这仅仅是替换引导,不需要对系统进行更换,所以只是替换 EFI 目录下的 Clover 引导而已。

首先需要准备一个刻录系统的优盘,这边可以参考下之前的 刻录系统文章 ,如果你懒的话可以直接使用磁盘工具 格式化优盘:

  • 名称随意编写,例如 OC
  • 格式选择 MS-DOS(FAT)

这样且当做 EFI 分区,下面大部分操作就在这里面进行。

无论无何不能在系统安装的磁盘的 EFI 里进行修改操作,如果破坏无法进入系统真的完蛋了。

其次要勤奋备份自己的 EFI 数据,因为折腾不容易,丢了又要从头开始。

转移

之前不知道在哪看到的,不管是 Clover 还是 OpenCore 引导驱动越少越好,较少对系统的干扰因素。所以当时制作引导,只保留最精简的驱动和配置。这边我不会细细讲解配置过程,因为网上的教程实在是太多了,可以参考下:精解OpenCore使用OpenCore引导黑苹果 ,写得不错,看他们写的文章,花了三个小时搞定 EFI 引导。

当时版本:OpenCore-0.5.7

下载 OC 解压把 EFI 文件夹放到优盘下面,并且查看 /EFI/OC 文件夹下内容:

Drivers文件夹下:

驱动文件 解释
HiiDatabase.efi 用于给 Ivy Bridge (3 代酷睿) 或更老代主板上支持 UEFI 字体渲染, UEFI Shell 中文字渲染异常时使用, 新主板不需要
NvmExpressDxe.efi 用于在 Haswell (4 代酷睿) 或更老的主板上支持 NVMe 硬盘, 新主板不需要
OpenCanopy.efi 实现图形界面,一般用于主题
OpenRuntime.efi 内存寻址补丁
OpenUsbKbDxe.efi 键盘组合键的使用
XhciDxe.efi 用于给 Sandy Bridge (2 代酷睿) 或更老的主板上支持 XHCI, 新主板不需要

综合上述,只保留 OpenRuntime.efi 文件,其他可以删除,当然把 OpenCanopy.efi 保留下来。然后额外添加

驱动文件 解释
ApfsDriverLoader.efi APFS格式支持
HFSPlus.efi HFS格式支持

下面整内核驱动 Kext

内核驱动 解释
Lilu.kext Acidanthera 驱动底层依赖 Github
Applealc.kext 声卡驱动 Github
VirtualSMC.kext 传感器驱动依赖 Github
SMCProcessor.kext CPU 核传感器 Github
SMCSuperIO.kext IO 传感器 Github
WhateverGreen.kext 核显 & 显卡驱动 Github
IntelMausi.kext Intel 类千兆网卡驱动(如果是用无线网卡可以不需要) Github
Usbinjectall.kext USB 通用驱动 Github
NVMeFix.kext 为 NVME 硬盘增加 ASPT 属性来保证节电 Github

将刚刚解压的 OC 文件夹下的 Docs/Sample.plist 文件重命名放入 EFI/OC/config.plist ,和 ACPI 文件夹同级。使用 Xcode 或者 PlistEdit Pro 打开 config.plist 删除上面的无用注释 #WARNING - # 。如果这类文本编辑器看着不直观可以使用 OCC 编辑器进行管理:文档介绍

然后根据上面的教程对自己配置进行一步个性化配置,这边不多说了。值得注意的时候,注意三码要一样,不然出现丢失 Apple ID 的问题,其次切换引导需要清除 NVRAM 再进入系统。

完善

声卡

config.plist/DeviceProperties/PciRoot(0x0)/Pci(0x1f,0x3) 有个 Layout-id 属性注入自己的 Codecs ,更多教程查看:AppleALC支持的Codecs列表及AppleALC的使用

核显加速

由于是独显输出,核显就拿来加速吧:在 config.plist/DeviceProperties/PciRoot(0x0)/Pci(0x2,0x0) 有个 AAPL,ig-platform-id 填入值是:0300983E ,当时没理解这个,原来是固定值。如果没有独显,需要核显驱动视频那需要根据自己的 CPU 平台进行注入 GPUIDCoffee Lake帧缓冲区补丁及UHD630 Coffee Lake ig-platform-id数据整理

USB 3.0 定制

当初在屏蔽 USB2 死活屏蔽不了,然后发现是 Usbinjectall.kext 驱动下错了,应该是 @Sniki 维护的 Usbinjectall.kext 驱动,剩下可以参考:Hackintool 使用教程及插入姿势。值得注意是这边只需要最后生成的 USBPorts.kext 驱动放入 Kexts 文件夹下,并且禁用 USBInjectAll.kext 驱动即可。

CPU 变频

参考 CPUFriend的安装与使用 ,不过这个文章没有说出 System/Library/Extensions/IOPlatformPluginFamily.kext/Contents/PlugIns/X86PlatformPlugin.kext/Contents/Resources/ 哪个 plist 文件,这边是你的 board-id 名字的文件,终端输入:

➜  ~ ioreg -l | grep board-id          
    |   "board-id" = <"Mac-63001698E7A34814">

然后进行文章的操作。

USBX供电

添加 USBPower.kext 驱动即可

CPU 电源管理

参考:注入X86

节能五项

SSDT-PM.aml

/*
 * Intel ACPI Component Architecture
 * AML/ASL+ Disassembler version 20200110 (64-bit version)
 * Copyright (c) 2000 - 2020 Intel Corporation
 * 
 * Disassembling to symbolic ASL+ operators
 *
 * Disassembly of iASL2s2csv.aml, Sun Apr 12 22:14:00 2020
 *
 * Original Table Header:
 *     Signature        "SSDT"
 *     Length           0x000000C6 (198)
 *     Revision         0x02
 *     Checksum         0xC2
 *     OEM ID           "ACDT"
 *     OEM Table ID     "PM"
 *     OEM Revision     0x00001000 (4096)
 *     Compiler ID      "INTL"
 *     Compiler Version 0x20180427 (538444839)
 */
DefinitionBlock ("", "SSDT", 2, "ACDT", "PM", 0x00001000)
{
    External (_SB_.PCI0.LPCB, DeviceObj)
    External (_SB_.PCI0.PMCR, DeviceObj)

    Device (PPMC)
    {
        Name (_ADR, 0x001F0002)  // _ADR: Address
        OperationRegion (PMCB, PCI_Config, Zero, 0x0100)
        Field (PMCB, AnyAcc, NoLock, Preserve)
        {
            VDID,   32, 
            Offset (0x40), 
            Offset (0x41), 
            ACBA,   8, 
            Offset (0x48), 
                ,   12, 
            PWBA,   20
        }
    }

    Scope (_SB.PCI0.LPCB)
    {
        Device (PMCR)
        {
            Name (_HID, EisaId ("APP9876"))  // _HID: Hardware ID
            Name (_STA, 0x0B)  // _STA: Status
            Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
            {
                Memory32Fixed (ReadWrite,
                    0xFE000000,         // Address Base
                    0x00010000,         // Address Length
                    )
            })
        }
    }
}

原生 NVRAM 支持

修改 config.plist 支持:

  • Booter → Quirks → DisableVariableWrite = no
  • Misc → Security → AllowNvramReset = yes
  • Misc → Security → ExposeSensitiveData = 3
  • NVRAM → LegacyEnable = no

添加 DSDT 补丁SSDT-PMC.dsl

/*
 * Intel 300-series PMC support for macOS
 *
 * Starting from Z390 chipsets PMC (D31:F2) is only available through MMIO.
 * Since there is no standard device for PMC in ACPI, Apple introduced its
 * own naming "APP9876" to access this device from AppleIntelPCHPMC driver.
 * To avoid confusion we disable this device for all other operating systems,
 * as they normally use another non-standard device with "PNP0C02" HID and
 * "PCHRESV" UID.
 *
 * On certain implementations, including APTIO V, PMC initialisation is
 * required for NVRAM access. Otherwise it will freeze in SMM mode.
 * The reason for this is rather unclear. Note, that PMC and SPI are
 * located in separate memory regions and PCHRESV maps both, yet only
 * PMC region is used by AppleIntelPCHPMC:
 * 0xFE000000~0xFE00FFFF - PMC MBAR
 * 0xFE010000~0xFE010FFF - SPI BAR0
 * 0xFE020000~0xFE035FFF - SerialIo BAR in ACPI mode
 *
 * PMC device has nothing to do to LPC bus, but is added to its scope for
 * faster initialisation. If we add it to PCI0, where it normally exists,
 * it will start in the end of PCI configuration, which is too late for
 * NVRAM support.
 */
DefinitionBlock ("", "SSDT", 2, "ACDT", "PMCR", 0x00001000)
{
    External (_SB_.PCI0.LPCB, DeviceObj)

    Scope (_SB.PCI0.LPCB)
    {
        Device (PMCR)
        {
            Name (_HID, EisaId ("APP9876"))  // _HID: Hardware ID
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (_OSI ("Darwin"))
                {
                    Return (0x0B)
                }
                Else
                {
                    Return (Zero)
                }
            }
            Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
            {
                Memory32Fixed (ReadWrite,
                    0xFE000000,         // Address Base
                    0x00010000,         // Address Length
                    )
            })
        }
    }
}

编译 SSDT-PMC.aml 文件加入 ACPI 补丁支持。

OC 主题支持

主题资源:OcBinaryData

添加主题驱动支持:EFI -> OC -> Drivers -> OpenCanopy.efi

  • Misc-其它设置 → Boot → PickerMode 启动菜单模式: External
  • Misc-其它设置 → Boot → PickeraTtribute 图形界面设置属性: 1
  • UEFI-UEFI设置 → UEFI驱动,添加OpenCanopy.efi

未完待续...

分享

个人自用 EFI 分享地址:个人网盘