Apple Silicon'da 2 sanal makine sınırını aşma yöntemi (2023)
(khronokernel.com)- Apple Silicon tabanlı macOS, Virtualization.framework ile çalıştırılabilen macOS VM'lerini en fazla 2 adetle sınırlar ve bu sınır macOS lisans sözleşmesindeki bir maddeye dayanır
- Analiz sonucunda bu sınırın XNU çekirdeği içindeki özel
hv_apple_isa_vm_quotadeğişkeni tarafından yönetildiği ve önyükleme argümanlarıyla geçersiz kılınabildiği doğrulandı - System Integrity Protection içindeki
AppleInternalkontrolünü aşmak için geliştirme çekirdeği (Development Kernel) derleyip önyükleme prosedürü kullanıldı - Ayarlardan sonra UTM, Viable, Parallels gibi araçlarda aynı anda en fazla 9 macOS VM çalıştırma başarıyla gerçekleştirildi
- Apple'ın çekirdek içinde VM sınırını geçersiz kılma işlevini bırakmış olması dikkat çekiyor; gelecekte otomasyon araçları veya çekirdek eklentileriyle iyileştirme olasılığı öne sürülüyor
Apple Silicon'da macOS sanal makinesi için 2 adetlik sınırın kaldırılma süreci
- Apple Silicon tabanlı Mac'lerde Virtualization.framework kullanarak macOS sanal makinesi çalıştırırken en fazla yalnızca 2 adet çalıştırılabilen bir sınır bulunuyor
- Bu sınır, macOS yazılım lisans sözleşmesinin (SLA) 2.B.iii maddesi uyarınca konulmuş durumda
- İlgili madde; geliştirme, test, macOS Server kullanımı ve ticari olmayan kişisel kullanım için en fazla 2 macOS örneğinin çalıştırılmasına izin veriyor
- Analiz sonucunda bu sınırın kullanıcı alanında değil, çekirdeğin (XNU) özel bölümünde uygulandığı görüldü
- Intel çekirdeğinde aynı kod bulunmuyor; Apple Silicon çekirdeğindeki
hv_vm_*işlev ailesi sanallaştırma yığınından sorumlu hv_init()başlatma kodundakihv_apple_isa_vm_quotadeğişkeni VM sayısını yönetiyor ve VM oluşturma/silme sırasında artırılıp azaltılıyor- Çekirdekte
hypervisor=vehv_apple_isa_vm_quota=önyükleme argümanları bulunuyor; ikincisi VM sınırını geçersiz kılabiliyor
- Intel çekirdeğinde aynı kod bulunmuyor; Apple Silicon çekirdeğindeki
- Sürüm çekirdeğinde
hypervisorargümanı yerine kısıtlama System Integrity Protection (SIP) içindekiAppleInternalkontrolü ile sağlanıyorCSR_ALLOW_APPLE_INTERNALbayrağı yalnızca etkin olduğundahv_apple_isa_vm_quotaargümanı uygulanıyor- Bunu aşmak için Apple'ın geliştirme çekirdeğini (Development Kernel) önyükleme yöntemi kullanıldı
Geliştirme çekirdeği koleksiyonunu derleme
- Apple Developer sitesinden Kernel Debug Kit (KDK) indirilip kurulmalı
- KDK'nin ana macOS derlemesiyle tam olarak eşleşmesi gerekiyor; eşleşmezse çekirdek ve kext bağlama ile önyükleme hataları oluşabilir
unamekomutuyla çekirdek mimarisi kontrol edildikten sonrakmutil createkomutu kullanılarak geliştirme çekirdeği koleksiyonu (VirtualMachine.kc) oluşturuluyor- Örnekte macOS 14.0 (derleme 23A5301h) ve T6020 çekirdeği kullanılıyor
--variant-suffix developmentseçeneğiyle geliştirme çekirdeği belirtiliyor ve birden çok sistem uzantısı deposu ekleniyor
Geliştirme çekirdeği için önyükleme ayarları
- Mac kapatıldıktan sonra kurtarma modu (recoveryOS) ile açılıp Terminal'de şu ayarlar yapılıyor
- System Integrity Protection'ı devre dışı bırakma (
csrutil disable) - Önyükleme argümanı kısıtlamasını kaldırma (
bputil --disable-boot-args-restriction) - Özel çekirdek koleksiyonunu belirtme (
kmutil configure-boot) - Önyükleme argümanlarını ayarlama (
nvramkomutuyla iletilir)kcsuffix=development: geliştirme çekirdeğiyle önyüklemehypervisor=0x1: sanallaştırma yığınının özel işlevlerini etkinleştirmehv_apple_isa_vm_quota=0xFF: VM için azami sayıyı 255 olarak ayarlama
- System Integrity Protection'ı devre dışı bırakma (
- Yeniden başlatmanın ardından
sysctl kern.osbuildconfigvenvram boot-argsile uygulanıp uygulanmadığı doğrulanabiliyor
Birden çok VM çalıştırma sonucu
- Kurulum tamamlandıktan sonra UTM, Viable, Parallels gibi Virtualization.framework tabanlı çözümlerle test yapıldı
- M2 Pro MacBook Pro üzerinde aynı anda 9 macOS VM çalıştırma başarısı elde edildi
- Sistem yine de test edilebilir düzeyde çalışmayı sürdürdü
Özelliğin eklendiği dönem ve iç yapı
- macOS 12 Monterey ile birlikte
hv_apple_isa_vm_quotaönyükleme argümanı sanallaştırma yığınıyla beraber eklendi- Sonraki sürümlerde de (macOS Sonoma dahil)
AppleInternalkontrolü hâlâ mevcut - Apple'ın XNU içinde çeşitli özel işlevleri koruduğu doğrulandı
- Sonraki sürümlerde de (macOS Sonoma dahil)
OS güncellemelerinde dikkat edilmesi gerekenler
- Özel çekirdek koleksiyonu kullanıldığında otomatik OS güncelleme özelliği devre dışı kalıyor
- Güncelleme sonrası hata oluştuğundan varsayılan çekirdek koleksiyonuna geri dönmek gerekiyor
- Kurtarma modunda
bputilile yeni önyükleme ilkesi oluşturularak varsayılan çekirdeğe dönülebiliyor - Örnek:
bputil --full-securityveya--disable-boot-args-restrictionseçenekleri kullanılabilir
Sonuç ve gelecekteki iyileştirme fikirleri
- Apple'ın VM sınırını uygulama biçimi doğrulandı ve resmî olmayan da olsa sınırı kaldırma yöntemi deneysel olarak kanıtlandı
- Virtualization ekibi bunu resmen belgelendirmemiş olsa da VM sınırını geçersiz kılma işlevinin çekirdekte bırakılmış olması dikkat çekici
- Gelecekte düşünülen iyileştirmeler
- KC derleme ve önyükleme otomasyon aracı geliştirme
- Ana sisteme göre geliştirme çekirdeği koleksiyonunu otomatik oluşturma ve kurtarma modu ayarlarını destekleme
- Çekirdek eklentisi (kext) ile
hv_apple_isa_vm_quotadeğişkenini geçersiz kılma işlevi geliştirme- Geliştirme çekirdeğiyle önyükleme yapmadan sınırı kaldırma olasılığını araştırma
- KC derleme ve önyükleme otomasyon aracı geliştirme
- Bir sonraki araştırma konusu olarak Apple Silicon VM'lerinde DEP kaydı ve seri numarası geçersiz kılma olasılığı incelenecek
1 yorum
Hacker News görüşleri
Tüm Mac’lere aynı şekilde uygulanan böyle bir sınır çok mantıksız
Daha güçlü bir Mac aldıysan daha fazla macOS örneğini sanallaştırabilmen gerekir
Örneğin M5 için 2, M5 Pro için 4, M5 Max için 8 gibi bir sınır koymak daha makul olurdu
Donanım performansı zaten doğal sınırdır; kullanıcı kendi kendine duracaktır
Ucuz Mac VPS hizmetlerini engellemeye yönelik bir adım olması muhtemel
Hyper‑V, donanım kaldırabildiği sürece aynı anda en fazla 1024 VM çalıştırabiliyor
Benim küçük Windows ARM dizüstü bilgisayarımda bile 4 tanesi sorunsuz çalışıyor
openclaw’ı test etmek için VM çalıştırdım ama iCloud ve App Store erişimi kısıtlı olduğu için afalladım
Mykola Grymalyuk’un bu blog yazısını yazdıktan 2 yıl sonra Apple’a katılmış olması ilginç
İnsanın aklına “ya kahraman olarak ölürsün ya da…” mem’i geliyor
M3 ve sonrasında Hypervisor.framework / Virtualization.framework kullanarak nested VM çalıştırılabiliyor
Bu sınırı aşmaya yarıyorsa epey ilginç olabilir
macOS sadece tek seviye destekliyor; yani bir macOS guest içinde başka bir macOS guest başlatmak mümkün değil
Üşeniyorum ama keşke biri denese
Apple’ın neden böyle bir sınır koyduğunu gerçekten merak ediyorum
Donanım satışları yazılım geliştirmeyi finanse ettiği için, donanımını satın almayan insanların macOS kullanmasını istemiyor
Kullanıcı özgürlüğünden çok Apple’ın kontrolü elinde tutması öncelikli
Özel bir kernel derleyip sistemi açabilmeleri ve hatta GUI’ye kadar getirebilmeleri şaşırtıcı
Yazının kendisi gerçekten çok ilginç ama böyle keyfi kısıtlamaları olan bir platformu geliştirme için kullanmak tuhaf
Birçok geliştirici üst düzey donanımı için kullanıyor ama macOS her zaman “neredeyse Linux olan ama iTunes merkezli bir şirketin kontrol ettiği bir işletim sistemi” gibiydi
Apple Silicon’da özel kernel collection kullanılırsa otomatik OS güncellemelerinin mümkün olmadığı söyleniyor
Ama bu belki de bir gizli nimet olabilir
Bunun lume’da da çalışıp çalışmayacağını merak ediyorum
Şu anda benzer bir sınır var
Bildiğim kadarıyla lume, Apple’ın Virtualization.framework’ünü saran ince bir sarmalayıcı
SIP’yi kapatıp boot argümanlarını ayarlarsan özel kernel olmadan da mümkün olduğunu duymuştum
Apple VM sayısını 2 ile mi sınırladı?
Diğer OS guest’leri ise sınır olmadan çalıştırılabiliyor