RemoveMacAI:一条命令关掉 macOS 27 的苹果 AI,拿回 12GB 磁盘空间

macOS 27 的系统设置里,那个一次关闭全部 Apple Intelligence 的总开关没有了。功能可以逐个关闭,但基础模型、Genmoji、图片生成这类模型资产会留在磁盘上,普通用户没有官方入口删掉它们。9 月 29 日创建的开源项目 RemoveMacAI 用一条命令把两件事一起做完:关闭全部 AI 功能,删除已下载的模型,再让 macOS 无法把它们下载回来。项目用 Swift 写成,MIT 协议,上线 6 天拿到 581 star,10 月 5 日以 437 分、273 条评论登上 Hacker News 首页。

RemoveMacAI 项目横幅

这篇文章基于 RemoveMacAI 的核心源码、上游项目 pared 的技术路径和作者在 r/macsysadmin 发布的机制说明,拆解它在不越狱、不关闭 SIP 的前提下拿回控制权的三层机制,以及这背后的系统设计变化。

苹果为什么删掉了开关

先看官方侧的语境。9 月 14 日,苹果发布下一代 Apple Intelligence 和 Siri AI,新助手具备个人上下文理解、屏幕感知和更广的系统级操作能力,随 2027 年度的系统更新逐步推出。支撑这些能力的 Apple Foundation Models 部分与 Google 的 Gemini 模型合作构建,既有端侧运行的部分,也有跑在 Private Cloud Compute 上的部分。为了让用户打开开关就能用,模型资产会提前下载到本地。

管理侧的变化更关键。macOS 长期通过 com.apple.applicationaccess 域下的 allowWritingTools、allowGenmoji、allowAssistant 等限制键(restriction keys)控制 AI 功能,这批键最初为 MDM(移动设备管理)和监管场景设计。RemoveMacAI 作者在 r/macsysadmin 的技术帖中指出,苹果在 macOS 26.4 废弃了这批旧键,替代方案是 intelligence.settings 和 siri.settings 两种声明,而新声明要求设备处于受监管(supervised)状态,也就是由组织注册管理的 Mac 才能使用。

普通用户的个人 Mac 不满足监管条件。在 macOS 27.0 上,手动安装的描述文件仍会走旧键路径生效:系统把 _isAppleIntelligenceRestricted 写入 /Library/Managed Preferences/com.apple.applicationaccess.plist,并把 allowWritingTools 镜像进 .GlobalPreferences。这是整个工具的立足点,给个人 Mac 装一份描述文件,借用企业管设备的老机制,把 AI 功能锁定为关闭。

三层机制:关功能、删模型、断下载

RemoveMacAI 的核心逻辑分三步,每一步都对应一段可以直接读的源码。

removemacai status 命令输出

第一层:描述文件锁定功能开关

工具生成一份系统级配置描述文件(identifier 为 io.github.omlahore.removemacai),里面有两组内容。第一组是 com.apple.applicationaccess 载荷,把要关闭的功能对应的限制键全部置为 false,覆盖 Siri、Writing Tools、Genmoji、Image Playground、Mail 摘要与智能回复、Safari 摘要、Notes 转写摘要、ChatGPT 扩展等。第二组是 com.apple.ManagedClient.preferences 载荷,对没有限制键的功能强制写入偏好设置,比如把 .GlobalPreferences 的 NSAutomaticInlinePredictionEnabled 设为关闭、把 com.apple.spatialphotosrelive 的 LocallyDisabled 设为开启。

安装环节刻意留了一个人工确认点:工具把 .mobileconfig 写到下载目录并打开系统设置,用户必须亲手双击安装。源码里的注释写明了原因:macOS 要求这一下点击必须由用户完成。

第二层:通过苹果自己的资产服务删模型

删模型是最容易踩红线的一步,系统分区受 SIP(System Integrity Protection)保护,常规做法是进恢复模式关 SIP 再删文件。RemoveMacAI 没有碰 SIP,它加载私有框架 UnifiedAssetFramework,通过 XPC 连接到 com.apple.siri.uaf.subscription.service 服务,发送一个 ResetAssetSets 操作,参数是要清空的资产集列表。

这段 UAF.m 的实现值得展开:工具用 dlopen 加载 /System/Library/PrivateFrameworks/UnifiedAssetFramework.framework,反射拿到 UAFXPCProxyServiceInterface 的默认接口定义,建立 NSXPCConnection 后校验远端协议确实接受 operationWithConfig:completion: 选择器,再发出 {"Operation": "ResetAssetSets", "AssetSets": [...]}。删除动作由苹果自己的资产服务执行,/System 下没有任何文件被改动,SIP 全程保持开启。

需要删哪些模型,由一套映射关系决定。Catalog.swift 定义了 5 组模型资产:

模型资产资产类型消耗它的功能
Apple Intelligence 基础模型com.apple.MobileAsset.UAF.FM.GenerativeModelsSiri、Writing Tools、Genmoji、Image Playground、各类摘要
图像与 Genmoji 模型com.apple.MobileAsset.UAF.FM.VisualGenmoji、Image Playground
空间照片模型com.apple.MobileAsset.UAF.Photos.SpatialPhotosReliveSpatial Photos
照片清理模型com.apple.MobileAsset.UAF.Photos.MagicCleanupPhotos Clean Up
Xcode 代码补全模型com.apple.MobileAsset.UAF.FM.CodeLMXcode 预测性代码补全

