OCLP 根卷补丁实战:从执行到回滚的完整流程
【免费下载链接】OpenCore-Legacy-PatcherExperience macOS just like before项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher
引言
当你敲下 OCLP 的根卷补丁命令,却在日志里看到 "An update is in progress on your machine and patching cannot continue" 时,补丁流程会在挂载校验这一步直接中止。OpenCore-Legacy-Patcher(OCLP)的根卷补丁是整个项目里最核心、也最容易出问题的一环:它要挂载只读的系统卷、替换驱动、重建内核缓存,最后用 APFS 快照封住改动。搞懂这套"补丁 → 校验 → 回滚"的闭环,比背命令本身更重要。
这套机制到底解决什么问题
macOS 从 Catalina 开始把/System卷设为只读,SIP 再罩一层,普通手段根本改不动系统文件。OCLP 要让老 Mac 跑新系统,必须动内核扩展和 GPU 驱动,靠的就是这套根卷补丁机制。
没有它会出什么事:
- 补丁写不进系统卷。直接
cp一个 kext 进/System/Library/Extensions,SIP 会立刻拒绝,驱动等于白装。 - 改了驱动,内核缓存不认。kext 是合并进内核缓存(KernelCache)一起启动的,只换文件不重建缓存,重启后新驱动根本不加载。
- 更新或重装后补丁全丢。macOS 一更新,
/System就被整体替换,之前塞进去的东西随之蒸发。 - 出了问题没法退。系统卷被改坏了,没有"撤销上一手"的开关。
OCLP 的解法是借用 APFS 的快照能力:挂载 → 改 → 重建内核缓存 → 用bless打一个新的 sealed snapshot 把改动封存。回滚时再bless --last-sealed-snapshot指回上一个快照。这就把"改系统"变成了"在快照之间来回切",是可逆的。
动手前的准备
根卷补丁不是开箱即用的命令,它依赖一套从源码跑起来的环境。前置条件如下:
- 一台 macOS(Big Sur 及以上最稳妥,快照机制才完整),且系统是干净安装或原生升级——已经被别的补丁器动过的系统因 APFS 快照与文件完整性损坏无法使用(README.md 明确说明)。
- Python 3.6 或更新版本,建议 3.11,且要从官方渠道安装(SOURCE.md)。
- 仓库依赖装好:requirements.txt 列了
requests、pyobjc、wxpython等,用pip3 install -r requirements.txt一次性装齐。 - 如果要用 git 拉取仓库再跑,克隆地址为
https://link.gitcode.com/i/4b18ae1626482fff4b64de207aaf0ab1。
真正干活的代码集中在 opencore_legacy_patcher/sys_patch/ 目录:
| 文件 | 职责 |
|---|---|
| sys_patch.py | 根卷补丁的主流程:挂载、执行补丁集、重建、回滚 |
| patchsets/detect.py | 检测硬件,算出这台机器需要哪套补丁 |
| patchsets/hardware/ | 各 GPU/硬件的补丁集定义(amd、intel、nvidia、misc) |
| mount/snapshot.py | APFS 快照的创建与回滚(bless) |
| kernelcache/ | 内核缓存的重建逻辑 |
命令行入口是 opencore_legacy_patcher/application_entry.py,参数解析在 opencore_legacy_patcher/support/arguments.py。跑起来的方式是:
# 仓库根目录下启动,无参数进 GUI,带参数进 CLI python3 OpenCore-Patcher-GUI.command跟着做完一整轮
先看清要打哪些补丁
这一步是只读检测,不落地任何改动,用来确认 OCLP 对你这台机器判定的补丁集是否合理。
# 不挂任何动作,先看检测结果 python3 OpenCore-Patcher-GUI.command --help正式打补丁时,HardwarePatchsetDetection会根据 CPU、GPU、型号算出所需补丁集;如果结果为空,日志会直接提示 "No Root Patches required for your machine!" 并结束,不会做无谓操作。
⚠️ 坑位:检测结果依赖ioreg拿到的真实型号与 GPU 信息。如果你在 VM 或非目标硬件上跑,型号对不上,补丁集会缺失甚至报 "Cannot continue with patching!!!"。先确认--model没被误设。
挂载并执行补丁集
这一步是真正的重头戏:挂载可写根卷、跑前置检查、逐个落地补丁、重建内核缓存、封快照。
# 对当前机器打根卷补丁 python3 OpenCore-Patcher-GUI.command --patch_sys_vol它背后做的事(见 sys_patch.py 的start_patch→_patch_root_vol→_rebuild_root_volume):
- 把 APFS 根卷挂到
/System/Volumes/Update/mnt1; - 跑 sanity check,比对
SystemVersion.plist里的构建号; - 逐个执行补丁集里的删/装/合并操作,需要时合并 KDK(Ventura+);
- 重建 KernelCache,Catalina 还要更新 preboot 缓存,Mojave 及更旧要重建 dyld 共享缓存;
- 用
bless创建新的 sealed APFS 快照。
做完这一步你应该看到日志结尾:
- Patching complete Please reboot the machine for patches to take effect💡 提示:Ventura 及以上、且补丁动了/Library/Extensions时,日志会额外提示你需要去"系统设置 → 隐私与安全性"里放行新内核扩展,重启后第一次启动可能停留在这个授权页。
⚠️ 坑位:sanity check 比的是构建号,不是版本号。只要系统里有已下载未完成的更新,挂载卷里的SystemVersion.plist就可能和你当前运行的不一致,补丁会被"An update is in progress"拦下。先让更新彻底完成或取消,再重试。
回滚上一次补丁
这一步把根卷退回到补丁前的那个 sealed 快照,并清理补丁留下的痕迹。
# 回滚根卷补丁(源码标注 EXPERIMENTAL) python3 OpenCore-Legacy-Patcher/OpenCore-Patcher-GUI.command --unpatch_sys_vol注意入口文件名:unpatch走的是同一个入口脚本,参数是--unpatch_sys_vol。它对应 sys_patch.py 的start_unpatch→_unpatch_root_vol,做三件事:
APFSSnapshot.revert_snapshot(),用bless --last-sealed-snapshot指回上一个快照;- 清理 non-Metal 的 Skylight 插件和强制 OpenGL 的 defaults;
- 清掉辅助内核缓存里的残留 kext。
⚠️ 坑位:回滚依赖"上一个 sealed 快照还在"。Big Sur 因为系统会很快丢弃原快照(通常 2~3 次启动内),回滚不稳定;Monterey 起会保留原快照,回滚才可靠(sys_patch.py 顶部注释写明)。别在 Big Sur 上把回滚当成兜底。
出错了怎么办
按"症状 → 原因 → 解法"对照排查:
补丁中途报 "An update is in progress on your machine"原因:sanity check 发现挂载卷的构建号与当前系统对不上,说明有更新在途。 解法:等更新装完并重启,或在系统设置里取消更新,再重新跑--patch_sys_vol。
补丁跑完、重启后驱动不生效 / 卡在安全授权页原因:内核扩展没被系统放行,或内核缓存没重建成功。 解法:进系统后到"隐私与安全性"点"仍要允许";确认日志里_rebuild_root_volume没有失败。仍不行就重跑一次--patch_sys_vol。
回滚后状态不对、想彻底复位原因:补丁集只做了部分落地,或快照已被系统丢弃,回滚不干净。 解法:先--unpatch_sys_vol清痕迹;若仍异常,最稳的恢复是用外部引导盘重装一个干净系统再重新走完整补丁流程——OCLP 官方只支持干净安装与升级,不支持在已被别的补丁器动过的系统上叠加(见 README.md 与 docs/UNINSTALL.md)。
怀疑改动引入了异常,想先验证再动手原因:不确定当前环境是否满足补丁条件。 解法:用--validate跑一遍校验(support/validation.py),它在 CI 里就是干这个的,本地同样能用来自检。
# 运行校验测试,不落地改动 python3 OpenCore-Patcher-GUI.command --validate一页速查
| 命令 / 配置 | 作用 |
|---|---|
--patch_sys_vol | 对当前机器执行根卷补丁 |
--unpatch_sys_vol | 回滚上一次根卷补丁(实验性) |
--validate | 跑校验测试,自检环境 |
--build | 构建 OpenCore(配合--model指定机型) |
--prepare_for_update | 更新前清理/Library/Extensions等 |
requirements.txt | Python 依赖清单 |
检查清单:
- 系统是干净安装或原生升级,没被别的补丁器动过。
- Python 3.6+(建议 3.11),依赖已
pip3 install -r requirements.txt。 - 确认没有未完成的 macOS 更新,否则 sanity check 会拦截。
- 先跑
--validate自检,再决定打补丁。 - 打补丁后看日志结尾是否出现 "Patching complete"。
- 重启后若卡授权页,去"隐私与安全性"放行内核扩展。
- 需要退时,
--unpatch_sys_vol回滚,Big Sur 上不可尽信。 - 状态彻底乱时,优先用外部盘重装干净系统再重来。
以上命令与流程仅适用于在受信任的自有设备上做实验与恢复;对生产或唯一可用系统动手前,务必先有可引导的外部备份。
【免费下载链接】OpenCore-Legacy-PatcherExperience macOS just like before项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考