Apple Silicon पर 2 virtual machine की सीमा को बायपास करने का तरीका (2023)
(khronokernel.com)- Apple Silicon-आधारित macOS में Virtualization.framework के जरिए चलने वाले macOS VM की अधिकतम संख्या 2 तक सीमित है, और यह macOS लाइसेंस एग्रीमेंट की शर्तों पर आधारित है
- विश्लेषण से पता चला कि यह सीमा XNU kernel के अंदर मौजूद private variable
hv_apple_isa_vm_quotaसे नियंत्रित होती है, और boot arguments के जरिए इसे override किया जा सकता है - System Integrity Protection के
AppleInternalcheck को बायपास करने के लिए 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_quotavariable VM की संख्या को manage करता है, और VM create/delete होने पर इसका मान बढ़ता-घटता है- kernel में
hypervisor=औरhv_apple_isa_vm_quota=boot arguments मौजूद हैं, जिनमें दूसरा वाला VM limit को override कर सकता है
- Intel kernel में यही code मौजूद नहीं है, जबकि Apple Silicon kernel की
- release kernel में
hypervisorargument की जगह System Integrity Protection (SIP) केAppleInternalcheck से यह नियंत्रित हैCSR_ALLOW_APPLE_INTERNALflag enabled होने पर हीhv_apple_isa_vm_quotaargument लागू होता है- इसे बायपास करने के लिए 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 हो सकते हैं
unamecommand से kernel architecture जांचने के बादkmutil createcommand की मदद से Development Kernel Collection (VirtualMachine.kc) बनाई जाती है- उदाहरण में macOS 14.0 (build 23A5301h) और T6020 kernel का उपयोग किया गया
--variant-suffix developmentoption के जरिए development kernel चुना जाता है, और कई system extension repositories शामिल की जाती हैं
Development Kernel boot configuration
- Mac को shut down करने के बाद recoveryOS में boot करके terminal में ये settings की जाती हैं
- System Integrity Protection disable करना (
csrutil disable) - boot argument restrictions हटाना (
bputil --disable-boot-args-restriction) - custom kernel collection चुनना (
kmutil configure-boot) - boot arguments सेट करना (
nvramcommand के जरिए)kcsuffix=development: development kernel boothypervisor=0x1: virtualization stack की special features enablehv_apple_isa_vm_quota=0xFF: VM की अधिकतम संख्या 255 सेट
- System Integrity Protection disable करना (
- 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_quotaboot argument को Virtualization stack के साथ जोड़ा गया- बाद के versions (macOS Sonoma सहित) में भी
AppleInternalcheck अब भी मौजूद है - इससे पुष्टि होती है कि Apple ने XNU के अंदर कई private features बनाए रखे हैं
- बाद के versions (macOS Sonoma सहित) में भी
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-restrictionoption का उपयोग
निष्कर्ष और आगे के सुधार के विचार
- 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_quotavariable को override करने की सुविधा बनाना- development kernel boot के बिना limit हटाने की संभावना तलाशना
- KC build और boot automation tool विकसित करना
- अगला शोध विषय Apple Silicon VM के DEP registration और serial number override की संभावना की जांच करना है
1 टिप्पणियां
Hacker News की टिप्पणियाँ
सभी Mac पर एक जैसी लागू होने वाली ऐसी सीमा बहुत अतार्किक है
अगर आपने ज़्यादा शक्तिशाली Mac खरीदा है, तो आपको ज़्यादा macOS instances virtualize करने में सक्षम होना चाहिए
उदाहरण के लिए, M5 पर 2, M5 Pro पर 4, M5 Max पर 8 जैसी सीमा रखना ज़्यादा तर्कसंगत लगता है
hardware performance ही स्वाभाविक सीमा है, इसलिए user खुद ही वहीं रुक जाएगा
संभव है कि यह सस्ते Mac VPS services को रोकने के लिए किया गया हो
Hyper‑V hardware के संभाल पाने की स्थिति में एक साथ अधिकतम 1024 VM चला सकता है
मेरे छोटे Windows ARM laptop पर भी 4 बिना किसी दिक्कत के चल जाते हैं
मैंने openclaw को test करने के लिए VM चलाया, लेकिन iCloud और App Store access सीमित होने की वजह से हैरान रह गया
यह दिलचस्प है कि Mykola Grymalyuk ने यह blog post लिखने के 2 साल बाद Apple join कर लिया
“hero बनकर मरना या…” वाला meme याद आता है
M3 और उसके बाद से Hypervisor.framework / Virtualization.framework का इस्तेमाल करके nested VM चलाए जा सकते हैं
अगर इससे यह सीमा bypass हो सके, तो काफ़ी मज़ेदार होगा
macOS सिर्फ एक स्तर तक ही संभव है, इसलिए macOS guest के अंदर एक और macOS guest चलाना संभव नहीं है
मैं खुद करने में आलसी हूँ, लेकिन काश कोई यह experiment कर दे
सच में जिज्ञासा है कि Apple ने ऐसी सीमा क्यों लगाई
hardware sales software development को support करती है, इसलिए Apple नहीं चाहता कि जिन लोगों ने hardware नहीं खरीदा, वे macOS का इस्तेमाल करें
user freedom से ज़्यादा Apple के लिए control बनाए रखना प्राथमिकता है
यह हैरान करने वाली बात है कि custom kernel compile करके boot किया जा सकता है और GUI तक चलाया जा सकता है
लेख खुद में बहुत दिलचस्प है, लेकिन development के लिए ऐसे platform का इस्तेमाल करना अजीब है जिसमें इस तरह की मनमानी सीमाएँ हों
बहुत से developers इसे high-end hardware की वजह से इस्तेमाल करते हैं, लेकिन macOS हमेशा “लगभग Linux, लेकिन iTunes-केंद्रित company द्वारा नियंत्रित OS” जैसा रहा है
कहा गया है कि Apple Silicon पर custom kernel collection इस्तेमाल करने से automatic OS updates संभव नहीं रहते
लेकिन शायद यह उल्टा छिपा हुआ वरदान साबित हो सकता है
सोच रहा हूँ कि क्या यह lume पर भी काम कर सकता है
वहाँ अभी इसी तरह की सीमा है
मेरी जानकारी में lume Apple के Virtualization.framework पर बना एक पतला wrapper है
सुना है कि SIP बंद करके और boot arguments सेट करके custom kernel के बिना भी यह संभव है
Apple ने VM को 2 तक सीमित कर दिया?
दूसरे OS guests बिना किसी सीमा के चलाए जा सकते हैं