Запустить macOS-утилиты на Linux ARM без эмулятора? Теперь можно

Проект Kakehashi (яп. «мост») предлагает неожиданное решение: слой трансляции userspace, который позволяет запускать нативные macOS ARM64-бинарники прямо на Linux aarch64 — без JIT-компиляции и без полной эмуляции процессора. Это userspace-слой трансляции macOS ARM64 → Linux aarch64, работающий в режиме CLI-first, без JIT. Уже сейчас в нём успешно работают такие инструменты, как 7-Zip (7zz) и curl из мира Darwin.


Как это устроено

Kakehashi загружает Darwin Mach-O на Linux aarch64, монтирует автономную libSystem, транслирует BSD-сисколлы и запускает реальные гостевые процессы — включая clang-пробники, 7-Zip 7zz, curl и многопоточные задачи.

Архитектура проекта строится на нескольких Rust-крейтах:

КрейтРоль
kakehashiБинарник kh (точка входа)
kh-loaderПарсинг и маппинг Mach-O
kh-runtimeПамять, трапы, BSD-сисколлы, bottle; встраивает libSystem.B.dylib
kh-libsystemИсходник той же dylib (только для aarch64-apple-darwin)

Гостевой dylib вендорится внутри крейта kh-runtime через include_bytes! — пользователям не нужно скачивать ничего дополнительно.

ℹ Что такое Mach-O?
Mach-O (Mach Object) — формат исполняемых файлов, используемый в macOS и iOS, аналог ELF в Linux. Kakehashi умеет парсить и запускать такие файлы прямо на Linux-ядре.

Быстрый старт

Проект проверен на Docker/Colima и UTM (Linux aarch64). Установка занимает три команды:

cargo install kakehashi
kh bottle ensure
kh install 7zip   # Darwin 7zz → /usr/local/bin/7zz
kh install curl   # Darwin curl → /usr/local/bin/curl

После установки можно сразу запускать гостевые утилиты:

# Создать архив
kh run 7zz -- a demo.7z README.md

# Многопоточное сжатие (4 потока)
kh run 7zz -- a -t7z -m0=lzma2 -mx=5 -mmt=4 mt.7z README.md

# HTTP-запрос через Darwin curl
kh run curl -- -sS http://example.com/
💡 Требования
  • Rust 1.88+
  • Linux aarch64 для живого выполнения (kh run / kh trace)
  • Поддерживаются страницы 4 KiB (контейнеры) и 16 KiB (Asahi-класс)

Как работает трансляция


graph LR
    A[macOS ARM64 бинарник] --> B[kh-loader: парсинг Mach-O]
    B --> C[kh-runtime: маппинг памяти]
    C --> D[Трансляция BSD → Linux сисколлов]
    D --> E[Нативное выполнение на CPU]
    E --> F[Результат на Linux aarch64]

Важная деталь: гостевой код выполняется нативно на процессоре — никакой пошаговой эмуляции инструкций нет. Накладные расходы возникают только на границе сисколла (переключение TLS, альтернативный стек, сохранение NEON-регистров, диспетчеризация в Rust).


Производительность: честные цифры

Авторы не скрывают реального положения дел. На Ubuntu aarch64 bare-metal (UTM), при многофайловом сжатии (~8k файлов / ~240 МиБ дерева, параметры -t7z -m0=lzma2 -mx=5 -mmt=4):

РежимВремя
Нативный Linux 7zz~22,5 с
Darwin 7zz под kh~118 с
Соотношение~×5,2

Однако на задачах с тяжёлым сжатием и малым числом файлов разрыв куда меньше — ×1,1–1,2. Замедление на многофайловых операциях обусловлено накладными расходами на обход путей и границу сисколла, а не качеством алгоритма LZMA.

«Цель для CI — не “быть такими же быстрыми, как нативный macOS”, а запускать Darwin CLI-инструменты на дешёвых Linux aarch64-раннерах вместо дефицитных и дорогих мощностей macOS».


Экономический смысл: считаем деньги в CI

Здесь и кроется главная мотивация проекта. По актуальным тарифам GitHub Actions 2026: Linux ARM стоит $0,005/мин, Linux x64 — $0,006/мин, а macOS — $0,062/мин.

Даже если задача выполняется в ×5 медленнее под kh на Linux arm64, чем на macOS-раннере, итоговые расходы могут оказаться ниже — потому что минута macOS на порядок дороже (ориентировочно: 5 × $0,005 ≈ $0,025 против 1 × $0,062).

Тип раннераЦена/минОтносительно Linux ARM
Linux 2-core arm64$0,005×1 (база)
Linux 2-core x64$0,006×1,2
macOS 3–4 core (M1/Intel)$0,062×12,4
macOS 12-core$0,077×15,4
macOS 5-core M2 Pro$0,102×20,4
⚠ Ограничения
Kakehashi не поддерживает (пока): GUI-приложения, codesign/нотаризацию, Apple Security.framework, git из CLT, HTTP/3 end-to-end, Xcode UI-тесты. Для этих задач macOS-раннеры по-прежнему незаменимы.

Сравнение с Darling

Существует и другой проект — Darling: свободный слой совместимости macOS для Linux, который дублирует функции macOS, предоставляя альтернативные реализации библиотек и фреймворков. Kakehashi отличается принципиально: он не переписывает фреймворки Apple, а использует автономную libSystem и фокусируется исключительно на CLI-бинарниках под ARM64 — без kernel module и без полного окружения macOS.

📝 Следующий шаг
Авторы анонсировали поддержку git через kh install xcode-tools. Детали — в docs/git.md репозитория.

Итог

Kakehashi — это прагматичный инструмент для CI-инженеров, которым нужно запускать Darwin-утилиты в бюджетных Linux aarch64-окружениях. Проект находится на ранней стадии («not a product claim yet»), но уже демонстрирует рабочие сценарии с 7zz и curl. При пятикратном замедлении против нативного macOS он всё равно может оказаться в несколько раз дешевле на дистанции реального CI — за счёт разницы в тарифах раннеров.