Apple Silicon에서 가상머신 2개 제한을 우회하는 방법 (2023)

16 hours ago 1
  • Apple Silicon 기반 macOS는 Virtualization.framework로 실행 가능한 macOS VM을 최대 2개로 제한하며, 이는 macOS 사용권 계약 조항에 근거함
  • 분석 결과 이 제한은 XNU 커널 내부의 비공개 변수 hv_apple_isa_vm_quota 로 관리되며, 부트 인자를 통해 재정의 가능함이 확인됨
  • System Integrity Protection의 AppleInternal 체크를 우회하기 위해 개발용 커널(Development Kernel) 을 빌드·부팅하는 절차가 사용됨
  • 설정 후 UTM, Viable, Parallels 등에서 최대 9개의 macOS VM을 동시에 실행하는 데 성공함
  • Apple이 커널 내부에 VM 제한 재정의 기능을 남겨둔 점이 주목되며, 향후 자동화 도구나 커널 확장을 통한 개선 가능성이 제시됨

Apple Silicon의 macOS 가상머신 2개 제한 해제 과정

  • Apple Silicon 기반 Mac에서 Virtualization.framework를 이용해 macOS 가상머신을 실행할 때 최대 2개까지만 구동 가능한 제한이 존재함
    • 이 제한은 macOS 소프트웨어 사용권 계약(SLA) 2.B.iii 조항에 따라 설정되어 있음
    • 해당 조항은 개발, 테스트, macOS Server 사용, 비상업적 개인 용도에 한해 최대 2개의 macOS 인스턴스 실행을 허용함
  • 분석 결과, 이 제한은 사용자 공간이 아닌 커널(XNU)의 비공개 영역에 구현되어 있음
    • Intel 커널에는 동일한 코드가 없으며, Apple Silicon 커널의 hv_vm_* 함수군이 가상화 스택을 담당함
    • hv_init() 초기화 코드 내의 hv_apple_isa_vm_quota 변수가 VM 수를 관리하며, VM 생성·삭제 시 증감 처리됨
    • 커널에는 hypervisor=hv_apple_isa_vm_quota= 부트 인자가 존재하며, 후자는 VM 제한을 재정의할 수 있음
  • 릴리스 커널에서는 hypervisor 인자 대신 System Integrity Protection(SIP)AppleInternal 체크로 제한되어 있음
    • CSR_ALLOW_APPLE_INTERNAL 플래그가 활성화된 경우에만 hv_apple_isa_vm_quota 인자가 적용됨
    • 이를 우회하기 위해 Apple의 개발용 커널(Development Kernel) 을 부팅하는 방법이 사용됨

개발용 커널 컬렉션 빌드

  • Apple Developer 사이트에서 Kernel Debug Kit(KDK) 를 다운로드해 설치해야 함
    • KDK는 호스트 macOS 빌드와 정확히 일치해야 하며, 불일치 시 커널·kext 링크 및 부팅 오류 발생 가능
  • uname 명령으로 커널 아키텍처를 확인한 뒤, kmutil create 명령을 이용해 개발용 커널 컬렉션(VirtualMachine.kc) 을 생성함
    • 예시에서는 macOS 14.0 (빌드 23A5301h) 및 T6020 커널을 사용
    • --variant-suffix development 옵션으로 개발용 커널을 지정하고, 여러 시스템 확장 저장소를 포함시킴

개발용 커널 부팅 설정

  • Mac을 종료 후 복구 모드(recoveryOS) 로 부팅하여 터미널에서 다음 설정을 수행함
    1. System Integrity Protection 비활성화 (csrutil disable)
    2. 부트 인자 제한 해제 (bputil --disable-boot-args-restriction)
    3. 커스텀 커널 컬렉션 지정 (kmutil configure-boot)
    4. 부트 인자 설정 (nvram 명령으로 전달)
      • kcsuffix=development : 개발용 커널 부팅
      • hypervisor=0x1 : 가상화 스택의 특수 기능 활성화
      • hv_apple_isa_vm_quota=0xFF : VM 최대 개수를 255로 설정
  • 재부팅 후 sysctl kern.osbuildconfig 및 nvram boot-args로 적용 여부를 확인 가능

다중 VM 실행 결과

  • 설정 완료 후 UTM, Viable, Parallels 등 Virtualization.framework 기반 솔루션으로 테스트 수행
    • M2 Pro MacBook Pro에서 동시에 9개의 macOS VM을 실행하는 데 성공
    • 시스템은 여전히 테스트 가능한 수준으로 동작함

기능 추가 시점 및 내부 구조

  • macOS 12 Monterey부터 hv_apple_isa_vm_quota 부트 인자가 Virtualization 스택과 함께 추가됨
    • 이후 버전(macOS Sonoma 포함)에서도 AppleInternal 체크는 여전히 존재
    • Apple이 XNU 내부에 여러 비공개 기능을 유지하고 있음이 확인됨

OS 업데이트 시 주의사항

  • 커스텀 커널 컬렉션 사용 시 자동 OS 업데이트 기능이 비활성화
    • 업데이트 후 오류가 발생하므로, 기본 커널 컬렉션으로 복원해야 함
    • 복구 모드에서 bputil로 새 부트 정책을 생성하면 기본 커널로 복귀 가능
    • 예: bputil --full-security 또는 --disable-boot-args-restriction 옵션 사용

마무리 및 향후 개선 아이디어

  • Apple의 VM 제한 구현 방식을 확인하고, 비공식적이지만 제한 해제 방법을 실험적으로 검증함
    • Virtualization 팀이 공식 문서화하지 않았음에도 VM 제한 재정의 기능을 커널에 남겨둔 점이 주목됨
  • 향후 개선 구상
    • KC 빌드 및 부팅 자동화 도구 개발
      • 호스트별 개발용 커널 컬렉션 자동 생성 및 복구 모드 설정 지원
    • 커널 확장(kext) 을 통한 hv_apple_isa_vm_quota 변수 재정의 기능 구현
      • 개발용 커널 부팅 없이 제한 해제 가능성 탐색
  • 다음 연구 주제로 Apple Silicon VM의 DEP 등록 및 시리얼 번호 오버라이드 가능성을 탐색 예정임
Read Entire Article