OC精解
由于个人能力有限,教程中难免会有些疏漏,这里推荐大家在参阅本教程的同时也阅读以下资料:
OpenCore官方文档–OpenCore最权威的资料,没有之一!!!xjn‘sBlog–xjn大佬的博客,对台式机非常友好的教程,内存管理写的非常详细OC-little–宪武大佬的OCACPI热补丁示例OpencoreVanillaDesktopGuide
什么是OpenCore
OpenCore(简称OC)是一个着眼于未来开源的引导工具,最初诞生于HermitCrabs实验室,现在接手于Acidanthera,其目的是创造一个更加严谨的模组化的轻量引导系统。尽管OpenCore的主要用途是黑苹果,它也支持其它操作系统的引导。
OpenCore现在处于公测Beta阶段,引导相关功能也已非常稳定,喜欢折腾的朋友现在已经是动手的时机了。
这个教程只能作为你探索的起点。请仔细阅读并时刻牢记你的硬件可能有不同的配置要求。
为什么选择OpenCore
从2019年9月以后,Acidanthera开发的内核驱动(Lilu,AppleALC等等)「不再会」在Clover上做兼容性测试OpenCore更加注重系统的安全性,提供对OpenCore自身引导文件对加密,同时对文件保险箱(FileVault)有更强大的支持,在未来会支持UEFI安全启动OpenCore启动FileVault(硬盘保险箱)加密的分区速度远超CloverOpenCore支持基于boot.efi的原生开机快捷键支持OpenCore使用更加先进的方法注入第三方内核扩展驱动(Kext)且与此同时不会破坏系统完整性保护OpenCore通过读取启动磁盘设置的NVRAM变量,可以像白苹果一样支持在设置的启动磁盘切换默认引导项支持给其它.efi驱动或引导工具加入参数大量Acidanthera维护的独立UEFI驱动被合并入OpenCore,未来的开发直接与OpenCore绑定,且不再支持Clover
OpenCore不自带精美的主题,以后会添加吗?
OpenCore自带的GUI仅用于debug,设计初衷是在正常使用的时像白苹果一样隐藏。其实OpenCore已经提供了大量可以绕开GUI的功能,将ShowPicker设置为NO隐藏菜单之后,可以通过系统自带的启动磁盘设置来切换默认系统,用苹果原生快捷键来重置NVRAM和添加引导表示符,需要其它功能的时候可以随时按ESC/Option调出,主题存在的意义不大N.D.K为官方OpenCore开发了一个独立的GUI插件,可以在这里下载,食用方法请阅读项目的Readme
OpenCore为什么不会为其它操作系统忽略ACPI补丁?
真正正确的ACPI(DSDT/SSDT)应当适用于所有的操作系统,单独为一个操作系统制作ACPI是不合理的,因此OpenCore基于ACPI标准,不会在ACPI上差别对待操作系统,如果想学习怎样使用和制作通用于所有操作系统的ACPI补丁,可以参考OC-littleOpenCore的MOD版本和官方版本有何不同?
OpenCoreMOD是N.D.K的一个Fork,里面加入了不注入除了macOS之外的其它操作系统的功能,可以看作是一个自带主题的懒人版。但是除非在个别极端情况下主板的固件真的不走规范,正确配置原版OpenCore和ACPI是不会造成无法引导其它操作系统的情况的。本教程鼓励正确配置OpenCore,因此基于原版OpenCore编写,且「不推荐」使用MOD版本来掩盖自身的配置问题。OpenCore的配置为什么看起来这复杂?
OpenCore为了提高兼容性,为用户开放了更多底层的QuirkOpenCore现阶段没有可用的非常直观的GUI编辑器
讲了这么多,终于到真正动手的环节了
本文较长,建议配合博客右下角的目录阅读
准备工作
我们先来做些简单的准备工作
推荐BIOS设置
禁用:英文中文
启用:英文中文
OpenCorePkg(建议从Acidanthera的官方Sample开始构建,并使用Debug版本)
OpenCore-Factory提供连续的源码自动编译,喜欢尝鲜的朋友可以下载,最新编译为
MacInfoPkgAppleSupportPkgPlist编辑器:
ProperTree(基于Python的轻量级跨平台Plist编辑器,针对OpenCore有优化,Acidanthera官方推荐)Xcode(Acidanthera官方推荐,但是Xcode11处理<data>存在严重问题)PlistEditorPro(使用远古Plist标准,会破坏XML换行而且不会自动转换Base64,可用但是不推荐)
经测试,软件已经可以正常使用,但是由于OpenCore的配置文件更新频繁,所以软件不一定永远兼容最新版本,同时最新的版本为了同步开发中的自编译版本可能也存在不支持当前最新官方Release的情况。
使用之前需要了解清楚工具的当前支持到的最高版本,跨版本编辑会造成config损坏,设置项无法对应等棘手情况。
感谢mackie100和草原企鹅的付出
一个U盘对黑苹果有一定的知识基础,至少会自己配置Clover,清楚各个内核驱动.kext和UEFI.efi驱动的用途,不清楚可以查看附录[1]和附录[2]一个完全精简过的CloverEFI一个正常稳定工作的黑苹果测试平台EFI挂载工具
给自己留一个后手,先用USB尝试和排错,稳定了再迁移到硬盘里
创建一个USB启动盘,格式化为GUID分区图,分区类型为macOS日志式。
挂载完EFI分区真有意思的部分就「开始了」
解压下载下来的OpenCore引导文件,把EFI文件夹里面的OC文件夹和BOOT/BOOTx64.efi对号入座放入ESP分区中
注意⚠️:与Clover不同,OpenCore的BOOTx64.efi和OpenCore.efi是两个不同的文件
添加UEFI引导项的时候应当添加BOOTx64.efi而不是OpenCore.efi!我们先「删除」一些不需要的文件
drivers文件夹下AppleUsbKbDxe.efi
这个驱动是给使用模拟UEFI的老主板在OpenCore界面正常输入用的,请勿在IvyBridge(3代酷睿)及以上的主板上使用(详见vit9696的解释)NvmExpressDxe.efi
用于在Haswell(4代酷睿)或更老的主板上支持NVMe硬盘,新主板不需要XhciDxe.efi
用于给SandyBridge(2代酷睿)或更老的主板上支持XHCI,新主板不需要HiiDatabase.efi
用于给IvyBridge(3代酷睿)或更老代主板上支持UEFI字体渲染,UEFIShell中文字渲染异常时使用,新主板不需要
tools文件夹下BootKicker.efi
调用苹果原生的引导切换GUI,黑苹果不支持CleanNvram.efi
OpenCore自带的NVRAM清理功能已经足够我们使用GopStop.efi
停止显卡GOP,排错时使用HdaCodecDump.efi
导出声卡Codec,可用于定制声卡,需要时可以临时加回来VerifyMsrE2.efi
用于检查主板上CFG锁的状态
OpenCore的正确文件结构如下所示
现在,我们可以把AppleSupportPkg中必需的.efi驱动程序放入Drivers文件夹,将你的kext和DSDT/SSDT放入各自的文件夹中。请注意,OpenCore不支持支持列表以外的UEFI驱动程序!完成后的效果:
OpenCore的配置建议遵循从简原则,先确保能进系统再来增加其它功能(不进系统功能都是免谈),变数越少出错的概率也就越低
内核驱动只保留Lilu,WhateverGreen,VirtualSMC和必须依赖才能开机的驱动(删除AppleALC,VoodooI2C等功能性驱动)
请记住OpenCore中的config.plist,与Clover的config.plist尽管名称相同但是内容和结构完全不同。它们不能混合滥用。如果你不清楚某一个项里应该填什么「数据类型」,请参考OpenCore官方文档下面的Quirk给的都是推荐值,请根据自身情况修改
复制Sample.plist,将副本重命名为config.plist并用上文提到的编辑工具打开
如果你打算使用的SMBIOS苹果已经停止支持或者你是用的是戴尔OEM笔记本请使用SampleFull.plist并「认真」补全所有SMBIOS信息
里面躺着所有我们需要配置的子项:
ACPI:用于加载,屏蔽和修补ACPI(DSDT/SSDT)表Booter:用于设置FwRuntimeServices.efi(Slide值计算,KASLR)DeviceProperties:用于设置PCI设备属性,如英特尔缓冲帧补丁,声卡LayoutIDKernel:用于说明OpenCore的具体加密信息,配置Kext加载顺序以及屏蔽驱动Misc:OpenCore的自身设置NVRAM:用于注入NVRAM(如引导标识符和SIP)Platforminfo:用于设置SMBIOS机型信息UEFI:用于加载UEFI驱动以及以何种顺序加载
Warning-1:这只是一个实例。不要直接拿来开机。
Warning-2:在用Config开机之前,确保你已经理解Config内「每一个项的」的意义
Warning-3:在大多数情况下,建议从Sample.plist开始配置
Warning-4:SampleFull.plist用于苹果不再支持的机型(2011年或更早)
Add:
你需要把这些而例子里内容修改/创建为你的EFI/OC/ACPI/下的文件
禁用某个ACPI表,常用于禁用DAMR来关闭VT-d
对DSDT(SSDT)的内容进行查找和替换
FadtEnableReset:NO在旧硬件上修复重启和关机,除非需要,否则不推荐开启
NormalizeHeaders:NO清除ACPI头字段,只有macOS10.13需要
RebaseRegions:YES尝试试探性地重新定位ACPI内存区域,使用自定义DSDT则必须开启
ResetHwSig:NO存在重新启动后因无法维持硬件签名而导致从休眠中唤醒的问题的硬件需要开启
ResetLogoStatus:NO无法在有BGRT表的系统上显示OEMWindows标志的硬件需要开启
MmioWhitelist:如果开机卡在PCI...可以尝试开启Item1下的Patch
AvoidRuntimeDefrag:YES
开启后会修复UEFI的运行服务,例如日期,时间,NVRAM,电源控制等
DevirtualiseMmio:YES
开启后会减少Stolen内存占用空间,扩大Slide=N值的范围,适用于大多数主板
DisableSingleUser:NO
开启后会禁止Cmd+S和-s的使用,使设备更加接近于T2白苹果
DisableVariableWrite:NO
开启后会禁止NVRAM写入,在Z390/HM370等没有原生macOS支持NVRAM的主板上需要开启
DiscardHibernateMap:NO
开启后会重用原始休眠内存映射,仅某些旧硬件需要
EnableSafeModeSlide:YES
开启后会允许在安全模式下使用Slide值
EnableWriteUnprotector:YES
开启后会在执行期间删除CR0寄存器中的写入保护
ForceExitBootServices:NO
开启后会确保ExitBootServices即使在MemoryMap发生更改时也能调用成功,除非有必要,否则请勿使用
ProtectCsmRegion:NO
开启后会用于修复人为制造和睡眠唤醒的问题,AvoidRuntimeDefrag已经修复了这个问题所以请尽可能避免使用这个Quirk
ProtectSecureBoot:NO
避免操作系统对UEFI安全启动变量(db,dbx,PX,KEK)进行写入,这个选项主要用于避免Insyde主板和MacPro5,1的NVRAM问题
ProvideCustomSlide:YES
如果Slide值存在冲突,此选项将强制macOS执行以下操作:
使用一个伪随机值。只有在遇到OnlyN/256slidevaluesareusable!时需要
SetupVirtualMap:YES
开启后会将SetVirtualAddresses调用修复为虚拟地址
ShrinkMemoryMap:NO
有巨大且不兼容内存映射的主板需要开启,非必须不要使用
SignalAppleOS:NO
通过OSInfo将macOS加载的信息报告给其它操作系统,用于在Windows中为MacBook启用iGPU
不同的设备硬件地址不一样!你需要先通过Hackintool或者Windows设备管理器等工具查看PCI设备地址!
此处内容可以用Hackintool生成然后直接复制过来,请提前确保内容和结构无误
PciRoot(0x0)/Pci(0x2,0x0)
注入缓冲帧补丁,查看此处来确认你需要的缓冲帧补丁
应用AppleALC音频LayoutID注入
这里的设置等同于Clover里的ACPI重命名_DSM→XDSM+TgtBridge
这里是指定要加载哪些Kext以及仿冒CPUID的地方,这里的顺序非常重要,所以请确保Lilu.Kext始终在第一位!其他优先级更高的Kext为Lilu的插件,如VirtualSMC,AppleALC,WhateverGreen等
Add:
BundlePath
这里填入Kext的名称如:Lilu.kext
Enabled
控制Kext的启用禁用
ExecutablePath
隐藏在kext中的实际可执行文件的路径,可以通过右键单击并选择显示包内容来查看Kext的路径。通常为Contents/MacOS/(Kext),但有的时候Plugin文件夹下也会有Kext。如:Contents/MacOS/Lilu
空壳Kext没有可执行文件(e.g.USBPorts.kext),此项留空即可
PlistPath
隐藏在Kext中的Info.plist路径如:Contents/Info.plist
VoodooPS2注入样板
CpuidData:设置为零时,将使用原始CPU位<Clover_FCPUID_Extended_to_4_bytes_Swapped_Bytes>|00000000|00000000|00000000例如:CPUID0x0306A9就是A9060300|00000000|00000000|00000000
CpuidMask:CPU的被仿冒位FFFFFFFF|00000000|00000000|00000000如果需要替换更长的位,将00替换为FF
AppleCpuPmCfgLock:NO如果设备的CFG-Lock是开启的状态则需要设置为YES(尽可能用Grub关闭BIOS的CFG-Lock并避免开启这个Quirk)
AppleXcpmCfgLock:NO同上
AppleXcpmExtraMsrs:NO禁用奔腾和某些至强等不支持CPU所需的多个MSR访问
AppleXcpmForceBoost:NO强制拉高睿频,建议在长期高负载的专业设备上使用,至强系列的处理器开启这个选项会受益
CustomSMBIOSGuid:NO对UpdateSMBIOSMode自定义模式执行GUID修补,用于戴尔笔记本电脑(等同于Clover的DellSMBIOSPatch)
DisbaleIOMapper:NO需要绕过VT-d且BIOS中禁用时使用
DummyPowerManagement:NO禁用AppleIntelCpuPowerManagement原生电源管理,用于更好的替代NullCpuPowerManagement.kext
ExternalDiskIcons:YES硬盘图标补丁,macOS将内部硬盘视为外接硬盘(huangse)时使用
IncreasePciBarSize:NO将IOPCIFamily中32位PCIBar的大小从1GB增加到4GB,在BIOS中启用Above4GDecoding是一种更加干净和安全的方法。某些X99板可能需要开启,这些主板通常会在IOPCIFamily上遇到内核崩溃
LapicKernelPanic:NO禁用由AP核心lapic中断造成的内核崩溃,通常用于「惠普电脑」(等同于Clover的KernelLAPIC)
PanicNoKextDump:YES在发生内核崩溃时阻止输出Kext列表,提供可供排错参考的崩溃日志,排错时请务必开启
PowerTimeoutKernelPanic:YES修复macOSCatalina中由于设备电源状态变化超时而导致的内核崩溃
ThirdPartyDrivers:NO为SSD启用TRIM指令,NVMeSSD会自动被macOS加载因此不需要,SATASSD可以在终端执行sudotrimforceenable开启同时修复macOS10.15下非苹果原厂SSD无法使用硬盘休眠(hibernatemode25)
XhciPortLimit:YES这实际上是15端口限制补丁,不建议依赖,因为这不是USB的最佳解决方案。有能力的情况下请选择定制USB,这个选项适用于没有定制USB的设备
BlessOverride:用于覆盖Windowsbootmgfw.efi的位置以便识别Windows引导项,OpenCore和Windows的引导文件在同一硬盘的同一ESP分区下使用
1
2
3
Boot:引导界面的设置
HibernateMode:None
与系统内的休眠模式(hibernatemode25)配合,引导进系统会还原休眠前的状态,这个功能会影响SSD寿命,建议关闭
None:关闭休眠支持Auto:自动检测RTC和NVRAM模式RTC:RTC模式
HideAuxiliary:YES
默认隐藏以下引导项,按空格键显示全部macOS恢复在自定义引导项时定义为Auxiliary的引导项在Tools中添加的操作系统(如:CleanNVRAM)
HideSelf:NO
在OpenCore的启动选择中隐藏自身EFI分区内的其它启动项
PickerAttributes:0x00
给OpenCore自带的引导选择界面添加特效,食用方法为填入字体颜色和背景颜色的值的16进制之和
字体颜色0x00:黑0x01:蓝0x02:绿0x03:青0x04:红0x05:品红0x06:棕0x07:浅灰0x08:深灰0x09:浅蓝0x0A:浅绿0x0B:浅青0x0C:浅红0x0D:浅品红0x0E:黄0x0F:白
背景颜色0x00:黑0x10:蓝0x20:绿0x30:青0x40:红0x50:品红0x60:棕0x70:浅灰
PickerAudioAssist:NO设置为YES时会朗读屏幕上选择项的内容,需要提提前在EFI中放入音频文件并正确设置下文的Audio章节PollAppleHotKeys:YES
设置为YES后允许在引导过程中使用苹果原生快捷键,需要与QuirkKeySupport=Yes结合使用,具体体验取决于主板固件。快捷键组合:Cmd+V:启用-v跑码Cmd+Opt+P+R:重置NVRAMCmd+R:启动恢复分区Cmd+S:启动至单用户模式Option/ALT:在ShowPicker设置成NO时显示引导项选择界面,ALT不可用时可用ESC键代替Cmd+C+减号:关闭主板兼容性检查,等同于添加引导标识符-no_compat_checkShift:安全模式
ShowPicker:YES
显示OpenCore的UI,用于查看可用引导项设置为NO可以跳过倒计时,和PollAppleHotKeys=Yes配合快捷键可以大幅提升体验
TakeoffDelay:0
在启动前延迟n毫秒,提升键盘快捷键识别的正确率。n的有效范围为大于5000~10000,32bit以内的正整数
Timeout:0
设置引导项等待时间,单位秒0为关闭倒计时,相当于Clover的-1(并不是跳过倒计时)
PickerMode:Builtin
Builtin
使用OpenCore自带的简单UIExternal
使用其它GUIApple
使用苹果原生的GUI,黑苹果不支持
DisableWatchDog:NO
如果macOS在启动时卡在某些地方,可能需要设置为YES,通常用于排除错误干扰
DisplayDelay:0DisplayLevel:
2147483714:在屏幕上显示所有Debug信息0:隐藏所有Debug信息
Target:
0:关闭日志记录3:允许屏幕输出日志19:允许屏幕输出UEFI变量日志65:在ESP分区根目录生成日志文件opencore-YYYY-MM-DD-HHMMSS.txt,但屏幕上不显示日志
AllowNvramReset:YES
允许在引导选择界面和快捷键Cmd+Opt+P+R按下时重置NVRAM
AllowSetDefault:YES
允许使用CTRL+回车和CTRL+数字锁定默认启动项
AuthRestart:NO
允许重启FileVault2分区时不用再次输密码,有安全风险
ExposeSensitiveData:
3将OpenCore的启动路径和版本储存进NVRAM11在3的基础上添加主板OEM信息,HWMonitorSMC2和NVMeFix需要主板OEM信息才能正常工作
Vault:Optional
OpenCore自身的加密和安全保护,具体参考官方文档
Optional
不强制要求vault.plist和vault.sig文件存在,但是会在其中任意文件存在时依旧执行验证,不安全Basic
强制要求vault.plist存在,开机时会根据里面的内容核对OC目录下的文件,防止在EFI文件系统崩溃后依旧启动Secure
强制要求vault.sig签名文件和vault.plist存在,用于和UEFI安全启动配合
ScanPolicy:0
0:允许扫描所有可用的硬盘其它值请参考官方文档,对给出的选项做16进制加法运算
Arguments传递的参数
Auxiliary:YESYES默认隐藏
NameOpenCore启动项中显示的名称
Enabled启用或禁用
PathTools文件夹下的文件名如:VerifyMsrE2.efi
Arguments传递的参数
Auxiliary:NOYES默认隐藏
NameOpenCore启动项中显示的名称
Enabled启用或禁用
Path引导磁盘的PCI路径,可以通过OpenCoreShell的map命令找到如:PciRoot(0x0)/Pci(0x1D,0x4)/Pci(0x0,0x0)/NVMe(0x1,09-63-E3-44-8B-44-1B-00)/HD(1,GPT,11F42760-7AB1-4DB5-924B-D12C52895FA9,0x28,0x64000)/EFIMicrosoftBootootmgfw.efi
Add:
4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14
UIScale:OpenCoreUI和引导第一阶段缩放01:正常大小02:HIDPI(使FileVault和苹果标志在原生HIDPI显示器上以正常大小显示)
DefaultBackgroundColor:默认背景颜色控制第一阶段苹果标志后面的背景颜色,加特技格式为16进制颜色RGBA:RRGGBBAA,可以随意调整标准色:黑:00000000灰:BFBFBF00
7C436110-AB2A-4BBB-A880-FE41995C9F82
boot-args:-vdebug=0x100引导标识符,更多请查看附录[3]
csr-active-config:<0x00000000>(SIP设置)0x00000000-SIP完全开启0x30000000-允许未签名的Kext加载并允许写入受保护的文件系统路径0xE7030000-SIP完全关闭0x67000000-不再推荐使用
nvda_drv:<>设为31时启用NVIDIAWebDrivers没有N卡可以删除此项
prev-lang:kbd:<0x7a682d48616e733a323532>(将默认语言设置为简体中文,留空为英文)SystemAudioVolume:0x460x80为静音
具体工作原理请参考Acidantherabugtracker#575
没有原生NVRAM的设备设置为YESmacOS下硬件NVRAM工作「不」正常的设备设置为YESmacOS下硬件NVRAM工作正常的设备设置为NO
允许nvram.plist中的变量覆盖现有NVRAM的变量模拟NVRAM需要开启
选择注入的NVRAM变量,其它未被包含的变量即使存在于nvram.plist也不会被注入,与LegacyEnable配合使用
在有些有bug的UEFI固件上,系统运行时不能将易失性变量转换为非易失性变量,这个选项提供的是一个解决方案,并没有增加一个新功能
Auto:YES(基于Generic部分生成PlatformInfo,而不是DataHub,NVRAM和SMBIOS部分)
OpenCore提供了大量方法来注入PlatformInfo,这里只介绍最简单的自动注入法
AdviseWindowsYES启用来允许重启到一个ESP分区不是磁盘中第一个分区的磁盘中的Windows
SpoofVendor:YES仿冒制造商为Acidanthera来避免出现冲突
SystemUUID:填入设备的硬件UUID以免造成Windows和其它软件的激活问题(官方不再建议留空)
MLB:用macserial读取或生成
ROM:<0x############>可以是任意6ByteMAC地址,如0x112233000000
SystemProductName:用macserial读取或生成
SystemSerialNumber:用macserial读取或生成
使用macserial查看原有PlatformInfo:
打开下载好的MacInfoPkg找到里面的macserial并将其复制到桌面终端输入:(建议复制粘贴)
1
2
3
此时你现有的PlatformInfo就已经列出来了,对着Config对号入座即可
如果要生成新的PlatformInfo请输入如下命令来列出所有支持的设备型号:
1
2
3
然后输入如下命令来生成序列号和MLB
1
请忽略<>,例子:./macserial-mMacBookPro15,3
输出的结果中,|前面的是序列号SystemSerialNumber,后面的是MLB
ConnectDrivers:YES
强制加载.efi驱动程序,更改为NO将自动连接UEFI驱动程序,这样以获得更快的启动速度,但并非所有驱动程序都可以自行连接,某些文件系统驱动程序可能无法加载
这里的声卡设置只与UEFI环境相关,不影响系统内音频,但是需要确保系统内声卡正常工作,这里填的部分值需要从系统内的IOReg提取
AudioSupport:YESYES启用音频支持
AudioDevice:声卡设备的PCI地址PciRoot(0x0)/Pci...可以在macOS下运行gfxutil-fHDEF获得
AudioCodec:0声卡的Codec地址,可以在IORegistryExplorer的HDEF→IOHDACodecDevice→IOHDACodecAddress中获得,一般是0x0直接搜索IOHDACodecDevice可以大幅节约时间
AudioOut:指定的输出设备,最简单的方法就是从0到声卡总输出数每个都试一遍声卡的总输出数可以在Debug版本的OpenCore日志中获得(nOutputs)
MinimumVolume:输出最小音量,有效值为0~100如果下方VolumeAmplifier公式计算出的最小音量小于这里给出的值Duang就不会被播放
PlayChime:YESYES播放Duang
VolumeAmplifier:1000音量在原有基础上放的百分比有效范围0~1000
同时AudioDxe也需要安装在Drivers文件夹中并通过config注入
KeyForgetThreshold:5按住按键后每个键之间的时间间隔(单位:毫秒)
KeyMergeTheshold:2按住按键被重置的时间间隔(单位:毫秒)
KeySupport:YES开启OC的内置键盘支持使用AppleUsbKbDxe.efi请设置为NO
KeySupportMode:Auto键值转换协议模式V1:UEFI旧版输入协议V2:UEFI新输入协议AMI:APTIO输入协议
KeySwap:NO交换Command和Option键
PointerSupport:NO修复UEFI选择器协议
PointerSupportMode:留空TimerResolution:50000固件时钟刷新的频率(单位:100纳秒)华硕主板为自己的界面使用60000苹果使用100000
TextRenderer:BuiltinGraphics
文字渲染模式
BuiltinGraphics:使用OpenCore内置文字渲染的图形模式,并同时启用OpenCore自带的控制台管理,支持HIDPI和全屏范围显示,通常效果胜于下面的选项SystemGraphics:使用主板固件自带文字渲染的图形模式,并同时启用OpenCore自带的控制台管理SystemText:使用主板固件自带文字渲染的文字模式,并同时启用OpenCore自带的控制台管理SystemGeneric:使用主板固件自带文字渲染的文字模式和自带的控制台管理
ConsoleMode:留空
控制台模式
大多数固件上留空是最好的选择Max会尽可能使用最大的ConsoleModeTextRendere使用Builtin时此项设置不生效
Resolution:Max
宽x高@Bpp(如:3840x2160@32),注意Bpp不是刷新率,而是显示位深(bitsperpixel),如果不清楚可以不填宽x高(如:3840x2160)也是支持的留空将不会改变UEFI的默认分辨率Max将会尝试开启最大分辨率
开启后会直接使用OpenCore内置的GOP渲染控制台这个选项主要用于提升或修复MacPro5,1的渲染问题除非开启后能明显感觉到有改进否则不要开启
IgnoreTextInGraphics:NO修复不用-v开机时日志覆盖苹果标志输出的问题ReplaceTabWithSpace:NO取决于固件,某些设备在UEFIShell中编辑文件使用Tab键出问题时启用。注意,此选项只作用于TextRenderer:System...(主板固件自带)的文字渲染ProvideConsoleGop:YES
macOS引导加载程序要求GOP(图形输出协议)存在于控制台句柄上大部分的笔记本都不提供GOP,台式机的独立显卡可以单独刷入GOP如果选择启动项之后不出现macOS启动Verbose请启用开启此选项能最大可能保证OpenCoreUI和苹果标志以正确分辨率显示
ReconnectOnResChange:NO有些固件在GOP分辨率改变后要求重新连接控制器才能输出文本,开启这个选项会导致从UEFIShell中启动OpenCore时直接黑屏,尽量避免开启SanitiseClearScreen:YES
修复OpenCore在高分屏中以1024x768显示的问题,注意要同时开启带有OpenCore自带的控制台管理(ConsoleControl)的TextRenderer(前三种)并将ConsoleMode的内容「留空」
AppleAudio:YES安装AppleAudio协议以在OpenCore中使用VoiceOver,目前该协议支持在macOS10.13及以上播放音频,老系统使用的AppleHDA协议暂未支持
AppleBootPolicy:NO用于确保虚拟机或旧白苹果上兼容APFS
AppleEvent:NO用于在虚拟机或旧白苹果上兼容文件保险箱
AppleImageConversation:NO重新安装AppleImageConservation协议
AppleKeyMap:NO重新安装AppleKeyMap协议
AppleSmcIO:YES重新安装AppleSMCI/O协议VirtualSmc.efi已经被替代为此选项
AppleUserInterfaceTheme:NO重新安装AppleUserInterfaceTheme协议
DataHub:NO重新安装DataHub协议
DeviceProperties:NO确保在VM或旧白苹果上完全兼容
FirmwareVolume:NO修复Filevault的UI问题,设置为YES可以获得更好地兼容FileVault
HashServices:NO修复运行FileVault时鼠标光标大小不正确的问题,设置为YES来在AptioIV或更老的主板上兼容FileVault
OSInfo:NO用于为主板或者其它程序接收来自macOS引导工具的消息
UnicodeCollation:NO一些较旧的固件破坏了Unicode排序规则,设置为YES可以修复这些系统上UEFIShell的兼容性(通常为用于IvyBridge或更旧的设备)
ExitBootServicesDelay:0IgnoreInvalidFlexRatio:NO
BIOS中无法禁用MSR_FLEX_RATIO(0x194)时开启
ReleaseUsbOwnership:NO
从固件驱动程序中释放USB控制器所属权,除非您不知道自己在做什么,否则避免使用。Clover的等效设置是FixOwnership
RequestBootVarFallback:YES
用于修复启动项顺序
RequestBootVarRouting:YES
从EFI_GLOBAL_VARIABLE_GUID中为OC_VENDOR_VARIABLE_GUID请求redirectBoot前缀变量启用此项以便能够在与macOS引导项设计上不兼容的固件中可靠地使用启动磁盘设置
UnblockFsConnect:NO
惠普笔记本在OpenCore引导界面没有引导项时设置为YES
在重启进入OpenCore之前,我们还需要解决一些冲突问题:
删除Clover设置面板
Clover设置面板会和OpenCore产生冲突,需要删除
Clover设置面板位于/Library/PreferencePanes/Clover.prefPane终端输入sudorm-rf/Library/PreferencePanes/Clover.prefPane删除
清理Clover的模拟NVRAMRC脚本和守护程序CloverDaemonNew
在终端中输入:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
重置「硬件」NVRAM
为了尽可能减少问题出现的概率,建议在Clover和OpenCore之间切换时重置「硬件」NVRAM
通过CloverF11清除删除Clover内的EmuVariableUefi.efi(通常位于Drives/UEFI/或drivers64UEFI/目录下)
如果不删除EmuVariableUefi.efi,Clover只会重置模拟出来的原本就是空的NVRAM重启进入Clover引导项选择界面然后按下F11或Fn+F11直到设备自动重启
开机直接选择UEFI引导项进入OpenCore通过OpenCore重置
参考下文
完善与优化
这里只简单写了一些网上暂时还找不到中文解决方案的一些问题,强烈推荐在看这里的同时参阅xjn大佬的博客
排除常见错误
遇到如下问题可以尝试这样设置:
进入OpenCore时卡在novaultprovided!:
Misc→SecurityVault=Optional
选完启动项后卡在EndRandomSeed或直接卡死
如果等一会能进入系统但是不跑码「或」不显示第一阶段的苹果标志:
UEFI→QuirksProvideConsoleGop=YES
如果完全卡死:
尝试Misc→Boot下PollAppleHotKeys=NO,UEFI→Input下KeySupport=NO,并换用AppleUsbKbDxe.efi这个设备的CFG很可能有锁,如下方案「二选一」解锁CFG(建议),参考xjn教程中的解锁BIOS中的CFG功能小节Kernel→Quirks下AppleCpuPmCfgLock=YES,AppleCpuPmCfgLock=YES
这个方法的代价是丧失原生电源管理,「不」建议长期使用
卡在PCIConfigurationBegin
BIOS关闭CSM并设置操作系统模式为Win8.1/10依次尝试如下引导标识符
npci=0x2000npci=0x3000
如果依旧不行,将Booter→MmioWhitelist→Item1(Generic...)下的Enabled改为True
4代CPU主板可以尝试同时开启Item0下的补丁
开机出现Failedtoparserealfieldoftype1
这是因为OC本身不支持real类型的数据,Xcode在编辑较长的数字的时候会自动将Integer转换为real
用VSCode打开config.plistCommand+F查找替换所有real为Integer
开机卡在ThisversionofMacOSXisnotsupported
检查Config内PlatformInfo是否填写无误Automatic=YES如果使用的是SampleFull,确保所有内容都已完整填写
300系主板卡在apfs_module_start
较新的主板使用了新的时钟AWAC来代替RTC,这个设备与macOS不兼容,下面的方法「二选一」(推荐)添加SSDT-AWAC来屏蔽AWAC并启动RTC用SSDT-RTC0仿冒RTC
华硕或惠普关机后BIOS重置或被强制进入安全模式
将Kernel→Patch→Item0(com.apple.driver.AppleRTC)下的Enabled改为YES来开启AppleRTCPatch
UEFI引导项选择完OpenCore之后直接跳回选择界面
参考上文重新核对ESP分区中的文件夹结构,确保UEFI启动项添加的是OpenCore的Bootx64.efi
开始之前先在这里澄清一些被广泛误解的理论并解释一些常见问题
什么是NVRAM:
非易失性随机存取存储器(NVRAM)是随机存取存储器(RAM)的一种;在依赖主板上CMOS电池时,即使断开电脑电源,该存储器仍可以保证存储的数据不丢失NVRAM里存有大量敏感参数,如:UEFI安全启动的KEK,PK,DB和DBX,因此NVRAM需要是一种提供随机访问功能的非易失性存储器,且需要通过特定的GUID读写
没有「原生NVRAM」的含义:
所谓“没有「原生」NVRAM”实际上指的是macOS在使用APTIO内存修复驱动的环境下NVRAM的「写入」依旧没有被修复,导致变量无法存入主板现在支持UEFI的主板都支持NVRAM,而且NVRAM在Windows或者Linux下完全正常工作macOS可以正常读取NVRAM,也就是说在Windows下给NVRAM中的7C436110-AB2A-4BBB-A880-FE41995C9F82:bootargs加上-v后重启进入macOS会直接进入啰嗦模式「没有原生NVRAM」很容易误解为这个主板如同传统BIOS+MBR引导的主板一样完全不支持NVRAM「原生NVRAM」实际上应该理解为macOS可以正常读写「硬件」NVRAM
没有原生或模拟NVRAM的影响:
无法使用偏好设置的启动磁盘为OpenCore指定默认引导项FakeSMC的部分SMCKey无法保存AsusSMC.kext会丢失键盘在上次关机时的亮度
部分X99和X299芯片组主板之前300系的NVRAM问题已经通过SSDT添加PMC设备的方式解决
验证你的主板的NVRAM在macOS下是否正常工作:
有时候只参考并不能得出准确的结论,实际试验一下更加准确
删除引导工具内的VariableRuntimeDxe.efi,EmuVariableRuntimeDxe.efi,EmuVariableUefi.efi删除NVRAM导出脚本LogoutHook(参考下文),RCScript(参考上文)删除EFI分区根目录下的nvram.plist重启在终端输入sudonvrammyvar=test再次重启在终端输入nvram-p|grep-imyvar如果终端成功输出了test那就说明你的主板在macOS下硬件NVRAM正常工作,反之就是「不」正常工作
模拟NVRAM是什么,LogoutHook扮演什么角色:
模拟NVRAM是通过VariableRuntimeDxe(EmuVariableRuntimeDxe/EmuVariableUefi)模拟出一个macOS可读写的重启「不记忆」NVRAM,里面的内容与硬件层面的NVRAM完全隔离,引导工具在加载完这个驱动后自身也会进入这个环境中并失去对硬件NVRAM的控制LogoutHook是一个在账户注销前运行的脚本,运行时会用nvram-x命令将NVRAM中的信息导出至EFI分区根目录的nvram.plist中,OpenCore在下一次开机时会读取nvram.plist里面的内容并写进硬件NVRAM中
可以直接使用别人生成的nvram.plist吗
使用别人的nvram.plist时,只有7C436110-AB2A-4BBB-A880-FE41995C9F82下的内容可以正常工作8BE4DF61-93CA-11D2-AA0D-00E098032B8C下的内容由于UUID不同完全无法工作,完全无法为OpenCore指定默认引导项即使不模拟NVRAM,OpenCore和FwRuntimeServices提供的7C436110-AB2A-4BBB-A880-FE41995C9F82模拟已经足以在nvram.plist中正确生成此项所以这么做完全没有意义
确认主板在macOS下NVRAM不正常工作后我们可以通过安装OpenCore提供的LogoutHook来模拟NVRAM
这里强烈建议在开始之前用OpenCore重置NVRAM并通过VariableRuntimeDxe.efi创建一个虚拟的可正常读写的NVRAM
如果严格按照这个流程执行且Config内BlessOverride和启动项的路径均已设置正确,那么理论上启动磁盘为OpenCore指定默认引导项的功能已经可以正常工作
如果OpenCore无法正确识别Windows建议先修复这个问题再模拟NVRAM
按照上文的方法清理Clover的RC脚本彻底删除之前安装的LogoutHook
终端输入:sudodefaultsreadcom.apple.loginwindowLogoutHook来获取LogoutHook的路径
如果终端输出的不是一串路径,而是
Thedomain/defaultpairof(com.apple.loginwindow,LogoutHook)doesnotexist
说明系统内没有安装LogoutHook,跳过下面的命令直接继续下一步Config的设置输入如下命令来删除LogoutHook.command并清空触发设置(请按顺序执行!!!)
1
2
3
4
5
Config中:
Booter→Quirks→DisableVariableWrite设置为YESMisc→Security→AllowNvramReset设置为YESMisc→Security→ExposeSensitiveData设置为3NVRAM→LegacyEnable设置为NO
删除引导工具内config.plist「和」Drivers目录下的VariableRuntimeDxe.efi,EmuVariableRuntimeDxe.efi删除EFI分区下的nvram.plist重启进入OpenCore然后选择引导界面的重置NVRAM选项「或者」按下快捷键Command+Option+P+R设备自动重启后,进入BIOS,Windows或者WinPE重新为OpenCore添加引导项
OpenCore重置NVRAM时相比Clover会重置更多的变量,理论上更干净,但是会导致UEFI引导项丢失进入macOS,在Config里将NVRAM→LegacyEnable设置为YES,UEFI→Drivers下添加VariableRuntimeDxe.efi
1
2
3
4
在EFI/OC/Drivers文件夹下放入VariableRuntimeDxe.efi再次重启进入macOS,打开偏好设置/启动磁盘,解锁后选择你的macOS分区然后「锁上」终端输入命令检查NVRAM变量是否成功写入:
1
如果输出的「结尾」部分包含SystemLibraryCoreServicesoot.efi我们可以继续执行下面的步骤如果显示nvram:Errorgettingvariable-'8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0080':(iokit/common)datawasnotfound说明模拟NVRAM没有成功,请回到第一步重来
在终端中输入sudo+空格然后将LogoutHook拉进终端的「窗口中」,按下回车,输入密码,再次回车(临时运行LogoutHook)终端中会出现一排上上步提到的错误,这是正常的因为我们没有其它的引导项(Boot0081~3)和上次引导的记录(BootCurrent)等等,只需要确保「没有任何关于」Boot0080和BootOrder的错误出现就可以了(BootNext也会报错但是实测没有影响)挂载EFI分区并打开根目录下的nvram.plist,检查Boot0080和BootOrder是否存在
1
2
3
4
5
6
7
8
如果没有问题,在终端输入如下命令「安装」LogoutHook:
1
2
3
如果使用10.12或更老的系统则需要将nvram.mojave也复制到$HOME下
mv(空格,把nvram.mojave拖窗口,然后再空格)$HOME再次删除引导工具内config.plist「和」Drivers目录下的VariableRuntimeDxe.efi
大功告成!
在Config中:
UEFI→ProtocolsConsoleControl=YES
UEFI→QuirksProvideConsoleGop=YESIgnoreTextInGraphics=YESSanitiseClearScreen=YES
Misc→BootConsoleMode=留空Resolution设置为显示器的正常分辨率,如4k:3840x2160
UEFI→OutputTextRenderer=BuiltinGraphics
将ConsoleMode设置为Max并关闭SanitiseClearScreen在某些固件上也可以做到分辨率正确,但是这个方法官方「不」推荐使用
在OpenCore中启用FileVault文件保险箱
在Config中:
Misc→SecurityAuthRestart=YES
UEFI→InputKeySupport=YES
UEFI→ProtocalsFirmwareVolume=YESAppleSmcIo=YESProvideConsoleGOP=YESRequestBootVarRouting=YES(Haswell或更老的主板中(包括X99))HashServices=YES(在AptioIV固件的主板上,如果遇到了Stillwaitingforrootdevice)ExitBootServicesDelay=5
在与引导项的.efi文件的同一目录下添加纯文本文件.contentDetails可以修改对应启动项的名称
注意⚠️!!!启动项名称只能是ASCII字符!!!
下方的命令修改的是当前macOS的启动项名称,修改其它分区的macOS前需要先进入其目录,这里不再赘述
删掉.contentDetails就可以恢复原来的名称
终端输入:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
附录[1]–OpenCore支持的内核驱动(Kext)及其用途
参考https://github.com/acidanthera/OpenCorePkg/blob/master/Docs/Kexts.md
GitHub项目的下载地址位于Release下,驱动具体支持的设备请进入项目地址查看
有线网卡
驱动及项目地址备注