Kakehashi: 在 Linux aarch64 上运行 macOS ARM64 二进制文件

Kakehashi 是一个实验性的用户空间转换层,旨在 Linux aarch64 宿主机上执行 macOS ARM64 二进制文件。通过映射 Darwin Mach-O 二进制文件并将 BSD 系统调用转换为 Linux,Kakehashi 能够在裸机 Linux、虚拟机或 Docker 容器中执行真实的 macOS CLI 客户端——例如 curl7-Zip

核心架构与实现

Kakehashi 作为一个转换层而非指令模拟器运行,这意味着客户机代码在 CPU 上原生运行。性能开销集中在系统调用边界,系统在此处执行 TLS 切换、备用栈管理以及 NEON 保存/恢复操作。

技术组件

该项目组织为几个 Rust crates:

  • kakehashi: 用于管理和运行二进制文件的主 CLI 工具 (kh)。
  • kh-loader: 处理 Mach-O 二进制文件的解析、映射和执行。
  • kh-runtime: 管理内存、陷阱和 BSD 系统调用转换。它嵌入了一个 freestanding libSystem.B.dylib 以向客户机提供必要的系统库。
  • kh-libsystem: 嵌入式 dylib 的源码(专门为 aarch64-apple-darwin 编译)。

"Bottle" 系统

Kakehashi 使用 "bottle" 布局来模拟 macOS 环境。默认根目录位于 ~/.local/share/kakehashi/bottle/。这种布局将宿主机文件系统桥接到客户机,允许客户机中的路径如 /Volumes/linux/ 直接映射到宿主机的根文件系统。

当前能力与已验证工具

Kakehashi 目前是一个以 CLI 为先的项目,不支持 GUI、代码签名或完整的 Apple Security.framework。然而,已验证了几个高知名度的 CLI 工具:

  • 7-Zip (7zz): 支持多线程压缩 (-mmt=4),并在 8k 文件树上通过了验证。
  • curl: 已成功测试超过 200 个命令和选项,包括使用种子 CA 束进行的 HTTPS GET 请求。
  • Xcode Tools Git: 基本的版本控制命令如 initaddcommit 是可用的,尽管作者指出尚未保证 100% 的稳定性。

性能与 CI/CD 使用场景

虽然 Kakehashi 的性能无法与原生 macOS 相媲美,但它被设计为 CI/CD 流水线中成本和可用性为主要驱动因素的可行替代方案。

性能基准测试

在 Ubuntu aarch64 裸机 (UTM) 上使用多文件 7zz 归档 (~240 MiB 树) 进行测试,性能差距测量如下:

实现方式 墙上时间 比例
原生 Linux 7zz ~22.5 s 1.0x
kh 下运行的 Darwin 7zz ~118 s ~5.2x

对于文件较少的压缩密集型任务,差距缩小到大约 1.1x–1.2x。多文件场景下 ~5.2x 的减速归因于路径遍历和每个系统调用边界的开销,而非压缩算法本身的效率。

CI 中的经济价值

该项目的目标是实现使用廉价的 Linux aarch64 运行器,而不是昂贵的 macOS 运行器。例如,GitHub Actions 托管的 Linux 2-core arm64 运行器成本约为每分钟 $0.005,而 macOS 3–4 core 运行器成本约为每分钟 $0.062。即使存在 5 倍的性能损失,通过 Kakehashi 在 Linux 上运行任务的可计费成本也可能显著低于使用原生 macOS 运行器。

安装与要求

系统要求

  • 宿主机 OS: Linux aarch64 (执行 kh runkh trace 所需)。
  • Rust 版本: 1.88+。
  • 页大小: 支持 4 KiB (容器) 和 16 KiB (Asahi-class)。

快速开始

用户可以通过 Cargo 安装该工具:

cargo install kakehashi
kh bottle ensure
kh install 7zip
kh install curl

社区见解与背景

用户之间的讨论突出了该项目相对于 Darling 等其他尝试的定位。作者明确表示 Kakehashi 不是衍生自 Darling,而是采用洁净室实现 (clean-room implementation)。

社区成员对未来潜在的扩展表示了兴趣,例如在 Linux 上运行 Audio Unit (AU) 二进制文件,以及在 Linux ARM 运行器上构建 iOS 应用的能力。一些用户对该项目在生成文档时使用 AI 的做法提出了疑问,而另一些人则注意到它与尝试使用 Zig 在 macOS 上运行 Linux 二进制文件的反向项目非常相似。

Sources