Docker’da QEMU ile çalıştırılan macOS
(github.com/sickcodes)- Docker-OSX, Docker konteyneri içinde QEMU + KVM tabanlı macOS çalıştırarak X11 çıktısı, SSH, VNC, iPhone USB entegrasyonu ve iMessage güvenlik araştırmaları için seri numarası üretimi gibi özellikler sunar
- Çalıştırma yöntemi,
/dev/kvmaygıtını, X11 soketini, port yönlendirmeyi ve macOS sürümünü seçmek içinSHORTNAMEortam değişkenini Docker’a aktarma yapısına dayanır; Catalina 10.15’ten Tahoe 16’ya kadar örnekler içerir - İmaj yapısı amaca göre
latest,auto,naked,naked-autogibi seçeneklere ayrılır; kendi oluşturduğunuz.imgdosyasını bağlayabilir veya önceden yapılandırılmış Catalina imajıyla komut satırı işleri çalıştırabilirsiniz - Gereksinimler x86_64 KVM destekli host, BIOS’ta sanallaştırmanın etkinleştirilmesi ve en az 20 GB üzeri disk alanıdır; Xcode kullanırken 50 GB,
:autokullanırken en az 50 GB gerekir - Yalnızca Linux’ta değil, Windows 11 build 22000+ üzerindeki WSL2 iç içe sanallaştırma ile de çalıştırılabilir; ancak görüntü çıktısı için WSLg, VNC veya bir masaüstü ortamından biri ayarlanmalıdır
Docker konteyneri içinde macOS çalıştırma
- Docker-OSX, macOS’u Docker konteyneri içinde çalıştıran bir projedir
- QEMU + KVM üzerinde çalışır
- X11 yönlendirmesini destekler
- iPhone USB’nin çalıştığı bir yapılandırma sunar
- Linux ve Windows’ta macOS güvenlik araştırması yapılabileceğini belirtir
- Proje OSX-KVM üzerine inşa edilmiştir ve KVM-OpenCore, OpenCorePkg ile birlikte anılır
- Docker Hub imajı da sunulur: sickcodes/docker-osx
Desteklenen macOS sürümleri ve hızlı çalıştırma yöntemi
- Quick Start,
docker runiçinde aşağıdaki öğeleri aktarma yöntemidir--device /dev/kvm- SSH için
-p 50922:10022 - X11 için
/tmp/.X11-unixvolume’u DISPLAY- macOS sürümünü seçmek için
SHORTNAME
- README’de yer alan çalıştırma hedefleri şunlardır
-
High Sierra 10.13
-
Mojave 10.14
-
Catalina 10.15
-
Big Sur 11
-
Monterey 12
-
Ventura 13
-
Sonoma 14
-
Sequoia 15
- Tahoe 16
- Monterey sonrası örneklerin bir kısmı
GENERATE_UNIQUE=trueileMASTER_PLIST_URLdeğerini birlikte kullanır - Sonoma, Sequoia ve Tahoe örnekleri
CPU='Haswell-noTSX'veCPUID_FLAGSdeğerlerini de içerir
-
İmaj türleri ve kullanım amaçları
- Docker-OSX, amaca göre konteyner imajları sunar
sickcodes/docker-osx:latest: Hızlıca denemek veya doğrudan macOS imajı oluşturmak için kullanılırsickcodes/docker-osx:auto: Önceden yapılandırılmış Catalina sistemini kullanır; kullanıcı adıuser, parolaalpinesickcodes/docker-osx:naked: Kullanıcının sahip olduğu.imgdosyasını bağlayarak çalıştırırsickcodes/docker-osx:naked-auto: Kullanıcı imajınaUSERNAME,PASSWORD,OSX_COMMANDSaktararak SSH ve komut çalıştırmayı otomatikleştirirsickcodes/docker-osx:big-sur,:monterey,:ventura,:sonoma,:high-sierra,:mojave: Belirli sürümleri çalıştırmak için
nakedimajı, mevcut disk imajlarını tekrarlı olarak boot etmek veya konteyneri önceki bir duruma geri döndürme akışına uygundurautovenaked-auto, komut satırı odaklı işler veya Homebrew tabanlı derlemeler gibi headless işler için kullanılabilir
Başlıca özellikler
- Docker-OSX’in belirttiği özellikler şunlardır
- Linux’ta usbfluxd kullanarak iPhone OSX KVM kullanımı
- macOS Monterey VM çalıştırma
- Klasör paylaşımı
- USB passthrough ve hotplug
- SSH etkinleştirme:
localhost:50922 - VNC etkinleştirme:
./vncsürümü kullanıldığındalocalhost:8888 - serial number generator aracılığıyla iMessage güvenlik araştırması
- X11 yönlendirmesi
- Big Sur, özel imajlar ve Xvfb headless modu desteği
docker commitile konteyner çoğaltma imkânı
- Kubernetes de desteklenir; Helm Chart ve belgelerin
helmdizininde olduğu belirtilir
Gereksinimler ve ilk kurulum
- Minimum gereksinimler şunlardır
- 20 GB üzeri disk alanı
- Xcode kullanırken 50 GB
:autokullanırken en az 50 GB- BIOS’ta sanallaştırmanın etkinleştirilmesi
- x86_64 KVM destekli host
- İlk kurulum, host’a QEMU ve ilgili bağımlılıkları kurduktan sonra
libvirtd,virtlogdve KVM kernel modüllerini etkinleştirme akışıdır - Arch, Ubuntu/Debian ve CentOS/RHEL/Fedora için ayrı ayrı paket kurulum komutları sunulur
- Kullanıcının Docker, KVM ve libvirt gruplarına dahil olması gereken durumlar olabilir; Docker daemon’unun çalışır durumda olduğu da kontrol edilmelidir
Windows’ta çalıştırma koşulları
- Windows’ta Docker-OSX çalıştırma Windows 11 + WSL2 ortamında mümkündür
- Windows 11 build 22000+, 21H2 veya üzeri gerekir
- WSL kurulduktan sonra
.wslconfigdosyasınanestedVirtualization=trueeklenir - WSL dağıtımında
kvm-okile/dev/kvmve KVM hızlandırmasının kullanılabilir olup olmadığı kontrol edilir - Docker for Windows’ta WSL2 tabanlı engine ve varsayılan WSL dağıtımı entegrasyonu açılmalıdır
- Ekran çıktısı yöntemleri 3’e ayrılır
- WSLg: En basit ve önerilen seçenektir, ancak klavye aktarımı veya ikinci fare imlecinin görünmesi gibi sorunlar olabilir
- VNC: QEMU VNC veya VNC bölümündeki ayarlar kullanılır
- Desktop Environment: Daha fazla kaynak kullanır ancak tam Linux masaüstü deneyimi sunar
Dosya paylaşımı ve disk yönetimi
- En kolay ve güvenli paylaşım yöntemi olarak
sshfsönerilir- Linux/Windows’ta
sshfs user@localhost: -p 50922 ~/mnt/osxbiçiminde macOS rootfs kullanıcı alanına mount edilir
- Linux/Windows’ta
- QEMU 9p paylaşımı da mümkündür
- Host klasörü konteynere
/mnt/hostshareolarak aktarılır - macOS içinde
sudo -S mount_9p hostshareile mount edilir
- Host klasörü konteynere
- NFS paylaşımı da açıklanır
- Host’un
/etc/exportsdosyasına paylaşım dizini kaydedilir - Docker-OSX konteyneri
--network hostile başlatılır - macOS terminalinde
mount_nfskullanılır
- Host’un
- Docker disk alanı yetersiz olduğunda
/var/lib/dockerharici sürücüye, blok depolamaya, NFS’ye vb. taşınıp sembolik bağlantı oluşturulabilir- İlgili öğreticilerin yalnızca mevcut Docker imajları ve katmanlarının silinebilmesi riskini kabul ettiğinizde izlenmesi gerektiği belirtilir
iPhone USB ve USB passthrough
- Masaüstü PC’lerde VFIO tabanlı iPhone USB passthrough yöntemi ayrı bir bağlantıyla açıklanır
- Dizüstü bilgisayar, PC vb. sistemlerde usbfluxd kullanan ağ tabanlı USB passthrough kullanılabilir
- Linux’ta iPhone veya iPad USB ile bağlanır
usbmuxd, TCP portu5000üzerinden dışa açılır- macOS guest’inde
usbfluxd -f -r 172.17.0.1:5000biçiminde host’a bağlanılır - Xcode gibi uygulamalar kapatılıp yeniden açıldığında cihazın görüneceği belirtilir
- Genel USB passthrough için QEMU’nun root olarak başlatılması gerektiği belirtilir
lsusb -tile bus ve port kontrol edilir--privileged,/dev/kvm,EXTRA="-device ... usb-host ..."vb. kullanılır- VM çalışırken host sistemi ilgili USB aygıtına erişemez
Headless, VNC, SPICE, uzaktan çalıştırma
- Headless çalıştırma,
docker runiçinde X11 ile ilgili iki satırın kaldırılması yöntemidir/tmp/.X11-unixvolume’unu kaldırmaDISPLAYortam değişkenini kaldırma
- Özel imaj tabanlı headless konteynerlerin CI/CD pipeline’ları için yararlı olduğu belirtilir
- VNC yalnızca yerel kullanım için kullanılabilir, ancak README TLS/HTTPS şifrelemesinin hiç olmadığını açıkça belirtir
- SSH tüneli kullanılıp dış port kapatılırsa güvenli hale geleceği belirtilir
- SPICE de kullanılabilir
remote-viewer spice://localhost:3001ile bağlanılır- Örnekteki
-disable-ticketing, kimlik doğrulamasız VM erişimine izin verdiği için SPICE kılavuzundaki kimlik doğrulama ayarlarına bakılması gerektiği belirtilir
Seri numarası ve iMessage/iCloud araştırması
- iMessage veya iCloud kullanımı için değiştirilmesi gereken değerler olarak şunlar sunulur
SERIALBOARD_SERIALUUIDMAC_ADDRESSROMdeğerinin iki nokta üst üste işaretleri kaldırılmış küçük harfli MAC adresi olduğu açıklanır
- Docker-OSX iki yöntem sunar
GENERATE_UNIQUE=true: Runtime sırasında benzersiz değerler oluştururGENERATE_SPECIFIC=true: Belirtilen değerleri kullanır
./custom/generate-unique-machine-values.sh, seri numarası, MAC adresi, CSV/TSV çıktısı ve boot disk imajı oluşturabilir- macOS içinde seri numarası
ioreg -l | grep IOPlatformSerialNumberile kontrol edilebilir
Performans, çözünürlük ve ağ ayarları
- osx-optimizer kullanılarak konteynerin daha hızlı hale getirilebileceği belirtilir
- GUI giriş ekranını atlama
- Spotlight indekslemeyi devre dışı bırakma
- Ağır giriş ekranı arka planını devre dışı bırakma
- Güncellemeleri devre dışı bırakma
- Çözünürlük
WIDTHveHEIGHTortam değişkenleriyle değiştirilebilirGENERATE_UNIQUE=trueveyaGENERATE_SPECIFIC=trueile birlikte kullanılmalıdır- Yeni boot bölümü oluşturmak için açılış yaklaşık 30 saniye daha uzun sürer
- Hatalı çözünürlük varsayılan olarak
800x600olur
- Ağ adaptörü ortam değişkeniyle değiştirilebilir
- Hızlı internet bağlantısı:
NETWORKING=vmxnet3 - Yavaş internet bağlantısı:
NETWORKING=e1000-82545em
- Hızlı internet bağlantısı:
- Uzaktan kurulumda IPv4 forwarding açılırsa performans iyileşebilir, ancak konteynerde VPN kullanılsa bile host IP’sinin sızabileceği belirtilir
Sorun giderme ve sınırlamalar
- Docker daemon’u çalışmıyorsa
docker: unknown server OS: .hatası oluşabilirsudo dockerdsudo systemctl --start dockerdsudo systemctl --enable --now dockerd
- RAM, fiziksel makineden daha fazla atanamaz
- Varsayılan değer
-e RAM=3 - Fazla atama durumunda
cannot set up guest memory 'pc.ram': Cannot allocate memoryhatası oluşabilir
- Varsayılan değer
- ALSA ile ilgili hatalar konteyner başlatılırken veya boot sırasında görülebilir; boot ve işlevler normalse endişelenmeye gerek olmadığı belirtilir
- TODO içinde aşağıdaki maddeler kalmıştır
- Güvenlik araştırmacıları için belgeler
- GPU hızlandırma
- virt-manager desteği
Lisans ve bildirimler
- Docker-OSX, GPL v3+ ile lisanslanmıştır
- Docker-OSX’in özel mülk yazılım oluşturmaya yönelik bir araç olarak kullanılmasına izin verildiği açıkça belirtilir
- Apple güvenlik araştırmaları ve Apple Bug Bounty Program ile ilgili bildirimler içerir; Hackintosh, OSX-KVM ve Docker-OSX’in hukuki meseleleri hakkında ayrı bir yazıya bağlantı verir
- Projede anılan ürün adları, logolar, markalar ve ticari markaların ilgili sahiplerinin mülkü olduğu; bu marka sahiplerinin depo ile bağlantılı olmadığı veya onu desteklemediği/onaylamadığı belirtilir
1 yorum
Hacker News yorumları
Projeyi gerçekten kullanmak isteyenler için önemli ama neden bu kadar çok Dockerfile benzeri build tarifinin build sırasında internetten rastgele şeyler indirdiğini anlamıyorum
Bu projenin Dockerfile’ı da build anında 2 Git deposu ve 1 script getiriyor
İnternet erişimi kapalı sandbox build sunucusunda başarısız olması bir yana, güvenliği az da olsa önemseyen herkesin kullanmadan önce tüm build tarifini denetlemesi gerekiyor
README, requirements.txt, package.json gibi build tanımlarında yazan bağımlılıkları incelemek artık yetmiyor; son dönemdeki kritik altyapı arızaları ve tedarik zinciri saldırılarının artışı düşünüldüğünde bu çok endişe verici bir gidişat
Sürüm sorunları çıkması, internetin olmaması ya da en kötüsü bağımlılığın artık sunulmaması gibi tatsız sürprizler doğuruyor. Kendi kendine yeten dağıtım varsayılan olmalı
Fedora ve openSUSE genelde dağıtım paketleri ve konteyner imajları dahil olmak üzere, depodaki paketlerle build edilme ya da build sırasında yalnızca açıkça eklenmiş ikilileri kullanma yönünde politikalara sahip
Bu yüzden
dnf/zypper installile kurabiliyorsanız veya üreticinin konteyner registry’sinden çekebiliyorsanız çıktıya güvenebilirsinizEn yeni bleeding edge’e ihtiyacınız varsa internetten rastgele şeyler alma riskini kabul etmeniz gerekir
Rastgele bir açık kaynak geliştiricisinin çevrimdışı hazır, güvenilir build çıktıları üretmesi zor; böyle bir altyapısı da yok. Red Hat veya SUSE gibi şirketlerin var olma nedeni de bu
Milyarlarca dolarlık şirketler, birilerinin tesisat işini yapıp internetteki rastgele çıktıları güvenilir, tekrarlanabilir ve imzalı çıktılara dönüştürmesi; CVE’leri takip edip düzenli güncellemesi için ödeme yapmaya istekli
80’lerde Lego blokları gibi takılıp çıkarılan modüler, yeniden kullanılabilir yazılım bileşenleri hayal edilirdi; o zaman buna CASE deniyordu. Şimdi bu gerçekleşmiş sayılır ama elbette bir bedeli var
Dockerfile içinde clone etmezseniz, build öncesinde “clone ederken
--recursivekullanın veyagit submodule initile diğer depoyu mevcut çalışma dizinine getirin” gibi talimatlar gerekirGPU hızlandırmanın tek olası yolu, PCI passthrough ile desteklenen bir dGPU aktarmak. AMD RX 6xxx ve üstü macOS 14.x’te mümkün, ancak modern Nvidia için şans yok
Intel iGPU Comet Lake’e kadar, bazı Ice Lake modellerine kadar çalışıyor; daha yenileri çalışmıyor
Apple Silicon build’i macOS’un yakın vadede emüle edilmesi zor görünüyor; ARM Darwin’i boot etmeye yönelik az da olsa erken çalışmalar var
Ayrıca AMD’de Intel VT-x olmadığı için AMD host’larda sanallaştırma bozuluyor; ancak eski VirtualBox kullanan tuhaf bir hack ile Docker’ı emülasyon üzerinden bir ölçüde çalıştırmak mümkün
AMD’nin kendi VT-x alternatifi olan AMD-V var, bu yüzden sorunsuz çalışması gerekir. Ancak macOS’u AMD CPU’da boot ettirmede başka engeller var; genelde kext yükleme veya başka hilelerle çözülüyor
Docker ile tüm bir işletim sistemi çalıştırmanın anlamını pek anlayamıyorum. OVA ya da tercih edilen sanallaştırma formatıyla dağıtılabilir. qcow2 ve VM’i başlatmak için bir bash script’i muhtemelen yeterli olur
İlgili yazılar:
Docker-OSX: Run macOS VM in a Docker - https://news.ycombinator.com/item?id=34374710 - Ocak 2023, 110 yorum
macOS in QEMU in Docker - https://news.ycombinator.com/item?id=23419101 - Haziran 2020, 186 yorum
Birkaç ay önce deneme amaçlı kurmuştum ve oldukça iyi çalışmıştı. Ancak iMessage’ın çalışması için uygulamanın donanım ID’sini Apple’a gönderdiğini ve bu projenin sahte değerler kullandığını öğrendim
O noktadan itibaren “bu pek olmayacak gibi” kaydırağına binmiş oldum; sahte değerlerin Apple tarafından işaretlenebileceğini ve bunun sonucunda iCloud ID’sinin potansiyel spammer olarak işaretlenip diğer cihazlara erişimin kısıtlanabileceğini öğrendim
Tek seçenek, muğlak şekilde linklenmiş donanım ID oluşturma script’i ile değerleri sürekli deneyip “çalışan” bir değer bulmak; fakat bunun gerçekten iyi eşleştiğine ve iCloud itibarına zarar vermediğine dair net bir sinyal yok
Bunun dışında gerçekten iyi çalışıyordu ve sıkışık durumlarda çok kullanışlı
Kısa süre sonra eski ama gerçek bir Mac’in Serial’ını kopyalamanın daha kolay olduğunu fark ettim
Ancak bu araç, kişisel bilgisayar gibi kullanmaktan çok, tescilli macOS framework’lerine bağımlı build script’leri gibi işler için daha yararlı görünüyor
Sadece iOS için derleme yapılıp yapılamayacağını denemek istiyorum. Örneğin Unity, React Native gibi şeyler
Derleme 5 kat daha uzun sürse bile özgürlük açısından oldukça güzel olabilir
Godot’nun iOS hedefli derleme yapma biçimi de bu yönde: https://github.com/godotengine/build-containers/blob/main/Do...
Araçların önceden kurulu olduğu bir Docker imajı da var, ancak iOS’u hedeflemek için biraz değişiklik gerekiyor: https://github.com/shepherdjerred/macos-cross-compiler
RStudio’da, şimdiki Posit’te çalışırken Linux host üzerinden x86_64/aarch64 macOS hedefli C/C++/Fortran/Rust çapraz derleme üzerinde çalışmıştım
Posit Package Manager’dan (https://p3m.dev/client/) native kod içeren R paketleri indirirseniz, bunlar bu yöntemle çapraz derlenmiştir :)
Daha önce Sick Codes ile bu ürün yaklaşımı hakkında röportaj yapmıştım: https://www.vice.com/en/article/akdmb8/open-source-app-lets-...
Benzer bir işi Proxmox ev sunucusunda yapan OSX-PROXMOX da var: https://github.com/luchina-gabriel/OSX-PROXMOX
Kişisel olarak HP Z420 Xeon’da ikincisini kullanıyorum; özellikle GPU passthrough eklenince çok kararlı
Ev sunucusunda iCloud senkronizasyonu çalıştırabilsem iyi olurdu. Şu anda iCloud’u ev sunucusuna/NAS’a fiziksel olarak yedeklemenin iyi bir yolu yok ve yalnızca Windows/Apple’da çalışıyor
https://github.com/steilerDev/icloud-photos-sync
https://github.com/icloud-photos-downloader/icloud_photos_do...
Meğer iCloud orijinal fotoğrafları güncellemiyormuş. Anlaşılır bir şey ama yedekleme yaparken bu değişikliklerin de içinde olmasını bekleyen biri için pek işe yaramıyor
rsyncetmekle karşılaştırıldığında neyi farklı yapmayı sağlıyor?MacOS imajlarının yeniden dağıtımına lisans açısından izin verilip verilmediğini merak ediyorum. Yoksa bu proje Docker Hub’da korsan kopyaları açıkça mı dağıtıyor?
Intel desteği çıkarılmış daha yeni MacOS sürümleri gelirse ilerlemenin durup durmayacağını merak ediyorum
Bu container içinde Docker çalıştırıp MacOS içinde MacOS çalıştırabilir miyiz? ;)
“USB passthrough” ifadesinin gerçekte olsa olsa “Ethernet üzerinden USB proxy” olduğu durumlarda kullanılmasından gerçekten nefret ediyorum
Bu passthrough değil. Normal passthrough’da olmayan, hatta gelişmiş passthrough’da bile olmayabilecek birçok dezavantaj getiriyor
Ama o yöntemin de başka sorunları var. Aktarılan donanımı çok olan büyük ölçekli VM test çiftlikleri çalıştırma deneyimime dayanarak söylüyorum
Yine de “Ethernet üzerinden USB proxy” de gerçek passthrough’dur; sadece VirtIO’ya göre daha yüksek gecikmeye sahip bir passthrough’dur