删除规则写在 setsToRemove(keeping:) 函数里:只删除「所有依赖它的功能都被关闭」的资产集。如果用户用 --keep 保留了 Image Playground,图像模型就会留下。这套粒度设计让部分关闭成为可能,也是它比手动删目录更稳的原因,手动删除很容易漏掉功能与模型之间的依赖。

第三层:把下载地址指到一个死端口

模型删掉之后,macOS 会在功能需要时重新下载。RemoveMacAI 的办法写在 Profile.swift 里:在 com.apple.MobileAsset 域写入 DownloadServerBaseURLOverride-<资产类型> 键,值统一指向 https://127.0.0.1:9/removemacai-blocked/。端口 9 是 discard 协议的保留端口,本机没有服务监听,每次下载请求都会直接失败。这个键同样写进描述文件,随描述文件持久存在,系统更新也不会清掉它。

用法和回滚

安装支持两条路径。一键脚本下载最新 release、校验 SHA-256 后在临时目录运行,不落盘安装;每个 release 由 GitHub Actions 从 tag 构建,附带构建来源证明(build provenance attestation),可以用 gh attestation verify 验证二进制确实来自这个仓库的源码。偏好包管理器的用户走 Homebrew:brew install omlahore/tap/removemacai。

sh
removemacai            # 显示当前状态,确认后关闭
removemacai status     # 查看各功能状态和模型占用
removemacai off --keep writing-tools   # 保留指定功能
removemacai off --dry-run              # 只生成描述文件供检查,不做任何更改
removemacai revert     # 移除描述文件,一切恢复

status 命令会逐项列出 14 个功能开关的状态和 5 组模型在磁盘上的实际占用。回滚只做一件事:移除描述文件。偏好设置立刻恢复用户自己的值,模型则在你重新打开某个功能时由 macOS 重新下载。

几个边界要清楚。听写不受影响,它是独立设置,语音模型不在删除范围。会失效的包括使用端侧模型的应用(Foundation Models 框架、快捷指令的「使用模型」)、视觉智能(Visual Intelligence)和日历的自然语言编辑。版本要求方面,工具只支持 macOS 27 且仅限 Apple silicon,27.0.1 需要 0.2.3 或更新版本;README 明确写了 macOS 26 及更早版本不在支持范围。

磁盘上到底有多少东西

官方横幅给出的数字是 12 GB,作者在 Reddit 的说明里也称 com.apple.modelcatalog 这组基础模型约 12 GB。实际数字因人而异:Hacker News 评论区有用户报告存储设置里 Apple Intelligence 一项显示 29 GB,也有用户按 128 GB 存储的 MacBook Air 算出模型占比约 9.4%。差异来自功能启用状态和代码补全、图像生成等附加模型是否已下载。

还有一个删除后的视觉残留:资产服务立刻释放模型,但 macOS 按自己的节奏删文件,存储设置里 Apple Intelligence 的计数会在一段时间内维持原值。工具的 status 输出专门为这种情况准备了一行提示,避免用户误以为删除没生效。

争议与边界

Hacker News 的 273 条评论呈现了两面。反对的一方认为 12 GB 在 2026 年不值得计较,有人把矛头指向 curl | bash 安装方式本身;支持的一方算的是另一笔账:苹果至今仍在销售 256 GB 存储的 Mac mini,系统盘长期紧张的用户对每一个 GB 都敏感,评论里也有人翻出「整个 macOS 曾经装得进 20 GB」的旧账。

信任链是这场讨论里质量最高的部分。对 curl | bash 的质疑有专门的网站和惯例背书,而 RemoveMacAI 的回应是工程化的:脚本先校验 SHA-256 再执行,release 带构建来源证明,另提供 Homebrew 这条不经过管道的安装路径,还有 --dry-run 模式把描述文件生成到临时目录供人工检查后再决定。描述文件本身是一个权限敏感物,它借用的是企业管设备的机制,能强制写入系统偏好。装它之前先看一眼 --dry-run 的产物,是使用这个工具的正确姿势。

项目的上游也值得一读。pared 是 9 月 22 日创建的前置项目,最先映射了资产服务的 ResetAssetSets 操作、模型集和设置键,支持 nix-darwin 和 Home Manager 策略化管理;RemoveMacAI 在 README 和源码注释里多处标注了键与资产集「由 pared 首先梳理」。两者都是 MIT 协议,一个偏声明式管理,一个偏一键操作,形成了清晰的分层。

这个案例留下的线索

RemoveMacAI 的全部做法都建立在苹果自己的机制上:限制键是苹果定义的,描述文件格式是苹果定义的,删模型的 XPC 服务也是苹果自己的。它没有对抗系统,只是把企业场景的能力借给了个人用户,而这条路径的生命周期完全取决于苹果:macOS 27.1 之后的任意一个版本,都可以让手动描述文件像 26.4 那批旧键一样失效,或者干脆在资产服务侧加一层校验。到时候用户手里剩下的选项,会回到「接受系统默认」和「换一台不对模型做强行集成的设备」之间。这个工具的价值不在于省下多少 GB,而在于它把「系统该不该替用户决定磁盘里放什么」这个问题,变成了一段可以运行、可以审计的开源代码。