• Apple Silicon-आधारित macOS में Virtualization.framework के जरिए चलने वाले macOS VM की अधिकतम संख्या 2 तक सीमित है, और यह macOS लाइसेंस एग्रीमेंट की शर्तों पर आधारित है
  • विश्लेषण से पता चला कि यह सीमा XNU kernel के अंदर मौजूद private variable hv_apple_isa_vm_quota से नियंत्रित होती है, और boot arguments के जरिए इसे override किया जा सकता है
  • System Integrity Protection के AppleInternal check को बायपास करने के लिए Development Kernel को build और boot करने की प्रक्रिया इस्तेमाल की गई
  • सेटअप के बाद UTM, Viable, Parallels आदि में एक साथ अधिकतम 9 macOS VM चलाने में सफलता मिली
  • यह खास तौर पर ध्यान देने योग्य है कि Apple ने kernel के अंदर VM limit override करने की क्षमता छोड़ी हुई है, और आगे automation tools या kernel extension के जरिए इसे और बेहतर बनाने की संभावना बताई गई है

Apple Silicon में macOS virtual machine की 2-VM सीमा हटाने की प्रक्रिया

  • Apple Silicon-आधारित Mac पर Virtualization.framework का उपयोग करके macOS virtual machine चलाते समय अधिकतम 2 instance तक ही चलाने की सीमा मौजूद है
    • यह सीमा macOS Software License Agreement (SLA) की धारा 2.B.iii के अनुसार तय की गई है
    • यह धारा development, testing, macOS Server उपयोग, और non-commercial personal use के लिए अधिकतम 2 macOS instance चलाने की अनुमति देती है
  • विश्लेषण से पता चला कि यह सीमा user space में नहीं बल्कि kernel (XNU) के private हिस्से में लागू की गई है
    • Intel kernel में यही code मौजूद नहीं है, जबकि Apple Silicon kernel की hv_vm_* function series virtualization stack को संभालती है
    • hv_init() initialization code के भीतर मौजूद hv_apple_isa_vm_quota variable VM की संख्या को manage करता है, और VM create/delete होने पर इसका मान बढ़ता-घटता है
    • kernel में hypervisor= और hv_apple_isa_vm_quota= boot arguments मौजूद हैं, जिनमें दूसरा वाला VM limit को override कर सकता है
  • release kernel में hypervisor argument की जगह System Integrity Protection (SIP) के AppleInternal check से यह नियंत्रित है
    • CSR_ALLOW_APPLE_INTERNAL flag enabled होने पर ही hv_apple_isa_vm_quota argument लागू होता है
    • इसे बायपास करने के लिए Apple के Development Kernel को boot करने का तरीका इस्तेमाल किया गया

Development Kernel Collection build करना

  • Apple Developer साइट से Kernel Debug Kit (KDK) डाउनलोड करके install करना होगा
    • KDK का host macOS build से बिल्कुल match होना जरूरी है, वरना kernel·kext linking और boot errors हो सकते हैं
  • uname command से kernel architecture जांचने के बाद kmutil create command की मदद से Development Kernel Collection (VirtualMachine.kc) बनाई जाती है
    • उदाहरण में macOS 14.0 (build 23A5301h) और T6020 kernel का उपयोग किया गया
    • --variant-suffix development option के जरिए development kernel चुना जाता है, और कई system extension repositories शामिल की जाती हैं

Development Kernel boot configuration

  • Mac को shut down करने के बाद recoveryOS में boot करके terminal में ये settings की जाती हैं
    1. System Integrity Protection disable करना (csrutil disable)
    2. boot argument restrictions हटाना (bputil --disable-boot-args-restriction)
    3. custom kernel collection चुनना (kmutil configure-boot)
    4. boot arguments सेट करना (nvram command के जरिए)
      • kcsuffix=development : development kernel boot
      • hypervisor=0x1 : virtualization stack की special features enable
      • hv_apple_isa_vm_quota=0xFF : VM की अधिकतम संख्या 255 सेट
  • reboot के बाद sysctl kern.osbuildconfig और nvram boot-args से लागू होने की पुष्टि की जा सकती है

कई VM एक साथ चलाने का परिणाम

  • सेटअप पूरा होने के बाद UTM, Viable, Parallels जैसी Virtualization.framework-आधारित solutions पर test किया गया
    • M2 Pro MacBook Pro पर एक साथ 9 macOS VM चलाने में सफलता मिली
    • सिस्टम अभी भी परीक्षण के लिए उपयोग करने लायक स्थिति में काम करता रहा

यह सुविधा कब जोड़ी गई और आंतरिक संरचना

  • macOS 12 Monterey से hv_apple_isa_vm_quota boot argument को Virtualization stack के साथ जोड़ा गया
    • बाद के versions (macOS Sonoma सहित) में भी AppleInternal check अब भी मौजूद है
    • इससे पुष्टि होती है कि Apple ने XNU के अंदर कई private features बनाए रखे हैं

OS update के समय सावधानियां

  • custom kernel collection उपयोग करने पर automatic OS update feature disable हो जाता है
    • update के बाद errors आते हैं, इसलिए default kernel collection पर restore करना जरूरी है
    • recovery mode में bputil से नई boot policy बनाकर default kernel पर लौटा जा सकता है
    • उदाहरण: bputil --full-security या --disable-boot-args-restriction option का उपयोग

निष्कर्ष और आगे के सुधार के विचार

  • Apple की VM limit implementation को समझते हुए, अनौपचारिक लेकिन limit हटाने की विधि को प्रयोगात्मक रूप से verify किया गया
    • भले ही Virtualization team ने इसे आधिकारिक रूप से document नहीं किया है, फिर भी VM limit override feature को kernel में छोड़े जाने की बात खास ध्यान खींचती है
  • आगे के सुधार के विचार
    • KC build और boot automation tool विकसित करना
      • host के अनुसार development kernel collection अपने आप बनाना और recovery mode setup को support करना
    • kernel extension (kext) के जरिए hv_apple_isa_vm_quota variable को override करने की सुविधा बनाना
      • development kernel boot के बिना limit हटाने की संभावना तलाशना
  • अगला शोध विषय Apple Silicon VM के DEP registration और serial number override की संभावना की जांच करना है

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.