Docker में QEMU पर चलने वाला macOS
(github.com/sickcodes)- Docker-OSX Docker कंटेनर के अंदर QEMU + KVM आधारित macOS चलाता है और X11 आउटपुट, SSH, VNC, iPhone USB इंटीग्रेशन, iMessage सुरक्षा रिसर्च के लिए सीरियल जनरेशन आदि देता है
- चलाने का तरीका Docker को
/dev/kvmडिवाइस, X11 सॉकेट, पोर्ट फ़ॉरवर्डिंग और macOS वर्ज़न चुनने के लिएSHORTNAMEenvironment variable देने की संरचना पर आधारित है; Catalina 10.15 से Tahoe 16 तक के उदाहरण शामिल हैं - इमेज कॉन्फ़िगरेशन उद्देश्य के हिसाब से
latest,auto,naked,naked-autoजैसे भागों में बंटा है; अपनी बनाई.imgजोड़ सकते हैं या pre-configured Catalina इमेज से command-line कार्य चला सकते हैं - आवश्यकताएं हैं x86_64 KVM-सक्षम host, BIOS virtualization enabled, कम से कम 20GB से अधिक disk space; Xcode इस्तेमाल करने पर 50GB और
:autoइस्तेमाल करने पर कम से कम 50GB चाहिए - यह Linux के अलावा Windows 11 build 22000+ के WSL2 nested virtualization में भी चल सकता है, लेकिन display output के लिए WSLg, VNC या desktop environment में से कोई एक सेट करना होगा
Docker कंटेनर के अंदर macOS चलाना
- Docker-OSX एक प्रोजेक्ट है जो macOS को Docker कंटेनर के अंदर चलाता है
- यह QEMU + KVM पर काम करता है
- X11 forwarding सपोर्ट करता है
- iPhone USB काम करे ऐसी configuration देता है
- बताता है कि Linux और Windows पर macOS सुरक्षा रिसर्च की जा सकती है
- प्रोजेक्ट OSX-KVM पर बनाया गया है और KVM-OpenCore, OpenCorePkg का भी उल्लेख करता है
- Docker Hub इमेज भी उपलब्ध है: sickcodes/docker-osx
समर्थित macOS वर्ज़न और quick run तरीका
- Quick Start में
docker runके जरिए ये चीज़ें पास की जाती हैं--device /dev/kvm- SSH के लिए
-p 50922:10022 - X11 के लिए
/tmp/.X11-unixvolume DISPLAY- macOS वर्ज़न चुनने के लिए
SHORTNAME
- README में शामिल run targets इस प्रकार हैं
-
High Sierra 10.13
-
Mojave 10.14
-
Catalina 10.15
-
Big Sur 11
-
Monterey 12
-
Ventura 13
-
Sonoma 14
-
Sequoia 15
- Tahoe 16
- Monterey के बाद के कुछ उदाहरण
GENERATE_UNIQUE=trueऔरMASTER_PLIST_URLको साथ में इस्तेमाल करते हैं - Sonoma, Sequoia, Tahoe के उदाहरणों में
CPU='Haswell-noTSX'औरCPUID_FLAGSभी शामिल हैं
-
इमेज प्रकार और उपयोग का उद्देश्य
- Docker-OSX उद्देश्य के अनुसार container images देता है
sickcodes/docker-osx:latest: जल्दी try करने या खुद macOS इमेज बनाने के लिएsickcodes/docker-osx:auto: pre-configured Catalina सिस्टम इस्तेमाल करता है; user nameuser, passwordalpinesickcodes/docker-osx:naked: उपयोगकर्ता की.imgफ़ाइल जोड़कर चलाने के लिएsickcodes/docker-osx:naked-auto: user image मेंUSERNAME,PASSWORD,OSX_COMMANDSदेकर SSH और command execution automate करने के लिएsickcodes/docker-osx:big-sur,:monterey,:ventura,:sonoma,:high-sierra,:mojave: specific version चलाने के लिए
nakedइमेज मौजूदा disk image को बार-बार boot करने या container को पिछली state में वापस ले जाने वाली workflow के लिए बनी हैautoऔरnaked-autoका उपयोग command-line focused tasks या Homebrew आधारित builds जैसे headless कामों में किया जा सकता है
मुख्य features
- Docker-OSX ने जिन features का उल्लेख किया है, वे ये हैं
- Linux पर usbfluxd का उपयोग करके iPhone OSX KVM इस्तेमाल
- macOS Monterey VM चलाना
- folder sharing
- USB passthrough और hotplug
- SSH enable:
localhost:50922 - VNC enable:
./vncversion इस्तेमाल करने परlocalhost:8888 - serial number generator के जरिए iMessage सुरक्षा रिसर्च
- X11 forwarding
- Big Sur, custom images, Xvfb headless mode सपोर्ट
docker commitसे container clone करना संभव
- Kubernetes भी सपोर्ट करता है और बताता है कि Helm Chart और documentation
helmdirectory में हैं
आवश्यकताएं और शुरुआती setup
- न्यूनतम आवश्यकताएं इस प्रकार हैं
- 20GB से अधिक disk space
- Xcode इस्तेमाल करने पर 50GB
:autoइस्तेमाल करने पर कम से कम 50GB- BIOS में virtualization enabled
- x86_64 KVM-सक्षम host
- शुरुआती setup में host पर QEMU और संबंधित dependencies install करने के बाद
libvirtd,virtlogd, KVM kernel modules enable करने की प्रक्रिया है - Arch, Ubuntu/Debian, CentOS/RHEL/Fedora के लिए package install commands अलग-अलग दिए गए हैं
- कुछ मामलों में user को Docker, KVM, libvirt groups में होना पड़ सकता है, और Docker daemon running state भी check करनी होगी
Windows पर चलाने की शर्तें
- Windows पर Docker-OSX चलाना Windows 11 + WSL2 environment में संभव है
- Windows 11 build 22000+, 21H2 या बाद का version चाहिए
- WSL install करने के बाद
.wslconfigमेंnestedVirtualization=trueजोड़ें - WSL distribution में
kvm-okसे/dev/kvmऔर KVM acceleration उपलब्ध है या नहीं, check करें - Docker for Windows में WSL2-based engine और default WSL distribution integration enable करना होगा
- screen output के तरीके 3 प्रकार में बंटे हैं
- WSLg: सबसे सरल और recommended option, लेकिन keyboard pass-through या second mouse display जैसी समस्याएं हो सकती हैं
- VNC: QEMU VNC या VNC section की settings इस्तेमाल करें
- Desktop Environment: ज्यादा resources इस्तेमाल करता है, लेकिन पूरा Linux desktop experience देता है
file sharing और disk operations
- सबसे आसान और सुरक्षित sharing method के रूप में
sshfsबताया गया है- Linux/Windows पर
sshfs user@localhost: -p 50922 ~/mnt/osxके रूप में macOS rootfs को user space में mount करें
- Linux/Windows पर
- QEMU 9p sharing भी संभव है
- host folder को
/mnt/hostshareके रूप में container में पास करें - macOS के अंदर
sudo -S mount_9p hostshareसे mount करें
- host folder को
- NFS sharing भी बताया गया है
- host के
/etc/exportsमें shared directory register करें - Docker-OSX container को
--network hostसे start करें - macOS terminal में
mount_nfsइस्तेमाल करें
- host के
- Docker disk space कम होने पर
/var/lib/dockerको external drive, block storage, NFS आदि पर move करके symbolic link बनाया जा सकता है- current Docker images और layers delete हो सकते हैं, यह स्वीकार हो तभी संबंधित tutorial follow करने को कहा गया है
iPhone USB और USB passthrough
- desktop PC पर VFIO-based iPhone USB passthrough method के लिए अलग link दिया गया है
- laptop, PC आदि पर usbfluxd का उपयोग करके network-based USB passthrough इस्तेमाल किया जा सकता है
- Linux में iPhone या iPad को USB से connect करें
usbmuxdको TCP port5000पर expose करें- macOS guest में
usbfluxd -f -r 172.17.0.1:5000के रूप में host से connect करें - Xcode जैसी apps बंद करके फिर खोलने पर device दिखने लगता है, ऐसा बताया गया है
- सामान्य USB passthrough के लिए QEMU को root के रूप में start करना होगा, ऐसा बताया गया है
lsusb -tसे bus और port check करें--privileged,/dev/kvm,EXTRA="-device ... usb-host ..."आदि इस्तेमाल करें- VM चलते समय host system उस USB device को access नहीं कर पाएगा
headless, VNC, SPICE, remote execution
- headless execution में
docker runसे X11 से संबंधित दो lines हटाई जाती हैं/tmp/.X11-unixvolume हटाएंDISPLAYenvironment variable हटाएं
- custom image-based headless container CI/CD pipelines में useful बताया गया है
- VNC को local-only इस्तेमाल किया जा सकता है, लेकिन README साफ लिखता है कि TLS/HTTPS encryption बिल्कुल नहीं है
- SSH tunnel इस्तेमाल करने और external ports बंद करने पर यह सुरक्षित हो जाता है, ऐसा बताया गया है
- SPICE भी इस्तेमाल किया जा सकता है
remote-viewer spice://localhost:3001से connect करें- example में
-disable-ticketingauthentication के बिना VM access की अनुमति देता है, इसलिए SPICE manual की authentication settings देखने को कहा गया है
serial number और iMessage/iCloud research
- iMessage या iCloud इस्तेमाल के लिए जिन values को बदलना होगा, वे इस प्रकार हैं
SERIALBOARD_SERIALUUIDMAC_ADDRESS- बताया गया है कि
ROMcolon हटाया हुआ lowercase MAC address है
- Docker-OSX दो तरीके देता है
GENERATE_UNIQUE=true: runtime पर unique values generate करेंGENERATE_SPECIFIC=true: specified values इस्तेमाल करें
./custom/generate-unique-machine-values.shserial number, MAC address, CSV/TSV output, boot disk images बना सकता हैioreg -l | grep IOPlatformSerialNumberसे macOS के अंदर serial number check किया जा सकता है
performance, resolution, network settings
- osx-optimizer इस्तेमाल करके container को तेज बनाया जा सकता है, ऐसा बताया गया है
- GUI login screen skip करना
- Spotlight indexing disable करना
- heavy login screen background disable करना
- updates disable करना
- resolution को
WIDTHऔरHEIGHTenvironment variables से बदला जा सकता हैGENERATE_UNIQUE=trueयाGENERATE_SPECIFIC=trueके साथ इस्तेमाल करना होगा- नया boot partition बनाने के लिए boot में लगभग 30 सेकंड और लगते हैं
- गलत resolution default रूप से
800x600हो जाता है
- network adapter environment variable से बदला जा सकता है
- fast internet connection:
NETWORKING=vmxnet3 - slow internet connection:
NETWORKING=e1000-82545em
- fast internet connection:
- remote install में IPv4 forwarding on करने से performance बेहतर हो सकती है, लेकिन container में VPN इस्तेमाल करने पर भी host IP leak हो सकता है, ऐसा बताया गया है
troubleshooting और constraints
- Docker daemon running न हो तो
docker: unknown server OS: .error आ सकता हैsudo dockerdsudo systemctl --start dockerdsudo systemctl --enable --now dockerd
- RAM physical machine से ज्यादा allocate नहीं की जा सकती
- default value
-e RAM=3है - ज्यादा allocate करने पर
cannot set up guest memory 'pc.ram': Cannot allocate memoryerror आ सकता है
- default value
- ALSA संबंधित errors container initialization या boot के दौरान दिख सकते हैं; boot और functionality normal हो तो चिंता करने की जरूरत नहीं, ऐसा बताया गया है
- TODO में ये items बचे हैं
- security researchers के लिए documentation
- GPU acceleration
- virt-manager support
license और notice
- Docker-OSX GPL v3+ के तहत licensed है
- साफ लिखा है कि Docker-OSX को proprietary software बनाने के tool के रूप में इस्तेमाल करना allowed है
- इसमें Apple security research और Apple Bug Bounty Program से जुड़े notices शामिल हैं, और Hackintosh, OSX-KVM, Docker-OSX के legal issues पर अलग post link की गई है
- प्रोजेक्ट में उल्लेखित product names, logos, brands, trademarks उनके संबंधित owners की property हैं, और वे trademark holders repository से affiliated नहीं हैं, न ही उसे sponsor या endorse करते हैं
1 टिप्पणियां
Hacker News की राय
जो लोग इस प्रोजेक्ट को सच में इस्तेमाल करना चाहते हैं, उनके लिए यह अहम है, लेकिन समझ नहीं आता कि इतने सारे Dockerfile जैसे build recipes build प्रक्रिया के दौरान इंटरनेट से मनमाना content क्यों डाउनलोड करते हैं
इस प्रोजेक्ट का Dockerfile भी build के समय 2 Git repositories और 1 script fetch करता है
इंटरनेट access बंद sandboxed build server पर fail होना तो तय है ही, और जिसे security की ज़रा भी चिंता है उसे इस्तेमाल से पहले पूरा build recipe audit करना पड़ेगा
README, requirements.txt, package.json जैसे build specifications में लिखी dependencies ही review करना अब काफी नहीं रहा; हाल की core infrastructure failures और supply chain attacks में बढ़ोतरी को देखते हुए यह बहुत चिंताजनक trend है
version issues, इंटरनेट न होना, या worst case में dependency का अब उपलब्ध न रहना—ऐसे अप्रिय surprises मिलते हैं। self-contained distribution default होना चाहिए
Fedora और openSUSE में आम तौर पर policies होती हैं कि distribution packages और container images समेत builds केवल repository के packages से बनें, या build के दौरान स्पष्ट रूप से जोड़े गए binaries ही इस्तेमाल हों
इसलिए अगर आप
dnf/zypper installसे install कर सकते हैं या vendor की container registry से ला सकते हैं, तो output artifacts पर भरोसा किया जा सकता हैअगर latest bleeding edge चाहिए, तो इंटरनेट के arbitrary materials का जोखिम उठाना पड़ेगा
किसी random open source developer के लिए offline-ready, भरोसेमंद build artifacts बनाना कठिन है और उनके पास ऐसा infrastructure नहीं होता। इसलिए Red Hat या SUSE जैसी companies मौजूद हैं
अरबों डॉलर की companies खुशी-खुशी भुगतान करती हैं ताकि कोई plumbing work करके इंटरनेट के arbitrary artifacts को trustworthy, reproducible, signed artifacts में बदले, CVE track करे और regular updates देता रहे
80s में हमने Lego blocks की तरह plug-in होने वाले modular reusable software components की कल्पना की थी, और तब उसे CASE कहा जाता था। अब वह सच हो गया है, लेकिन जाहिर है उसकी कीमत भी है
अगर Dockerfile में clone न करें, तो pre-build instructions देनी पड़ेंगी कि “clone करते समय
--recursiveइस्तेमाल करें याgit submodule initसे दूसरे repositories को current working directory में लाएं”GPU acceleration की इकलौती संभावना PCI passthrough से supported dGPU पास करना है। AMD RX 6xxx और उससे ऊपर macOS 14.x में संभव है, लेकिन modern Nvidia की कोई संभावना नहीं
Intel iGPU Comet Lake तक, और कुछ Ice Lake तक काम करते हैं, लेकिन उससे नए नहीं
Apple Silicon build वाला macOS फिलहाल emulate करना मुश्किल लगता है, और ARM Darwin booting पर थोड़ा early work हुआ है
साथ ही AMD में Intel VT-x नहीं है, इसलिए AMD hosts पर virtualization टूट जाती है, लेकिन पुराने VirtualBox का इस्तेमाल करने वाले अजीब hack से Docker को emulation के जरिए कुछ हद तक चलाया जा सकता है
AMD के पास अपना VT-x alternative AMD-V है, इसलिए उसे ठीक से काम करना चाहिए। हालांकि macOS को AMD CPU पर boot कराने में अलग hurdles हैं, जिन्हें आम तौर पर kext loading या दूसरे workarounds से solve किया जाता है
Docker से पूरा operating system चलाने का मतलब मुझे समझ नहीं आता। इसे OVA या पसंदीदा virtualization format में distribute किया जा सकता है। qcow2 और VM start करने के लिए bash script ही शायद काफी होंगे
संबंधित लेख:
Docker-OSX: Run macOS VM in a Docker - https://news.ycombinator.com/item?id=34374710 - जनवरी 2023, 110 comments
macOS in QEMU in Docker - https://news.ycombinator.com/item?id=23419101 - जून 2020, 186 comments
कुछ महीने पहले मैंने experiment के तौर पर set up किया था, और यह काफी अच्छी तरह चला। हालांकि iMessage चलाने के लिए application hardware ID Apple को भेजता है, और पता चला कि यह project fake values इस्तेमाल करता है
उस point से “शायद यह काम नहीं करेगा” वाली slippery slope शुरू हो गई, और पता चला कि fake values Apple द्वारा flag हो सकती हैं, जिससे आखिर में iCloud ID potential spammer के तौर पर marked हो सकती है और दूसरे devices की access सीमित हो सकती है
इकलौता विकल्प है धुंधले ढंग से linked hardware ID generation script से values बार-बार try करना ताकि कोई “काम करने वाली” value मिल जाए, लेकिन इसका कोई साफ संकेत नहीं कि वह सच में सही fit है और iCloud reputation को नुकसान नहीं पहुंचाती
बाकी सब में यह सच में बहुत अच्छी तरह चला, और emergency में बहुत useful है
जल्द ही समझ आ गया कि पुराना लेकिन असली Mac का Serial copy करना ज्यादा आसान है
हालांकि यह tool personal computer की तरह इस्तेमाल करने के बजाय, proprietary macOS frameworks पर depend करने वाले build scripts जैसे use cases के लिए ज्यादा useful लगता है
बस यह टेस्ट करके देखना चाहता/चाहती हूं कि iOS के लिए build किया जा सकता है या नहीं। उदाहरण के लिए Unity, React Native जैसी चीजें
भले ही build में 5 गुना ज्यादा समय लगे, freedom के लिहाज से यह काफी शानदार हो सकता है
Godot भी iOS target के लिए इसी तरह build करता है: https://github.com/godotengine/build-containers/blob/main/Do...
tools पहले से install वाली Docker image भी है, लेकिन iOS target करने के लिए थोड़े बदलावों की जरूरत होगी: https://github.com/shepherdjerred/macos-cross-compiler
RStudio, अब के Posit में रहते हुए, Linux host से x86_64/aarch64 macOS target करके C/C++/Fortran/Rust cross-compilation पर काम किया था
Posit Package Manager(https://p3m.dev/client/) से अगर native code वाला R package डाउनलोड करते हैं, तो वह इसी तरीके से cross-compile किया हुआ होता है :)
पहले Sick Codes के साथ इस product approach पर interview किया था: https://www.vice.com/en/article/akdmb8/open-source-app-lets-...
ऐसा ही काम Proxmox home server पर करने वाला OSX-PROXMOX भी है: https://github.com/luchina-gabriel/OSX-PROXMOX
निजी तौर पर HP Z420 Xeon पर बाद वाला use कर रहा/रही हूं, खासकर GPU passthrough जोड़ने पर यह बहुत stable है
अच्छा होगा अगर home server पर iCloud sync चला सकें। अभी iCloud को home server/NAS पर physically backup करने का कोई अच्छा तरीका नहीं है, और यह सिर्फ Windows/Apple पर काम करता है
https://github.com/steilerDev/icloud-photos-sync
https://github.com/icloud-photos-downloader/icloud_photos_do...
पता चला कि iCloud original photos को update नहीं करता। समझ में आता है, लेकिन backup करते समय उन changes के शामिल होने की उम्मीद रखने वाले के लिए यह मददगार नहीं है
rsyncकरने की तुलना में यह अलग क्या करने देता है?सोच रहा/रही हूं कि MacOS image redistribution license के तहत allowed है या नहीं। या फिर यह project Docker Hub पर pirated copies खुलेआम distribute कर रहा है?
सोच रहा/रही हूं कि Intel support हटे हुए और नए MacOS versions आने पर progress रुक जाएगी या नहीं
क्या इस container के अंदर Docker चलाकर MacOS के अंदर MacOS चला सकते हैं? ;)
जब “USB passthrough” expression असल में ज्यादा से ज्यादा “Ethernet over USB proxy” जैसी स्थिति के लिए इस्तेमाल होता है, तो मुझे सच में चिढ़ होती है
वह passthrough नहीं है। उसमें कई ऐसे drawbacks आते हैं जो normal passthrough में नहीं होते, और advanced passthrough में भी शायद न हों
लेकिन वह तरीका अपनी अलग समस्याएं लाता है। forwarded hardware वाले बड़े VM test farms चलाने के अनुभव से ऐसा कह रहा/रही हूं
हालांकि “Ethernet over USB proxy” भी असली passthrough ही है, बस VirtIO से ज्यादा latency वाला passthrough है