Kakehashi ejecuta binarios de macOS en Linux ARM sin emular un Mac

Un proyecto open source llamado Kakehashi está experimentando con una idea que puede resultar especialmente interesante para desarrolladores y administradores de sistemas: ejecutar directamente binarios ARM64 creados para macOS sobre servidores Linux ARM64. No utiliza una máquina virtual con macOS, tampoco un emulador de CPU ni traducción JIT (Just-in-Time). El código ARM64 del programa se ejecuta directamente en el procesador y Kakehashi interviene principalmente cuando la aplicación necesita comunicarse con el sistema operativo.

Las claves de Kakehashi en 30 segundos

  • Kakehashi es una capa de traducción en espacio de usuario entre macOS ARM64 y Linux aarch64, publicada bajo licencia Apache 2.0.
  • No emula instrucciones: el código ARM64 del programa se ejecuta directamente sobre la CPU ARM del servidor Linux.
  • Traduce elementos del entorno Darwin, como ejecutables Mach-O y llamadas BSD, hacia Linux.
  • Ya ejecuta herramientas reales como 7-Zip, curl, Apple Git y Apple clang, incluidas algunas operaciones de red y compilación.
  • Sigue siendo experimental: no promete aplicaciones gráficas, codesign, Security.framework completo ni compatibilidad general con macOS.

La distinción es importante porque permite entender dónde está realmente el problema. Un Mac moderno con Apple Silicon y un servidor Linux basado en ARM64 comparten una arquitectura de instrucciones compatible. La CPU no necesita traducir continuamente el código de una arquitectura a otra como sucede al ejecutar software x86 sobre ARM.

La barrera aparece un nivel más arriba.

macOS y Linux esperan formatos ejecutables, llamadas al sistema, bibliotecas y comportamientos diferentes. Compartir ARM64 no significa compartir automáticamente la ABI (Application Binary Interface).

Kakehashi intenta construir precisamente ese puente.

Mach-O sobre Linux: así funciona Kakehashi

Linux utiliza normalmente ejecutables ELF (Executable and Linkable Format), mientras que macOS emplea Mach-O.

Cuando se ejecuta:

kh run <programa>

Kakehashi prepara un entorno denominado bottle, que contiene el sistema de archivos que verá el programa invitado y una implementación independiente de libSystem.B.dylib.

Después carga el ejecutable Mach-O y sus bibliotecas, resuelve los símbolos necesarios y conecta las llamadas BSD con su propio runtime. Finalmente salta al punto de entrada LC_MAIN.

A partir de ahí ocurre la parte más interesante: las instrucciones ARM64 del programa se ejecutan de forma nativa.

El runtime vuelve a intervenir cuando aparecen operaciones que necesitan cruzar la frontera entre el programa Darwin y Linux, por ejemplo llamadas al sistema, creación y terminación de hilos o determinados fallos y operaciones auxiliares.

El proyecto lo resume en cuatro pasos: preparar el bottle, cargar Mach-O y sus bibliotecas, iniciar la ejecución ARM64 y traducir las operaciones que cruzan la frontera entre ambos sistemas.

Su arquitectura está dividida además en varios componentes. kh-loader se ocupa de analizar, mapear y ejecutar Mach-O; kh-runtime gestiona memoria, traps, llamadas BSD, threads y el bottle; kh-libsystem implementa la biblioteca necesaria para el entorno invitado; y kh-xcrun proporciona una implementación independiente de xcrun.

Según sus desarrolladores, Kakehashi no deriva de Darling, otro conocido proyecto que persigue la compatibilidad de aplicaciones macOS sobre Linux. Tampoco incluye blobs propietarios de Apple dentro del repositorio y sus responsables documentan un proceso de desarrollo clean-room.

El código está escrito principalmente en Rust, requiere Rust 1.88 o posterior y la ejecución real mediante kh run está limitada actualmente a Linux aarch64. El proyecto contempla páginas de memoria de 4 KiB, habituales en contenedores, y de 16 KiB, utilizadas en algunos sistemas ARM como los basados en Asahi Linux.

