世界を動かす技術を、日本語で。

Apple Siliconと仮想マシン:2つのVM制限を突破する (2023)

概要

  • Apple Silicon Macでは、 同時に2台まで のmacOS仮想マシンしか起動できない制限
  • この制限は カーネル(XNU)内部 で実装されている
  • 開発用カーネルコレクション を利用し、VM数制限を 上書き可能
  • カスタムカーネル利用時は OSアップデートが困難 になる点に注意
  • 手順や仕組みの詳細、元に戻す方法、今後の展望をまとめ

Apple Silicon Macの仮想マシン制限の仕組みと突破法

  • Apple Silicon Macでは、 Virtualization.framework 経由でmacOSゲストVMを2台までしか同時起動できない制限
    • エラー例: VZError.Code.virtualMachineLimitExceeded
  • この制限は、 macOSのSLA(ソフトウェアライセンス契約) にも明記
    • 最大2台までの仮想環境運用を許可
  • 制限の実装箇所は XNUカーネル内部 (ユーザ空間ではなくカーネル空間)
  • 関連カーネル関数: hv_vm_ *、変数 hv_apple_isa_vm_quota
    • VM起動・停止時にこの変数を増減
  • 特殊な boot-args(hv_apple_isa_vm_quota=) でVM数制限を上書き可能
    • ただし、リリースカーネルでは AppleInternalチェック があり通常は無効
  • 対策: 開発用カーネル(Development Kernel Collection) を使うことで制限を回避

開発用カーネルコレクションの構築手順

  • Apple DeveloperサイトからKernel Debug Kit(KDK) をダウンロード
    • ホストと同じバージョン・ビルドのKDKが必要
  • KDKインストール後、 カーネルバリアント(例:T6020) を確認
    • uname -v | awk -F '/' '{print $NF}'| awk -F '_' '{print $NF}'
  • kmutil コマンドで開発用カーネルコレクションを生成
    • 例:sudo kmutil create ... --kernel ... --repository ...
    • 生成された VirtualMachine.kc ファイルを保存

開発用カーネルコレクションの起動設定

  • Macを リカバリーモード で起動
  • ターミナル から各種設定を実施
    • System Integrity Protection(SIP)無効化csrutil disable
    • カスタムboot-args許可bputil --disable-boot-args-restriction
    • カーネルコレクション指定kmutil configure-boot --volume ... --custom-boot-object ...
    • boot-args設定nvram ...:boot-args='kcsuffix=development hypervisor=0x1 hv_apple_isa_vm_quota=0xFF'
  • 再起動後、 Terminalで設定確認
    • sysctl kern.osbuildconfig
    • nvram boot-args

仮想マシンの大量起動と実用例

  • UTMParallels など、Virtualization.frameworkを使う仮想化ソフトでVMを複数起動可能
  • M2 Pro MacBook Proで 9台のmacOS VM同時起動 を確認
  • 実用的なテスト環境構築が可能

この機能の登場時期とカーネルの変化

  • macOS Monterey(12) 以降でこのboot-argが追加
  • 最新カーネル(Sonomaなど)でも AppleInternalチェック は健在
  • XNU内部にはまだ多くの隠された機能が存在

カスタムカーネル利用時の注意点・元に戻す方法

  • カスタムカーネル利用中は OSアップデートが非推奨
    • アップデート後にエラーになる場合あり
  • 元に戻すには、 リカバリーモードでBoot Policyをリセット
    • 例:bputil --full-security
    • 再起動で標準カーネルに復帰

今後の展望とまとめ

  • 今後の改善案
    • KC構築・起動自動化ツールの開発
    • カーネル拡張でhv_apple_isa_vm_quota上書き (開発カーネル不要化)
  • Virtualization.frameworkの隠れた機能 を探る楽しみ
  • Apple Silicon VMのさらなる制御やDEP Enrolment回避の研究への意欲
  • macOS仮想化の内部構造理解 とその応用可能性

Hackerたちの意見

これはすごくバカバカしい制限だよね、少なくとも全てのMacに一律に適用するのは。もっとパワフルなMacを買ったら、もっと多くのMacインスタンスを仮想化できるようにしてほしいな。例えば、M5なら2つに制限してもいいけど、M5 Proなら4つ、M5 Maxなら8つとかにしてもいいんじゃない?

なんで制限を設ける必要があるの?ハードウェア自体が自然な限界だし、しきい値に達したら自分から止まるでしょ。

