Kakehashi: Linux aarch64에서 macOS ARM64 바이너리 실행하기
Kakehashi는 Linux aarch64 호스트에서 macOS ARM64 바이너리를 실행하도록 설계된 실험적인 유저스페이스 번역 레이어입니다. Darwin Mach-O 바이너리를 매핑하고 BSD syscall을 Linux로 번역함으로써, Kakehashi는 curl 및 7-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 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에서 파생된 것이 아니며 클린룸 구현(clean-room implementation)임을 명시적으로 밝히고 있습니다.
커뮤니티 멤버들은 Linux에서 Audio Unit (AU) 바이너리를 실행하거나 Linux ARM 러너에서 iOS 앱을 빌드할 수 있는 기능과 같은 잠재적인 미래 확장성에 관심을 보이고 있습니다. 일부 사용자는 문서 생성에 AI를 사용한 점에 대해 의문을 제기했으며, 다른 사용자들은 Zig를 사용하여 macOS에서 Linux 바이너리를 실행하려는 역방향 프로젝트와의 유사성을 언급했습니다.