Ya ejecuta Apple Git y clang sobre Linux ARM

Kakehashi está lejos de proporcionar una implementación completa de macOS, pero ya ha superado la fase de limitarse a pequeños programas de demostración.

Uno de los ejemplos verificados es 7-Zip para Darwin. El proyecto puede ejecutar 7zz, crear archivos comprimidos y utilizar varios threads. Esta última prueba tiene importancia porque obliga a la capa de compatibilidad a gestionar correctamente operaciones más complejas que la simple ejecución de un binario.

También funciona la versión Darwin de curl, incluidas conexiones HTTP y HTTPS.

Más interesante todavía para desarrollo es el soporte de herramientas procedentes de las Apple Command Line Tools (CLT).

Kakehashi permite instalar:

kh install xcode-tools

y posteriormente ejecutar Apple Git:

kh run git -- --version

El proyecto afirma haber completado sus objetivos iniciales para repositorios locales, clonación y envío mediante HTTPS y SSH e incluso repositorios de mayor tamaño.

También puede ejecutar Apple clang. Las pruebas documentadas incluyen compilación, enlaces de proyectos con varios archivos, el enlazador moderno, LTO (Link Time Optimization) y la posterior ejecución del Mach-O generado utilizando el propio Kakehashi.

Es precisamente aquí donde el proyecto empieza a resultar más interesante que una simple curiosidad sobre compatibilidad entre sistemas operativos.

El posible objetivo: CI de macOS sobre servidores Linux ARM

Los responsables del proyecto son bastante claros respecto a sus prioridades: el objetivo de CI es conseguir corrección sobre Linux ARM64 económico, no igualar el rendimiento de macOS.

Eso apunta directamente hacia uno de sus posibles casos de uso futuros.

Actualmente los pipelines que necesitan herramientas específicas de Apple suelen depender de hardware Mac o de servicios que proporcionan runners macOS. Una capa suficientemente compatible podría permitir trasladar determinadas operaciones a servidores ARM64 Linux sin arrancar macOS.

Conviene introducir aquí una diferencia importante: Kakehashi no convierte actualmente un servidor Linux ARM en un sustituto completo de un runner macOS.

No ofrece todavía el stack completo de aplicaciones macOS, interfaz gráfica, codesign, una implementación real de Security.framework, Git LFS/SVN ni toda la superficie funcional de curl. Tampoco puede asumirse que cualquier herramienta incluida con Xcode vaya a funcionar.

Sin embargo, el hecho de que Apple Git y Apple clang ya puedan realizar operaciones reales muestra dónde podría estar uno de los primeros nichos útiles: workloads CLI de compilación, automatización y testing que necesiten ejecutar binarios Darwin pero no todo macOS.

Si la cobertura continúa aumentando, podría abrirse una alternativa interesante para determinados procesos de CI/CD sobre infraestructura ARM.

No significaría necesariamente eliminar los Mac de una cadena de desarrollo. Procesos como firma, notarización, pruebas de frameworks específicos y validación final seguirían requiriendo comprobar cuidadosamente qué componentes de Apple son necesarios.

Pero sí podría reducir la cantidad de operaciones que necesitan ejecutarse obligatoriamente sobre una máquina macOS.

El rendimiento muestra la ventaja de no emular la CPU

El diseño también tiene consecuencias sobre el rendimiento.

Kakehashi no promete rendimiento idéntico al de ejecutar el programa directamente sobre macOS. Cada vez que el programa necesita atravesar la frontera entre Darwin y Linux aparece un coste relacionado con aspectos como TLS, pila alternativa, NEON, despacho y traducción de operaciones.

Aun así, no existe el coste permanente de interpretar o recompilar instrucciones de otra arquitectura.

El proyecto publica una prueba con 7zz sobre ARM64 físico utilizando unos 14.500 archivos y aproximadamente 309 MiB de datos. En ese escenario, Kakehashi registra alrededor de 1,24 veces el tiempo de la versión nativa Linux de 7-Zip.

