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: 管理記憶體、陷阱 (traps) 與 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 檔案樹) 的測試中,效能差距測量如下:

實作方式 實際執行時間 (Wall Time) 比例
原生 Linux 7zz ~22.5 s 1.0x
kh 下運行的 Darwin 7zz ~118 s ~5.2x

對於檔案數量較少的壓縮密集型任務,差距會縮小至約 1.1x–1.2x。多檔案情境下約 5.2x 的減速歸因於路徑遍歷與每個系統呼叫邊界的開銷,而非壓縮演算法本身的效率。

CI 中的經濟價值

該專案的目標是讓使用者能夠使用廉價的 Linux aarch64 runner 而非昂貴的 macOS runner。例如,GitHub Actions 託管的 Linux 2-core arm64 runner 每分鐘成本約為 $0.005,而 macOS 3–4 core runner 每分鐘成本約為 $0.062。即使有 5 倍的效能損失,透過 Kakehashi 在 Linux 上執行任務的可收費成本仍可能顯著低於使用原生 macOS runner。

安裝與需求

系統需求

  • 主機 OS: Linux aarch64 (執行 kh runkh trace 所需)。
  • Rust 版本: 1.88+。
  • 分頁大小 (Page Sizes): 支援 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 runner 上建置 iOS App 的能力。部分使用者對該專案在生成文件時使用 AI 的做法提出疑問,而其他人則注意到它與嘗試使用 Zig 在 macOS 上執行 Linux 二進位檔的反向專案有相似之處。

Sources