macOS yang Berjalan dengan QEMU di Docker
(github.com/sickcodes)- Docker-OSX adalah proyek yang menjalankan macOS berbasis QEMU + KVM di dalam container Docker, menyediakan output X11, SSH, VNC, integrasi USB iPhone, serta pembuatan serial untuk riset keamanan iMessage
- Cara menjalankannya menggunakan struktur yang meneruskan perangkat
/dev/kvm, socket X11, port forwarding, dan variabel lingkunganSHORTNAMEke Docker untuk memilih versi macOS, dengan contoh dari Catalina 10.15 hingga Tahoe 16 - Susunan image dibagi berdasarkan tujuan seperti
latest,auto,naked,naked-auto, dan dapat memakai.imgbuatan sendiri atau menjalankan pekerjaan baris perintah dengan image Catalina yang sudah dikonfigurasi sebelumnya - Persyaratannya adalah host x86_64 yang mendukung KVM, virtualisasi BIOS aktif, ruang disk minimal 20GB, serta 50GB untuk penggunaan Xcode dan minimal 50GB saat memakai
:auto - Selain Linux, ini juga dapat berjalan pada nested virtualization WSL2 di Windows 11 build 22000+, tetapi output layar memerlukan salah satu dari WSLg, VNC, atau desktop environment
Menjalankan macOS di dalam container Docker
- Docker-OSX adalah proyek untuk menjalankan macOS di dalam container Docker
- Berjalan di atas QEMU + KVM
- Mendukung X11 forwarding
- Menyediakan konfigurasi agar USB iPhone dapat berfungsi
- Menjelaskan bahwa riset keamanan macOS dapat dilakukan di Linux dan Windows
- Proyek ini dibuat di atas OSX-KVM, dan juga menyebut KVM-OpenCore, OpenCorePkg
- Image Docker Hub juga tersedia: sickcodes/docker-osx
Versi macOS yang didukung dan cara menjalankan cepat
- Quick Start memakai
docker rundengan meneruskan elemen berikut--device /dev/kvm-p 50922:10022untuk SSH- volume
/tmp/.X11-unixuntuk X11 DISPLAYSHORTNAMEuntuk memilih versi macOS
- Target yang disertakan dalam README adalah sebagai berikut
-
High Sierra 10.13
-
Mojave 10.14
-
Catalina 10.15
-
Big Sur 11
-
Monterey 12
-
Ventura 13
-
Sonoma 14
-
Sequoia 15
- Tahoe 16
- Beberapa contoh setelah Monterey juga memakai
GENERATE_UNIQUE=truebersamaMASTER_PLIST_URL - Contoh Sonoma, Sequoia, dan Tahoe juga menyertakan
CPU='Haswell-noTSX'danCPUID_FLAGS
-
Jenis image dan tujuan penggunaan
- Docker-OSX menyediakan image container berdasarkan tujuan penggunaan
sickcodes/docker-osx:latest: untuk mencoba dengan cepat atau membuat image macOS sendirisickcodes/docker-osx:auto: memakai sistem Catalina yang sudah dikonfigurasi sebelumnya, dengan nama penggunauserdan kata sandialpinesickcodes/docker-osx:naked: menjalankan dengan menempelkan file.imgmilik penggunasickcodes/docker-osx:naked-auto: mengotomatisasi SSH dan eksekusi perintah dengan meneruskanUSERNAME,PASSWORD,OSX_COMMANDSke image penggunasickcodes/docker-osx:big-sur,:monterey,:ventura,:sonoma,:high-sierra,:mojave: untuk menjalankan versi tertentu
- Image
nakeddisesuaikan untuk alur boot berulang dari image disk yang sudah ada, atau mengembalikan container ke status sebelumnya autodannaked-autodapat digunakan untuk pekerjaan berfokus command line atau pekerjaan headless seperti build berbasis Homebrew
Fitur utama
- Fitur yang disebutkan oleh Docker-OSX adalah sebagai berikut
- Penggunaan iPhone OSX KVM di Linux dengan usbfluxd
- Menjalankan VM macOS Monterey
- Berbagi folder
- USB passthrough dan hotplug
- SSH aktif di
localhost:50922 - VNC aktif di
localhost:8888saat memakai versi./vnc - serial number generator untuk riset keamanan iMessage
- X11 forwarding
- Dukungan Big Sur, image kustom, dan mode headless Xvfb
- Container dapat diduplikasi dengan
docker commit
- Kubernetes juga didukung, dan Helm Chart serta dokumentasi disebut berada di direktori
helm
Persyaratan dan pengaturan awal
- Persyaratan minimumnya adalah sebagai berikut
- Ruang disk 20GB atau lebih
- 50GB saat memakai Xcode
- Minimal 50GB saat memakai
:auto - Virtualisasi diaktifkan di BIOS
- host x86_64 yang mendukung KVM
- Pengaturan awal mengikuti alur memasang QEMU dan dependensi terkait di host, lalu mengaktifkan
libvirtd,virtlogd, dan modul kernel KVM - Perintah pemasangan paket disediakan masing-masing untuk Arch, Ubuntu/Debian, dan CentOS/RHEL/Fedora
- Dalam beberapa kasus pengguna harus masuk ke grup Docker, KVM, dan libvirt, serta memastikan daemon Docker sedang berjalan
Syarat menjalankan di Windows
- Menjalankan Docker-OSX di Windows dimungkinkan pada lingkungan Windows 11 + WSL2
- Diperlukan Windows 11 build 22000+, 21H2 atau lebih baru
- Setelah memasang WSL, tambahkan
nestedVirtualization=trueke.wslconfig - Di distribusi WSL, periksa ketersediaan
/dev/kvmdan akselerasi KVM dengankvm-ok - Di Docker for Windows, aktifkan engine berbasis WSL2 dan integrasi dengan distribusi WSL default
- Metode output layar dibagi menjadi 3
- WSLg: opsi paling sederhana dan direkomendasikan, tetapi mungkin ada masalah pengiriman keyboard atau tampilan mouse kedua
- VNC: gunakan pengaturan QEMU VNC atau bagian VNC
- Desktop Environment: memakai lebih banyak sumber daya tetapi memberikan pengalaman desktop Linux penuh
Berbagi file dan pengelolaan disk
sshfsdisarankan sebagai cara berbagi yang paling mudah dan aman- Di Linux/Windows, rootfs macOS dapat di-mount ke ruang pengguna dengan bentuk
sshfs user@localhost: -p 50922 ~/mnt/osx
- Di Linux/Windows, rootfs macOS dapat di-mount ke ruang pengguna dengan bentuk
- QEMU 9p sharing juga bisa digunakan
- Folder host diteruskan ke container sebagai
/mnt/hostshare - Di dalam macOS, mount dengan
sudo -S mount_9p hostshare
- Folder host diteruskan ke container sebagai
- Berbagi lewat NFS juga dijelaskan
- Daftarkan direktori berbagi host ke
/etc/exports - Jalankan container Docker-OSX dengan
--network host - Gunakan
mount_nfsdi terminal macOS
- Daftarkan direktori berbagi host ke
- Jika ruang disk Docker tidak cukup,
/var/lib/dockerbisa dipindahkan ke drive eksternal, block storage, NFS, dan sebagainya, lalu dibuat symbolic link- Dijelaskan agar mengikuti tutorial terkait hanya jika siap menerima kemungkinan terhapusnya image dan layer Docker yang ada saat ini
USB iPhone dan USB passthrough
- Untuk desktop PC, metode passthrough USB iPhone berbasis VFIO dijelaskan melalui tautan terpisah
- Pada laptop, PC, dan perangkat lain, USB passthrough berbasis jaringan dapat digunakan lewat usbfluxd
- Hubungkan iPhone atau iPad ke Linux lewat USB
- Ekspos
usbmuxdke port TCP5000 - Di guest macOS, hubungkan ke host dengan bentuk
usbfluxd -f -r 172.17.0.1:5000 - Dijelaskan bahwa perangkat akan muncul setelah aplikasi seperti Xcode ditutup lalu dibuka kembali
- USB passthrough umum dijelaskan memerlukan QEMU dijalankan sebagai root
- Periksa bus dan port dengan
lsusb -t - Gunakan
--privileged,/dev/kvm,EXTRA="-device ... usb-host ...", dan sebagainya - Saat VM berjalan, sistem host tidak dapat mengakses perangkat USB tersebut
- Periksa bus dan port dengan
Headless, VNC, SPICE, dan eksekusi jarak jauh
- Menjalankan secara headless dilakukan dengan menghapus dua baris terkait X11 dari
docker run- Hapus volume
/tmp/.X11-unix - Hapus variabel lingkungan
DISPLAY
- Hapus volume
- Container headless berbasis image kustom dijelaskan berguna untuk pipeline CI/CD
- VNC dapat dipakai hanya secara lokal, tetapi README secara eksplisit menyebut tidak ada enkripsi TLS/HTTPS sama sekali
- Dijelaskan bahwa penggunaan tunnel SSH dan menutup port eksternal akan membuatnya lebih aman
- SPICE juga dapat digunakan
- Hubungkan dengan
remote-viewer spice://localhost:3001 -disable-ticketingpada contoh mengizinkan akses VM tanpa autentikasi, sehingga dianjurkan merujuk ke pengaturan autentikasi di manual SPICE
- Hubungkan dengan
Nomor serial dan riset iMessage/iCloud
- Nilai berikut disebut perlu diubah untuk menggunakan iMessage atau iCloud
SERIALBOARD_SERIALUUIDMAC_ADDRESSROMdijelaskan sebagai alamat MAC huruf kecil tanpa titik dua
- Docker-OSX menyediakan dua cara
GENERATE_UNIQUE=true: membuat nilai unik saat runtimeGENERATE_SPECIFIC=true: memakai nilai yang ditentukan
./custom/generate-unique-machine-values.shdapat membuat nomor serial, alamat MAC, output CSV/TSV, serta image boot disk- Nomor serial dapat diperiksa di dalam macOS dengan
ioreg -l | grep IOPlatformSerialNumber
Performa, resolusi, dan pengaturan jaringan
- Dijelaskan bahwa container dapat dipercepat dengan osx-optimizer
- Melewati layar login GUI
- Menonaktifkan indexing Spotlight
- Menonaktifkan latar belakang layar login yang berat
- Menonaktifkan pembaruan
- Resolusi dapat diubah dengan variabel lingkungan
WIDTHdanHEIGHT- Harus digunakan bersama
GENERATE_UNIQUE=trueatauGENERATE_SPECIFIC=true - Boot memerlukan sekitar 30 detik tambahan untuk membuat partisi boot baru
- Resolusi yang salah akan diatur ulang ke
800x600
- Harus digunakan bersama
- Adapter jaringan dapat diubah dengan variabel lingkungan
- Koneksi internet cepat:
NETWORKING=vmxnet3 - Koneksi internet lambat:
NETWORKING=e1000-82545em
- Koneksi internet cepat:
- Pada instalasi jarak jauh, mengaktifkan IPv4 forwarding dapat meningkatkan performa, tetapi dijelaskan bahwa IP host bisa bocor meskipun VPN digunakan di dalam container
Pemecahan masalah dan batasan
- Jika daemon Docker tidak berjalan, dapat muncul error
docker: unknown server OS: .sudo dockerdsudo systemctl --start dockerdsudo systemctl --enable --now dockerd
- RAM tidak dapat dialokasikan melebihi mesin fisik
- Nilai default adalah
-e RAM=3 - Jika dialokasikan terlalu banyak, dapat muncul error
cannot set up guest memory 'pc.ram': Cannot allocate memory
- Nilai default adalah
- Error terkait ALSA dapat muncul saat inisialisasi container atau selama boot, dan dijelaskan tidak perlu dikhawatirkan jika proses boot dan fungsi berjalan normal
- TODO masih mencantumkan item berikut
- Dokumentasi untuk peneliti keamanan
- Akselerasi GPU
- Dukungan virt-manager
Lisensi dan pemberitahuan
- Docker-OSX dilisensikan dengan GPL v3+
- Disebutkan bahwa penggunaan Docker-OSX sebagai alat untuk membuat perangkat lunak proprietari diperbolehkan
- Termasuk pemberitahuan terkait riset keamanan Apple dan Apple Bug Bounty Program, serta tautan ke tulisan terpisah mengenai isu hukum Hackintosh, OSX-KVM, dan Docker-OSX
- Dijelaskan bahwa nama produk, logo, merek, dan trademark yang disebut di proyek ini adalah milik pemilik masing-masing, dan para pemegang merek tersebut tidak berafiliasi dengan, mensponsori, atau mendukung repositori ini
1 komentar
Opini Hacker News
Ini penting bagi orang yang benar-benar ingin memakai proyeknya, tapi saya tidak mengerti kenapa begitu banyak resep build seperti Dockerfile dibuat untuk mengunduh materi acak dari internet selama proses build
Dockerfile proyek ini juga mengambil 2 repositori Git dan 1 skrip pada saat build
Selain tentu saja gagal di server build sandbox yang akses internetnya diblokir, siapa pun yang sedikit saja peduli keamanan harus mengaudit seluruh resep build sebelum menggunakannya
Sekarang tidak cukup lagi hanya memeriksa dependensi yang tercantum di spesifikasi build seperti README, requirements.txt, atau package.json; melihat kegagalan infrastruktur inti belakangan ini dan meningkatnya serangan rantai pasok, ini adalah tren yang sangat mengkhawatirkan
Muncul kejutan yang tidak menyenangkan, seperti masalah versi, tidak ada internet, atau yang terburuk dependensinya tidak lagi tersedia. Distribusi mandiri seharusnya menjadi default
Fedora dan openSUSE biasanya punya kebijakan agar build, termasuk paket distribusi dan image container, hanya dibuat dari paket di repositori atau hanya memakai binary yang ditambahkan secara eksplisit saat build
Jadi kalau bisa dipasang dengan
dnf/zypper installatau diambil dari registry container vendor, artefaknya bisa dipercayaKalau butuh bleeding edge terbaru, Anda harus menerima materi acak dari internet
Sulit bagi developer open source sembarang untuk membuat artefak build yang siap offline dan tepercaya, dan mereka tidak punya infrastruktur seperti itu. Karena itulah perusahaan seperti Red Hat atau SUSE ada
Perusahaan bernilai puluhan miliar dolar bersedia membayar seseorang untuk mengerjakan pekerjaan plumbing: mengubah artefak acak dari internet menjadi artefak yang tepercaya, dapat direproduksi, dan ditandatangani, sekaligus melacak CVE dan melakukan pembaruan rutin
Pada era 80-an, orang membayangkan komponen software pakai ulang yang modular, seperti balok Lego yang bisa dipasang-pasang, dan saat itu disebut CASE. Sekarang hal itu sudah terwujud, tapi tentu ada harganya
Kalau tidak melakukan clone di Dockerfile, perlu ada instruksi pra-build seperti “gunakan
--recursivesaat clone atau jalankangit submodule inituntuk mengambil repositori lain ke direktori kerja saat ini”Satu-satunya kemungkinan untuk akselerasi GPU adalah meneruskan dGPU yang didukung lewat PCI passthrough. AMD RX 6xxx ke atas bisa di macOS 14.x, tetapi Nvidia modern tidak mungkin
Intel iGPU berfungsi hingga Comet Lake, dan sebagian Ice Lake, tetapi yang lebih baru tidak
macOS build Apple Silicon tampaknya sulit diemulasikan untuk sementara waktu, dan ada sedikit pekerjaan awal untuk boot ARM Darwin
Selain itu, AMD tidak punya Intel VT-x sehingga virtualisasi rusak di host AMD, tetapi lewat hack aneh menggunakan VirtualBox versi lama, Docker bisa dijalankan sampai taraf tertentu melalui emulasi
AMD punya alternatif VT-x sendiri, yaitu AMD-V, jadi seharusnya berjalan tanpa masalah. Namun ada hambatan lain untuk mem-boot macOS di CPU AMD, yang biasanya diselesaikan dengan memuat kext atau trik lain
Saya kurang paham apa gunanya menjalankan seluruh sistem operasi dengan Docker. Cukup distribusikan sebagai OVA atau format virtualisasi pilihan. qcow2 dan skrip bash untuk memulai VM mungkin sudah cukup
Tulisan terkait:
Docker-OSX: Run macOS VM in a Docker - https://news.ycombinator.com/item?id=34374710 - Januari 2023, 110 komentar
macOS in QEMU in Docker - https://news.ycombinator.com/item?id=23419101 - Juni 2020, 186 komentar
Beberapa bulan lalu saya mengaturnya sebagai eksperimen, dan berjalan cukup baik. Namun agar iMessage berfungsi, saya mengetahui bahwa aplikasinya mengirim hardware ID ke Apple, dan proyek ini memakai nilai palsu
Sejak saat itu, saya mulai meluncur di lereng “sepertinya tidak akan berhasil”, dan mengetahui bahwa nilai palsu bisa ditandai oleh Apple sehingga pada akhirnya ID iCloud bisa ditandai sebagai calon spammer dan akses dari perangkat lain dibatasi
Satu-satunya pilihan adalah terus mencoba nilai dengan skrip pembuat hardware ID yang ditautkan secara samar sampai menemukan nilai yang “berfungsi”, tetapi tidak ada sinyal jelas bahwa nilainya benar-benar cocok dan tidak merusak reputasi iCloud
Selain itu, semuanya berjalan sangat baik, dan sangat berguna saat keadaan mendesak
Tak lama kemudian, saya sadar lebih mudah menyalin Serial dari Mac sungguhan, meski sudah tua
Namun alat ini tampaknya lebih berguna untuk hal seperti skrip build yang bergantung pada framework macOS proprietary, bukan untuk dipakai seperti komputer pribadi
Sekadar ingin mencoba apakah bisa melakukan build untuk iOS. Misalnya hal-hal seperti Unity atau React Native
Meski build memakan waktu 5 kali lebih lama, dari sisi kebebasan ini bisa cukup keren
Cara Godot melakukan build dengan target iOS juga seperti ini: https://github.com/godotengine/build-containers/blob/main/Do...
Ada juga image Docker dengan tool yang sudah terpasang sebelumnya, tetapi perlu sedikit modifikasi untuk menargetkan iOS: https://github.com/shepherdjerred/macos-cross-compiler
Saat di RStudio, yang sekarang menjadi Posit, saya pernah mengerjakan cross-compilation C/C++/Fortran/Rust dari host Linux dengan target macOS x86_64/aarch64
Jika mengunduh paket R yang memiliki native code dari Posit Package Manager(https://p3m.dev/client/), paket itu di-cross-compile dengan cara ini :)
Dulu pernah mewawancarai Sick Codes tentang pendekatan produk ini: https://www.vice.com/en/article/akdmb8/open-source-app-lets-...
Ada juga OSX-PROXMOX yang melakukan hal serupa di homeserver Proxmox: https://github.com/luchina-gabriel/OSX-PROXMOX
Secara pribadi saya memakai yang terakhir di HP Z420 Xeon, dan sangat stabil, terutama jika ditambah GPU passthrough
Akan menyenangkan jika bisa menjalankan sinkronisasi iCloud di homeserver. Saat ini tidak ada cara yang bagus untuk membackup iCloud secara fisik ke homeserver/NAS, dan hanya berfungsi di Windows/Apple
https://github.com/steilerDev/icloud-photos-sync
https://github.com/icloud-photos-downloader/icloud_photos_do...
Ternyata iCloud tidak memperbarui foto asli. Itu bisa dimengerti, tetapi tidak membantu bagi orang yang mengharapkan perubahan tersebut ikut terbawa saat melakukan backup
rsyncfolder iCloud dari Mac/PC yang terhubung ke NAS, apa hal berbeda yang bisa dilakukan olehnya?Saya penasaran apakah redistribusi image MacOS diizinkan oleh lisensi. Atau apakah proyek ini terang-terangan mendistribusikan salinan bajakan di Docker Hub?
Saya penasaran apakah pengembangannya akan terhenti saat versi MacOS yang lebih baru tanpa dukungan Intel dirilis
Bisakah menjalankan Docker di dalam container ini untuk menjalankan MacOS di dalam MacOS? ;)
Saya benar-benar tidak suka ketika istilah “USB passthrough” dipakai untuk situasi yang sebenarnya paling banter adalah “proxy USB melalui Ethernet”
Itu bukan passthrough. Ia membawa berbagai kelemahan yang tidak ada pada passthrough biasa, dan mungkin juga tidak ada pada passthrough tingkat lanjut
Namun cara itu juga membawa masalah lain. Ini berdasarkan pengalaman menjalankan farm pengujian VM skala besar dengan banyak hardware yang diteruskan
Meski begitu, “proxy USB melalui Ethernet” juga passthrough sungguhan, hanya saja passthrough dengan latensi lebih besar daripada VirtIO