Kakehashi, Linux ARM에서 macOS CLI를 실행하는 방법

macOS ARM64용 명령줄 프로그램을 확인하려면 보통 맥이나 macOS 러너가 필요해요. Kakehashi는 Darwin용 Mach-O 바이너리를 Linux aarch64에서 실행해 이 비용과 대기 시간을 줄이려는 오픈소스 도구예요. 아직 macOS 전체를 대신하지는 못하지만, 배포 파일의 기본 동작과 종료 코드를 확인하는 용도라면 꽤 구체적인 선택지를 보여줘요. 1
핵심 요약
| 구분 | 핵심 | 왜 볼 만한가요 |
| 실행 방식 | Darwin Mach-O를 불러오고 자체 `libSystem`과 BSD 시스템 호출 변환을 거쳐 Linux ARM CPU에서 실행해요 | JIT나 명령어 에뮬레이터 없이 ARM64 명령을 직접 실행해요 |
| 확인된 범위 | Darwin용 `7zz`, `curl`, 멀티스레드 압축, HTTP·HTTPS 요청이 동작해요 | 맥 전용 CLI의 스모크 검사와 배포 파일 확인에 쓸 수 있어요 |
| 성능 | 약 8,000개 파일 압축에서는 Linux 네이티브보다 5.2배 느렸어요 | 파일 수가 적고 연산 비중이 높으면 격차가 약 1.1~1.2배로 줄었다고 해요 |
| 한계 | GUI, 코드 서명, 공증, Xcode UI 검사는 지원 범위 밖이에요 | 최종 macOS 검사를 없애기보다 일부 CLI 작업을 Linux로 나누는 도구에 가까워요 |
1. macOS CLI 검사를 Linux ARM으로 옮겨요
Kakehashi는 Linux aarch64 사용자 공간에서 Darwin ARM64 바이너리를 실행해요. `kh-loader`가 Mach-O 파일을 읽고 메모리에 올려요. `kh-runtime`은 메모리와 트랩, BSD 시스템 호출 변환을 맡아요. 프로젝트가 포함한 독립형 `libSystem.B.dylib`은 게스트 프로그램에 필요한 실행 환경을 제공해요. ARM64 명령 자체는 같은 계열의 호스트 CPU에서 직접 돌아가며, JIT나 별도 명령어 에뮬레이터를 거치지 않아요. 2
현재 공개 저장소에서 확인된 실제 프로그램은 Darwin용 7-Zip `7zz`와 `curl`이에요. Docker·Colima와 UTM의 Linux aarch64 환경에서 압축 파일 생성·검사·해제, 멀티스레드 압축, HTTP·HTTPS 요청을 확인했다고 밝혀요. Clang으로 만든 작은 바이너리와 스레드 동작도 확인 범위에 들어가요. 설치에는 Rust 1.88 이상이 필요하고, 실제 실행은 Linux aarch64에서 지원해요. 2
성능은 프로그램이 시스템 호출을 얼마나 자주 쓰는지에 따라 차이가 커요. 프로젝트가 약 8,000개 파일과 240MiB 데이터를 7-Zip으로 압축한 측정에서는 Linux 네이티브가 약 22.5초, Kakehashi 위의 Darwin `7zz`가 약 118초 걸렸어요. 약 5.2배 차이예요. 반면 파일 수가 적고 압축 연산 비중이 높은 작업에서는 약 1.1~1.2배까지 줄었다고 해요. 경로 순회와 파일 입출력이 많을수록 Darwin과 Linux 사이의 시스템 호출 경계를 자주 오가면서 시간이 늘어나는 구조예요. 이 수치는 프로젝트가 공개한 측정값이며, 러너 사양과 작업 구성에 따라 달라질 수 있어요. 2
CI 비용 계산에서는 실행 시간과 분당 요금을 함께 봐야 해요. 저장소가 인용한 GitHub Actions 초과 사용 요금은 Linux 2코어 ARM64가 분당 0.005달러, macOS 표준 러너가 분당 0.062달러예요. Linux에서 5배 오래 걸린다고 가정하면 0.025달러로 계산돼요. 같은 작업을 macOS에서 1분 실행한 0.062달러보다 낮아요. 다만 실제 절감액은 캐시, 준비 시간, 병렬 실행, 실패 재시도까지 포함해 각 파이프라인에서 다시 재야 해요. 3
지원 범위는 아직 좁아요. `curl`의 모든 기능과 Apple Security.framework, `git`, Command Line Tools는 완전 지원 대상으로 안내되지 않았어요. GUI 앱, 코드 서명과 공증, Xcode UI 검사는 계속 macOS가 필요해요. Kakehashi는 macOS 호환 환경 전체보다 순수 CLI 바이너리의 실행 여부, 도움말 출력, 종료 코드, 간단한 파일·네트워크 동작을 확인하는 데 맞아요. 2
왜 중요한가요
여러 운영체제용 CLI를 배포하는 팀은 모든 단계에 macOS 러너를 붙이지 않아도 돼요. Linux ARM에서 빠른 기본 검사를 먼저 돌리고, 서명·공증·Apple 프레임워크가 필요한 마지막 단계만 macOS에 남길 수 있어요. 이 구성이 맞는지는 프로그램의 시스템 호출 빈도와 실제 러너 비용을 함께 측정해야 알 수 있어요. 파일을 많이 다루는 작업은 느려질 수 있고, CPU 연산 중심의 도구는 상대적으로 유리해요. 2
도입 전에는 지원 여부를 프로그램 단위로 확인하는 편이 안전해요. `7zz`와 `curl`에서 성공한 결과가 다른 Darwin CLI의 동작까지 보장하지는 않아요. Linux 단계에서는 실행, 종료 코드, 핵심 명령 몇 개만 확인하고, macOS 단계에서 서명과 배포 조건을 확인하면 역할을 분명하게 나눌 수 있어요. Kakehashi가 지원하는 시스템 호출과 라이브러리 범위가 넓어질수록 Linux로 옮길 수 있는 검사도 늘어나지만, 현재 공개 범위만 기준으로 파이프라인을 설계해야 해요. 1
참고 자료
- Kakehashi - Linux ARM에서 macOS CLI 바이너리를 실행하는 변환 계층 — GeekNews
- wie-project/kakehashi — GitHub
- GitHub Actions runner pricing — GitHub Docs
'IT & AI' 카테고리의 다른 글
| AI 모델 고를 때, 지능만큼 응답 속도를 봐야 하는 이유 (0) | 2026.08.04 |
|---|---|
| AI가 선택지를 늘릴수록 사람의 판단이 더 중요해지는 이유 (0) | 2026.08.04 |
| GitHub 대체재가 저장소 호스팅만으로 부족한 이유 (0) | 2026.08.04 |
| 엘리베이터가 늦는 이유, 버튼 뒤에서 돌아가는 배차 알고리듬 (0) | 2026.08.04 |
| 구글 검색에서 소셜 콘텐츠 유입도 확인할 수 있어요 (0) | 2026.08.04 |