Kakehashi: Linux aarch64 上で macOS ARM64 バイナリを実行する

Kakehashi は、Linux aarch64 ホスト上で macOS ARM64 バイナリを実行するために設計された実験的なユーザースペース翻訳レイヤーです。Darwin Mach-O バイナリをマッピングし、BSD syscall を Linux に翻訳することで、Kakehashi は curl7-Zip といった実際の macOS CLI ゲストを、ベアメタル Linux、VM、または Docker コンテナ内で実行することを可能にします。

コアアーキテクチャと実装

Kakehashi は命令エミュレータではなく翻訳レイヤーとして動作するため、ゲストコードは CPU 上でネイティブに動作します。パフォーマンスのオーバーヘッドは、TLS スイッチ、代替スタック管理、および NEON の保存/復元操作が行われる syscall 境界に集中しています。

技術的コンポーネント

このプロジェクトは、いくつかの Rust crate に整理されています:

  • kakehashi: バイナリの管理と実行に使用される主要な CLI ツール (kh)。
  • kh-loader: Mach-O バイナリのパース、マッピング、および実行を処理します。
  • kh-runtime: メモリ、トラップ、および BSD syscall の翻訳を管理します。ゲストに不可欠なシステムライブラリを提供するために、フリースタンディングな libSystem.B.dylib を組み込んでいます。
  • kh-libsystem: 組み込み dylib のソース (aarch64-apple-darwin 用に特別にコンパイルされたもの)。

「Bottle」システム

Kakehashi は、macOS 環境をシミュレートするために「bottle」レイアウトを使用します。デフォルトのルートは ~/.local/share/kakehashi/bottle/ にあります。このレイアウトはホストのファイルシステムをゲストに橋渡しし、ゲスト内の /Volumes/linux/ のようなパスをホストのルートファイルシステムに直接マッピングすることを可能にします。

現在の機能と検証済みツール

Kakehashi は現在 CLI ファーストのプロジェクトであり、GUI、コード署名、または Apple の完全な Security.framework はサポートしていません。しかし、いくつかの著名な CLI ツールが検証済みです:

  • 7-Zip (7zz): マルチスレッド圧縮 (-mmt=4) をサポートし、8k ファイルツリーでの検証が完了しています。
  • curl: シードされた CA バンドルを使用した HTTPS GET リクエストを含む、200 以上のコマンドとオプションが正常にテストされています。
  • Xcode Tools Git: initaddcommit といった基本的なバージョン管理コマンドが機能します。ただし、著者は 100% の安定性はまだ保証されていないと述べています。

パフォーマンスと CI/CD のユースケース

Kakehashi はネイティブな macOS のパフォーマンスには及びませんが、コストと可用性が主な推進力となる CI/CD パイプラインにおいて、実行可能な代替案となるように設計されています。

パフォーマンス・ベンチマーク

Ubuntu aarch64 ベアメタル (UTM) 上でのマルチファイル 7zz アーカイブ (~240 MiB ツリー) を使用したテストでは、パフォーマンスの差は以下のように測定されました:

実装 実行時間 (Wall Time) 比率
Native Linux 7zz ~22.5 s 1.0x
Darwin 7zz under kh ~118 s ~5.2x

ファイル数が少ない圧縮重視のタスクでは、差は 1.1x–1.2x 程度に縮まります。マルチファイル・シナリオにおける ~5.2x の低速化は、パスの走査と syscall 境界のオーバーヘッドに起因するものであり、圧縮アルゴリズム自体の効率によるものではありません。

CI における経済的価値

このプロジェクトの目標は、高価な macOS ランナーを、安価な Linux aarch64 ランナーに置き換えることを可能にすることです。例えば、 GitHub Actions の Linux 2-core arm64 ホストランナーのコストは 1 分あたり約 $0.005 ですが、macOS 3–4 core ランナーのコストは約 1 分あたり $0.062 です。5 倍のパフォーマンス・ペナルティがあっても、Kakehashi を介して Linux 上でジョブを実行する課金対象コストは、ネイティブ macOS ランナーを使用するよりも大幅に低くなります。

インストールと要件

システム要件

  • Host OS: Linux aarch64 (kh run および kh trace に必要)。
  • Rust Version: 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 から派生したものではなく、クリーンルーム実装であることを明示的に述べています。

コミュニティメンバーは、Linux 上で Audio Unit (AU) バイナリを実行することや、Linux ARM ランナー上で iOS アプリをビルドすることなど、将来的な拡張への関心を示しています。一部のユーザーは、ドキュメント生成における AI の使用について疑問を呈していますが、他のユーザーは、Zig を使用して macOS 上で Linux バイナリを実行しようとする逆のプロジェクトとの類似性に言及しています。

Sources