😬

[Swift] Virtualization Frameworkを使ったmacOSの仮想マシンの起動

2024/09/08に公開

概要

Appleが提供しているVirtualization Frameworkを使って、macOSの仮想マシンを動作させる方法を紹介する。
VMを起動する方法は、ほかに"VirtualMachine"などがあるが、この方法では他のアプリのインストールの必要がなく、Xcodeから簡単に立ちあげることができる。
また、VMのスペックなどはコードから簡単に変更できる。

必要なもの

  • Apple siliconのMac
  • Xcode 15.0+
  • 30分くらいの時間(Network Speedによる)
  • 30Gほどのストレージの容量

手順

  1. 公式ドキュメントから、サンプルプロジェクトをダウンロードする。

  2. Xcodeで開く

  3. Signing & Capabilitiesから、"Your Team"を変更する。

  4. "InstallationTool" Schemeを選択し、実行する。

    • macOS imageや実行に必要なファイルをダウンロードするコマンド。
    • 30分くらいかかった。(ネットの速さによる)
    • Progressが表示される
    • これらのファイルが"~/VM.bundle/"にダウンロードされる。容量は30Gくらい。
  5. "macOSVirtuakMachineSampleApp"を選択し、実行する。

    • 仮想OSを起動するアプリ
    • Windowで、仮想OSが起動する。


余談

VMを使用したかった動機

"Advanced Apple Debugging Reverse Engineering"の本を読んでいるときに、"System Integrity Protection(SIP)"を無効にする必要があった。
SIPは、普段は有効になっていて、許可されてないコードの実行を防ぐことでシステムを守ってくれている。
それを無効にすることはリスクがあるので、仮想VMの上で実行したかった。

https://www.kodeco.com/books/advanced-apple-debugging-reverse-engineering

SIPを立ちあげた仮想OS上で無効にする

  1. VMを立ちあげるときに、"Recovery Mode"で起動する
    • SampleProjectだと、start methodに、startUpFromMacOSRecovery = true optionを渡す。
  let options = VZMacOSVirtualMachineStartOptions()
  options.startUpFromMacOSRecovery = true
  virtualMachine.start(options: options,
  1. 黒い画面に"Machintosh HD"と"Options"が表示されたら、"Options"を選ぶ
  2. 上タブの"Utilities → Terminal"を選ぶ
  3. 開いたTerminalで、$ csrutil disableを実行する。
  4. 再起動する。
  5. Terminalで、$ csrutil statsを実行すると、System Integrity Protection status: disabledを表示される。

References

Discussion