WWDC 2022で、AppleはmacOSでの仮想化サポートの進歩について最新状況を紹介した。Apple仮想化フレームワークを使うと、MacOSやLinuxを実行するためにApple Silicon上で仮想マシンを設定・作成できる。今後リリースされるmacOS Venturaの新機能であるLinux VMでは、GPUを活用でき、そして、Rosettaを使ってx86-64Linuxバイナリを修正せずに実行できる。
この仮想化フレームワークは2年前にmacOS BigSur(別名macOS 11)で、ハイパーバイザーフレームワークの代替として導入された。AppleのエンジニアであるBenjamin Poulin氏が示したように、仮想化フレームワークでは、Swiftを使ってmacOS上でVMを設定・作成するために高レベルのAPIが提供される。実際、次の図に示すように、仮想化フレームワークは、ハイパーバイザーフレームワークの上位レイヤとして実行される。
(画像提供:Apple)
VZVirtualMachineConfiguration
はコアクラスであり、ここで開発者はVMで使用可能なハードウェアを定義できる。そこには、CPUの数、メモリ量、ストレージ量、他のデバイスの数などが含まれる。設定が完了したら、VZVirtualMachineを使って仮想マシンをインスタンス化して実行したり、VZVirtualMachineViewを使ってビューにアタッチしてmacOSウィンドウ内にそれを表示したりできる。
var configuration = VZVirtualMachineConfiguration()
configuration.cpuCount = 4
configuration.memorySize = (4 * 1024 * 1024 * 1024) as UInt64
configuration.storageDevices = [newBlockDevice()]
configuration.pointingDevices = [newPointingDevice()]
let virtualMachine = VZVirtualMachine(configuration: configuration)
try await virtualMachine.start()
let virtualMachineView = VZVirtualMachineView()
virtualMachineView.virtualMachine = virtualMachine
この方法で作成されたVMは、OSをインストールする物理デバイスに相当する。Poulin氏は、イメージからmacOSをインストールして実行するために必要なすべての手順についても詳しく説明している。サポートされているデバイスの中にはGPUがあり、VM内でほぼネイティブのパフォーマンスでMetalを動作させることができる。
前述のように、macOSだけでなくLinuxも仮想化できる。macOS Venturaで、AppleはEFIブートローダーのサポートを追加する。これにより、起動元のVMに接続されている仮想デバイスを検出できる。これにより、Poulin氏が示すように、ISO Linuxイメージをダウンロードして仮想ストレージデバイスに接続し、ブートローダーを作成してOSを起動することができる。これは、自身のハードウェア向けの適切なディストリビューションをダウンロードすれば、Intel CPUとARM CPUの両方で利用できる。
さらに、macOS Venturaでは、仮想化デバイスのVirtioGPU 2Dが使えるようになる。これによりLinuxがホストへのインターフェイスを提供できるようになる。macOSウィンドウ内にmacOS GUIを表示する方法と同じように、macOSウィンドウ内にLinux GUIを表示することができる。
おそらく、macOS Venturaで、最も興味深い新たな仮想化機能は、Rosettaのサポートである。Rosettaによりx86-64Linuxバイナリを修正せずに実行できる。これも、Swiftを使って対象のLinux VM用に簡単に設定できる。一般的な考え方は、macOSからLinuxゲストOSにRosettaディレクトリを共有し、LinuxシェルからRosettaインタープリターを起動することである。
let rosettaDir = try! VZLinuxRosettaDirectoryShare()
let directorySharingDevice = VZVirtioFileSystemDeviceConfiguration(tag: "RosettaShare")
directorySharingService.share = rosettaDirectoryShare
configuration.directorySharingDevice = directorySharingService
LinuxでRosettaインタープリターを起動すると、x86-64 LinuxバイナリはRosettaを使ってARMに自動的に変換される。これはApple SiliconでmacOS上のx86-64バイナリを実行する場合と同じである。
macOS Venturaの新機能として、macOS向けのトラックパッドサポートとVirtioFSサポートもある。VirtioFSは、LinuxゲストVMとファイル共有する目的ですでに使用できたが、macOSゲストとのファイル共有にも使用できるようになった。