- macOS berbasis Apple Silicon membatasi maksimal 2 macOS VM yang dapat dijalankan melalui Virtualization.framework, berdasarkan klausul perjanjian lisensi macOS
- Hasil analisis menunjukkan batas ini dikelola oleh variabel privat
hv_apple_isa_vm_quota di dalam kernel XNU, dan dapat dioverride melalui argumen boot
- Untuk melewati pemeriksaan
AppleInternal milik System Integrity Protection, digunakan prosedur membangun dan mem-boot kernel pengembangan (Development Kernel)
- Setelah konfigurasi, berhasil menjalankan hingga 9 macOS VM secara bersamaan di UTM, Viable, Parallels dan lainnya
- Fakta bahwa Apple meninggalkan fitur override batas VM di dalam kernel menjadi poin menarik, dan disebutkan kemungkinan pengembangan alat otomasi atau perbaikan melalui ekstensi kernel di masa depan
Proses menghapus batas 2 mesin virtual macOS di Apple Silicon
- Saat menjalankan mesin virtual macOS dengan Virtualization.framework pada Mac berbasis Apple Silicon, terdapat batas maksimal hanya 2 VM
- Batas ini ditetapkan sesuai klausul 2.B.iii pada perjanjian lisensi perangkat lunak macOS (SLA)
- Klausul tersebut mengizinkan hingga 2 instance macOS hanya untuk pengembangan, pengujian, penggunaan macOS Server, dan penggunaan pribadi nonkomersial
- Hasil analisis menunjukkan bahwa batas ini diimplementasikan bukan di user space, melainkan di area privat kernel (XNU)
- Kernel Intel tidak memiliki kode yang sama, dan keluarga fungsi
hv_vm_* pada kernel Apple Silicon menangani stack virtualisasi
- Variabel
hv_apple_isa_vm_quota dalam kode inisialisasi hv_init() mengelola jumlah VM, dan nilainya bertambah atau berkurang saat VM dibuat atau dihapus
- Kernel memiliki argumen boot
hypervisor= dan hv_apple_isa_vm_quota=, dan yang terakhir dapat mengoverride batas VM
- Pada kernel rilis, penggunaan argumen
hypervisor dibatasi oleh pemeriksaan AppleInternal milik System Integrity Protection (SIP)
- Argumen
hv_apple_isa_vm_quota hanya diterapkan jika flag CSR_ALLOW_APPLE_INTERNAL aktif
- Untuk melewati hal ini, digunakan metode mem-boot kernel pengembangan Apple (Development Kernel)
Membangun kernel collection pengembangan
- Perlu mengunduh dan memasang Kernel Debug Kit (KDK) dari situs Apple Developer
- KDK harus benar-benar cocok dengan build macOS host, karena ketidakcocokan dapat menyebabkan error linking kernel·kext dan kegagalan boot
- Setelah memeriksa arsitektur kernel dengan perintah
uname, gunakan perintah kmutil create untuk membuat kernel collection pengembangan (VirtualMachine.kc)
- Contoh menggunakan macOS 14.0 (build 23A5301h) dan kernel T6020
- Opsi
--variant-suffix development digunakan untuk memilih kernel pengembangan, sambil menyertakan beberapa repositori ekstensi sistem
Konfigurasi boot kernel pengembangan
- Matikan Mac lalu boot ke recoveryOS, kemudian lakukan pengaturan berikut di Terminal
- Nonaktifkan System Integrity Protection (
csrutil disable)
- Hilangkan pembatasan argumen boot (
bputil --disable-boot-args-restriction)
- Tentukan kernel collection kustom (
kmutil configure-boot)
- Setel argumen boot (dikirim lewat perintah
nvram)
kcsuffix=development : boot dengan kernel pengembangan
hypervisor=0x1 : mengaktifkan fungsi khusus pada stack virtualisasi
hv_apple_isa_vm_quota=0xFF : menetapkan jumlah maksimum VM menjadi 255
- Setelah reboot, penerapan konfigurasi dapat dicek dengan
sysctl kern.osbuildconfig dan nvram boot-args
Hasil menjalankan banyak VM
- Setelah konfigurasi selesai, pengujian dilakukan dengan solusi berbasis Virtualization.framework seperti UTM, Viable, dan Parallels
- Pada MacBook Pro M2 Pro, berhasil menjalankan 9 macOS VM secara bersamaan
- Sistem masih tetap dapat digunakan pada tingkat yang layak untuk pengujian
Waktu penambahan fitur dan struktur internal
- Argumen boot
hv_apple_isa_vm_quota ditambahkan bersama stack Virtualization sejak macOS 12 Monterey
- Pada versi setelahnya, termasuk macOS Sonoma, pemeriksaan
AppleInternal masih tetap ada
- Hal ini menunjukkan Apple tetap mempertahankan berbagai fitur nonpublik di dalam XNU
Hal yang perlu diperhatikan saat update OS
- Saat menggunakan kernel collection kustom, fitur update OS otomatis dinonaktifkan
- Karena error dapat terjadi setelah update, kernel collection bawaan harus dipulihkan
- Di recovery mode, membuat kebijakan boot baru dengan
bputil dapat mengembalikan ke kernel default
- Contoh: gunakan opsi
bputil --full-security atau --disable-boot-args-restriction
Penutup dan ide perbaikan ke depan
- Implementasi batas VM oleh Apple berhasil dianalisis, dan cara tidak resmi untuk melepas batas tersebut telah diverifikasi secara eksperimental
- Meski tidak didokumentasikan resmi oleh tim Virtualization, menarik bahwa Apple meninggalkan fitur override batas VM di kernel
- Rencana pengembangan selanjutnya
- Pengembangan alat otomasi build KC dan konfigurasi boot
- Mendukung pembuatan kernel collection pengembangan otomatis per host dan konfigurasi recovery mode
- Implementasi fungsi override variabel
hv_apple_isa_vm_quota melalui ekstensi kernel (kext)
- Menjelajahi kemungkinan melepas batas tanpa harus mem-boot kernel pengembangan
- Sebagai topik riset berikutnya, direncanakan eksplorasi pendaftaran DEP dan kemungkinan override nomor serial pada VM Apple Silicon
1 komentar
Komentar Hacker News
Batasan seperti ini yang berlaku sama pada semua Mac terasa terlalu tidak masuk akal
Jika membeli Mac yang lebih bertenaga, seharusnya bisa memvirtualisasikan lebih banyak instance macOS
Misalnya, membatasi M5 ke 2, M5 Pro ke 4, dan M5 Max ke 8 akan terasa lebih masuk akal
Performa hardware adalah batas alaminya, jadi pengguna akan berhenti sendiri
Kemungkinan besar untuk mencegah layanan VPS Mac murah
Hyper‑V bisa menjalankan hingga 1024 VM sekaligus jika hardwarenya sanggup
Bahkan di laptop Windows ARM kecil saya pun 4 VM bisa berjalan tanpa masalah
Saya menjalankan VM untuk menguji openclaw, lalu terkejut karena akses ke iCloud dan App Store dibatasi
Menarik bahwa Mykola Grymalyuk bergabung dengan Apple 2 tahun setelah menulis posting blog ini
Meme “mati sebagai pahlawan atau…” langsung teringat
Mulai M3 ke atas, nested VM bisa dijalankan memakai Hypervisor.framework / Virtualization.framework
Jika ini bisa dipakai untuk melewati batasan tersebut, hasilnya akan cukup menarik
macOS hanya bisa sampai satu tingkat, jadi tidak mungkin menjalankan guest macOS lain di dalam guest macOS
Saya terlalu malas, tapi semoga ada yang mau mengujinya
Saya benar-benar penasaran kenapa Apple memasang batasan seperti ini
Penjualan hardware mendanai pengembangan software, jadi mereka tidak ingin orang yang tidak membeli hardware tetap memakai macOS
Prioritasnya adalah Apple tetap memegang kendali, bukan kebebasan pengguna
Mengejutkan bahwa kernel kustom bisa dikompilasi, di-boot, dan bahkan menampilkan GUI
Tulisan ini sendiri sangat menarik, tetapi aneh memakai platform dengan batasan sewenang-wenang seperti ini untuk pengembangan
Banyak developer memakainya karena hardwarenya kelas atas, tetapi macOS selalu terasa seperti “hampir Linux, tapi OS yang dikendalikan perusahaan yang berpusat pada iTunes”
Katanya, memakai custom kernel collection di Apple Silicon membuat pembaruan OS otomatis tidak lagi memungkinkan
Tapi justru ini mungkin berkah tersembunyi
Saya penasaran apakah ini juga bisa bekerja di lume
Saat ini ada batasan serupa
Setahu saya, lume adalah wrapper tipis di atas Virtualization.framework milik Apple
Saya pernah dengar kalau mematikan SIP dan mengatur boot argument bisa membuat ini berjalan tanpa custom kernel
Apple membatasi VM hanya 2?
Guest OS lain bisa dijalankan tanpa batas