Kakehashi: запуск macOS-бинарников на Linux ARM
Экспериментальный слой трансляции Kakehashi позволяет запускать macOS ARM64-бинарники на Linux aarch64 без JIT и эмуляции инструкций.
Запустить 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! — пользователям не нужно скачивать ничего дополнительно.
Быстрый старт
Проект проверен на 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 |
Сравнение с 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 — за счёт разницы в тарифах раннеров.