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 save/restore 작업을 수행하는 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-file 트리에 대해 검증되었습니다.
  • curl: 시드된 CA 번들을 사용하는 HTTPS GET 요청을 포함하여 200개 이상의 명령 및 옵션이 성공적으로 테스트되었습니다.
  • Xcode Tools Git: init, add, commit과 같은 기본적인 버전 관리 명령이 작동하지만, 저자는 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 성능 저하는 경로 탐색(path walking) 및 syscall 경계의 오버헤드 때문이며, 압축 알고리즘 자체의 효율성 때문은 아닙니다.

CI에서의 경제적 가치

이 프로젝트의 목표는 비싼 macOS 러너 대신 저렴한 Linux aarch64 러너를 사용하는 것을 가능하게 하는 것입니다. 예를 들어, GitHub Actions 호스트 러너의 경우 Linux 2-core arm64 비용은 분당 약 $0.005인 반면, macOS 3–4 core 러너 비용은 분당 약 $0.062입니다. 5배의 성능 저하가 있더라도, Kakehashi를 통해 Linux에서 작업을 실행하는 비용은 네이티브 macOS 러너를 사용하는 것보다 훨씬 낮을 수 있습니다.

설치 및 요구 사항

시스템 요구 사항

  • Host OS: Linux aarch64 (kh runkh 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에서 파생된 것이 아니며 클린룸 구현(clean-room implementation)임을 명시적으로 밝히고 있습니다.

커뮤니티 멤버들은 Linux에서 Audio Unit (AU) 바이너리를 실행하거나 Linux ARM 러너에서 iOS 앱을 빌드할 수 있는 기능과 같은 잠재적인 미래 확장성에 관심을 보이고 있습니다. 일부 사용자는 문서 생성에 AI를 사용한 점에 대해 의문을 제기했으며, 다른 사용자들은 Zig를 사용하여 macOS에서 Linux 바이너리를 실행하려는 역방향 프로젝트와의 유사성을 언급했습니다.

Sources