😬
[Swift] Virtualization Frameworkを使ったmacOSの仮想マシンの起動
概要
Appleが提供しているVirtualization Frameworkを使って、macOSの仮想マシンを動作させる方法を紹介する。
VMを起動する方法は、ほかに"VirtualMachine"などがあるが、この方法では他のアプリのインストールの必要がなく、Xcodeから簡単に立ちあげることができる。
また、VMのスペックなどはコードから簡単に変更できる。
必要なもの
- Apple siliconのMac
- Xcode 15.0+
- 30分くらいの時間(Network Speedによる)
- 30Gほどのストレージの容量
手順
-
公式ドキュメントから、サンプルプロジェクトをダウンロードする。
-
Xcodeで開く
-
Signing & Capabilitiesから、"Your Team"を変更する。
-
"InstallationTool" Schemeを選択し、実行する。
- macOS imageや実行に必要なファイルをダウンロードするコマンド。
- 30分くらいかかった。(ネットの速さによる)
- Progressが表示される
- これらのファイルが"~/VM.bundle/"にダウンロードされる。容量は30Gくらい。
-
"macOSVirtuakMachineSampleApp"を選択し、実行する。
- 仮想OSを起動するアプリ
- Windowで、仮想OSが起動する。
余談
VMを使用したかった動機
"Advanced Apple Debugging Reverse Engineering"の本を読んでいるときに、"System Integrity Protection(SIP)"を無効にする必要があった。
SIPは、普段は有効になっていて、許可されてないコードの実行を防ぐことでシステムを守ってくれている。
それを無効にすることはリスクがあるので、仮想VMの上で実行したかった。
SIPを立ちあげた仮想OS上で無効にする
- VMを立ちあげるときに、"Recovery Mode"で起動する
- SampleProjectだと、
start
methodに、startUpFromMacOSRecovery = true
optionを渡す。
- SampleProjectだと、
let options = VZMacOSVirtualMachineStartOptions()
options.startUpFromMacOSRecovery = true
virtualMachine.start(options: options,
- 黒い画面に"Machintosh HD"と"Options"が表示されたら、"Options"を選ぶ
- 上タブの"Utilities → Terminal"を選ぶ
- 開いたTerminalで、
$ csrutil disable
を実行する。
- 再起動する。
- Terminalで、
$ csrutil stats
を実行すると、System Integrity Protection status: disabled
を表示される。
Discussion