Kakehashi: 在 Linux aarch64 上執行 macOS ARM64 二進位檔
Kakehashi 是一個實驗性的使用者空間轉換層,旨在於 Linux aarch64 主機上執行 macOS ARM64 二進位檔。透過將 Darwin Mach-O 二進位檔進行映射並將 BSD 系統呼叫轉換為 Linux,Kakehashi 能夠在實體 Linux、虛擬機器或 Docker 容器中執行真正的 macOS CLI 客戶端——例如 curl 和 7-Zip。
核心架構與實作
Kakehashi 作為轉換層而非指令模擬器運作,這意味著客戶端程式碼會在 CPU 上原生執行。效能開銷集中在系統呼叫邊界,系統在此處進行 TLS 切換、替代堆疊管理以及 NEON 儲存/還原操作。
技術組件
該專案由多個 Rust crates 組成:
kakehashi: 用於管理與執行二進位檔的主要 CLI 工具 (kh)。kh-loader: 處理 Mach-O 二進位檔的解析、映射與執行。kh-runtime: 管理記憶體、陷阱 (traps) 與 BSD 系統呼叫轉換。它嵌入了一個 freestandinglibSystem.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: 基本的版本控制指令如
init、add與commit皆可運作,儘管作者指出尚未保證 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 run與kh 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 二進位檔的反向專案有相似之處。