制限はリソースの問題じゃなくて、ほぼ「無制限」に非MacのVMを動かせるからね。たぶん、ビジネス的な決定、つまり低コストのMac VPSプロバイダーを作るのを防ぐためなんじゃないかな。

$100のWindows 11 Proライセンスを買ったけど、制限は1024 VMだね。Hyper-Vは、ハードウェアが対応していれば、Windows 11でホストごとに最大1024の同時VMをサポートしてる。俺の小さなWindows ARMラップトップでは、すぐに4つのVMを動かせるけど、すぐに限界が来ちゃう。

本当に馬鹿げてるよ。先日、このopenclawを試してみようと思ったけど、セキュリティのことが気になってVMを使ってみたら、iCloudとApp Storeが制限されてたんだ。

すごく面白い記事だけど、こんな恣意的な制限があるのは、真剣な開発プラットフォームとしては変だよね。

Appleは過去20年間、真剣な開発プラットフォームだったのかな?多くの開発者がAppleのハードウェアを好むのはプレミアムだからだけど、OSXはずっと「ほぼLinux」だし、iTunesのことを気にする会社に支配されてるから、開発に使う人たちのことはあまり考えてないよね。

これ、lumeでも使えるのかな?今のところ、似たような制限があるみたいだけど。

そうだよ、lumeはAppleのVirtualization.frameworkの薄いラッパーだから、私の理解ではそれでいけるはず。

すごく気になるんだけど、Appleはなんでこんな制限を設けたの?

おそらく、1つのハードウェアシステムを使ってオンラインアイデンティティファームを運営されるのを防ぐためだと思う。

彼らのビジネスモデルは、ハードウェアとソフトウェアをセットで売ることだから。ハードウェアの売上がソフトウェア開発を支えてるんだよ。ハードウェアを買ってない人にはソフトウェアを使わせたくないんだ。

MacOSは、オーナーに対して反する決定が満載だね。彼らは自分たちの利益のために、あなたの体験を完全にコントロールしたいんだ。

M3以降は、Hypervisor.framework/Virtualization.frameworkを使ってネストされたVMを立ち上げられるようになるんだって。それが制限を回避できたら面白いよね。

笑、2つのVMごとに無限のVMリンクリストが作れるね。各macOSが「ゲスト」と「次のホスト」をホストする感じ。試すのがめんどくさいな。誰かやってみる?

HNでMicrosoftやGoogleを嫌ってるのを見るのは面白いけど、アプリを動かすのにAppleの許可が必要な会社を好きになるのはどういうことなんだろうね。自分たちのハードウェアで動かせるVMの数も限られてるのに。

ここでAppleを叩くのに遠慮してるユーザーなんていつからいるの?Appleに対する嫌悪感はたくさんあるよ、その一方で愛もね。

どんな愛?それはクソだと思う。

HNは一人じゃないからね。みんなを嫌うのは全然嬉しいよ。ただ、君の言いたいことはわかる。普通の人に関心を持たせるのは諦めたけど、自分の持ってるコンピュータでLinuxを動かせるだけの頭があるプログラマーが、あえてそうしないのを見るとすごく不安になる。

いつかこのリンクを引退させることができるかもしれないけど、今日はその日じゃないね。: https://en.wiktionary.org/wiki/Goomba_fallacy

特定の会社や技術に対して「嫌悪」や「愛」を持っていると全体のコミュニティを一括りにするような冷笑は避けてほしいな。HNは多様なグローバルコミュニティで、ほとんどのトピックに対する意見は正規分布を形成しているし、ここにいるほとんどの人は、これらのトピックの良い面と悪い面を考慮した微妙な意見を持てるんだ。この「とても面白い」批判は、議論の片側のうるさい声に焦点を当てると簡単に描けるけど、深く議論を読む努力をすれば消えてしまうよ。

確か、sipをオフにして、カスタムカーネルなしでそれを制御するブート引数を設定できるよ。

これ、もし本当なら過小評価されてるコメントだね。

カスタムカーネルをコンパイルして、それがブートしてGUIが動くなんて、マジでクレイジーだよね。

Apple Siliconでカスタムカーネルコレクションを使用する際には、残念な欠点がいくつかある。最大の問題は、スムーズなOSアップデートが利用できなくなることだ。これは逆に幸運かもしれない。

Mykola Grymalyukは、このブログ投稿の2年後にAppleで働き始めたみたいだね。英雄として死ぬか…