Es un resultado aportado por el propio proyecto y no debe interpretarse como un benchmark independiente ni generalizarse a otras aplicaciones. Una herramienta que realice muchas llamadas al sistema podría comportarse de forma muy diferente a otra que pase la mayor parte del tiempo realizando cálculos dentro del propio proceso.

Los desarrolladores reconocen además que Apple clang todavía sufre un coste apreciable al crear procesos secundarios -cc1 y ld.

Esta transparencia es relevante. Kakehashi no afirma haber conseguido «macOS sobre Linux», sino una capa experimental que empieza a ejecutar herramientas concretas.

La frontera entre plataformas no termina en x86 frente a ARM

Kakehashi pone sobre la mesa una cuestión interesante para quienes diseñan infraestructura.

Durante la última década buena parte de la conversación sobre portabilidad se ha centrado en x86-64 frente a ARM64. La llegada de Apple Silicon, AWS Graviton, Ampere y otras plataformas ARM reforzó todavía más esa división.

Pero cuando origen y destino utilizan ARM64, desaparece una parte del problema y queda expuesta la siguiente: la interfaz entre la aplicación y el sistema operativo.

El ejecutable puede contener instrucciones perfectamente comprensibles para la CPU y, aun así, resultar imposible de ejecutar porque espera Mach-O, las convenciones de Darwin, determinadas bibliotecas o unas llamadas al sistema que Linux no proporciona.

Kakehashi trabaja justamente sobre esa frontera.

No es el primero en perseguir una capa de compatibilidad de macOS. Darling lleva años trabajando en un objetivo relacionado y Wine demuestra desde hace décadas hasta dónde puede llegar una capa de compatibilidad cuando dispone de suficiente desarrollo y comunidad.

Pero Kakehashi introduce una combinación especialmente interesante: ARM64 en ambos extremos, ejecución nativa de instrucciones y orientación inicial hacia herramientas de línea de comandos.

Eso reduce parte de la complejidad, aunque deja por delante una enorme cantidad de trabajo si alguna vez pretende ampliar su compatibilidad al conjunto del software de macOS.

Por ahora Kakehashi debe considerarse exactamente como lo presentan sus desarrolladores: un proyecto experimental. Pero que ya pueda descargar las Command Line Tools de Apple, ejecutar su versión de Git, clonar mediante SSH o HTTPS y utilizar Apple clang desde Linux ARM64 convierte el experimento en algo bastante más tangible que una simple prueba conceptual.

Preguntas frecuentes

¿Qué es Kakehashi?

Kakehashi es una capa open source de traducción en espacio de usuario que permite ejecutar determinados binarios macOS ARM64 sobre Linux aarch64. Está desarrollada principalmente en Rust y publicada bajo licencia Apache 2.0.

¿Kakehashi emula un procesador Apple Silicon?

No. El proyecto no utiliza JIT ni un emulador de instrucciones. El código ARM64 invitado se ejecuta directamente sobre la CPU ARM64 y Kakehashi interviene principalmente en las fronteras entre el programa Darwin y Linux.

¿Qué aplicaciones de macOS funcionan actualmente con Kakehashi?

El proyecto documenta funcionamiento con 7-Zip, curl, Apple Git y Apple clang, entre otras pruebas. No afirma todavía compatibilidad con aplicaciones gráficas, codesign, Security.framework completo ni el conjunto general de aplicaciones macOS.

¿Puede sustituir a un Mac para compilar software de Apple?

Todavía no de forma general. Kakehashi puede ejecutar ya determinadas herramientas de las Apple Command Line Tools, pero sigue siendo experimental y no proporciona todo el entorno necesario para sustituir macOS en cualquier pipeline de desarrollo o CI/CD.

Suscríbete al boletín SysAdmin

Este es tu recurso para las últimas noticias y consejos sobre administración de sistemas, Linux, Windows, cloud computing, seguridad de la nube, etc. Lo enviamos 2 días a la semana.

¡Apúntate a nuestro newsletter!


– patrocinadores –

Noticias destacadas

– patrocinadores –

¡SUSCRÍBETE AL BOLETÍN
DE LOS SYSADMINS!

Scroll al inicio
×