WWDC Quick Look 💓 By SwiftGGTeam
Create macOS or Linux virtual machines

Create macOS or Linux virtual machines

元の動画を見る

ハイライト

Virtualization フレームワークにより、開発者は Apple Silicon 上で Swift コードから macOS と Linux の仮想マシンを作成・実行できます。GPU アクセラレーション、ファイル共有、virtio グラフィックスデバイス、Rosetta 2 による x86-64 Linux バイナリの実行にも対応しています。

主要内容

Mac でシステムレベルの変更をテストするには、複数台のマシンを用意したり、OS を何度も再インストールしたり、フル機能の仮想化ソフトに頼ることがよくあります。環境の再現が難しく、テストの分離も弱く、CI や教育の場面では全員が同じマシン状態を得るのが困難です。

Apple の Virtualization フレームワークは、仮想マシンの設定を Swift オブジェクトにします。開発者は CPU、メモリ、ストレージ、入力、ディスプレイ、プラットフォーム属性を記述し、VZVirtualMachine を作成して起動します。macOS は Apple Silicon の仮想マシンで動作し、Linux は Apple Silicon と Intel Mac の両方で動作します。

この Session の価値は、「仮想マシンを起動する」ところから「macOS / Linux の完全なシステムをインストールする」までの道筋を示すことです。macOS パートでは仮想 Mac のプラットフォーム属性、リカバリイメージのインストール、GPU アクセラレーション、トラックパッド、ファイル共有を扱います。Linux パートでは ISO インストール、EFI ブート、virtio グラフィックス、Rosetta を扱います。

詳細

設定から仮想マシンを起動する

03:01)仮想マシンの設定は VZVirtualMachineConfiguration から始まります。CPU、メモリ、デバイスを定義します。起動時は設定から VZVirtualMachine を作成し、start() を呼び出します。

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()

キーポイント:

  • VZVirtualMachineConfiguration は仮想ハードウェア設定のルートオブジェクト
  • cpuCountmemorySize で計算リソースを設定
  • storageDevicespointingDevices で仮想デバイスを追加
  • VZVirtualMachine は実行中の仮想マシンインスタンスを表す

04:33)仮想マシンの内容を表示するには VZVirtualMachineView を使います。

let virtualMachineView = VZVirtualMachineView()
virtualMachineView.virtualMachine = virtualMachine

キーポイント:

  • VZVirtualMachineView は通常の NSView と同様に Mac App に配置できる
  • virtualMachine プロパティで表示する仮想マシンをバインド
  • 仮想マシンマネージャー、教育用サンドボックス、テストツールに適している

仮想 Mac を作成する

07:43)仮想 Mac には VZMacPlatformConfiguration が必要です。hardware model、auxiliary storage、machine identifier の3つの Mac 固有属性を含みます。

let platform = VZMacPlatformConfiguration()

let hardwareModel = VZMacHardwareModel(dataRepresentation: savedHardwareModel)
platform.hardwareModel = hardwareModel!

let auxiliaryStorage = VZMacAuxiliaryStorage(contentsOf: auxiliaryStorageURL)
platform.auxiliaryStorage = auxiliaryStorage

let machineIdentifier = VZMacMachineIdentifier(dataRepresentation: savedIdentifier)
platform.machineIdentifier = machineIdentifier!

configuration.platform = platform
configuration.bootLoader = VZMacOSBootLoader()

キーポイント:

  • VZMacHardwareModel は仮想 Mac が実行できる macOS バージョンを決定
  • VZMacAuxiliaryStorage は仮想 Mac の不揮発性ストレージ
  • VZMacMachineIdentifier は仮想マシンの一意識別子。実機のシリアル番号に相当
  • VZMacOSBootLoader が macOS をブート

macOS をインストールする

09:16)インストールは3ステップ:リカバリイメージの取得、互換設定の生成、インストーラーの実行。

let restoreImage = try await VZMacOSRestoreImage.latestSupported
try await download(restoreImage.url)

let requirements = restoreImage.mostFeaturefulSupportedConfiguration
platform.hardwareModel = requirements!.hardwareModel
configuration.cpuCount = requirements!.minimumSupportedCPUCount
configuration.memorySize = requirements!.minimumSupportedMemorySize

let virtualMachine = VZVirtualMachine(configuration: configuration)
let installer = VZMacOSInstaller(virtualMachine: virtualMachine,
                                 restoringFromImageAt: imageURL)
try await installer.install()

キーポイント:

  • latestSupported は現在のシステムがサポートする最新の安定 macOS リカバリイメージを取得
  • mostFeaturefulSupportedConfiguration が互換設定要件を提供
  • 最小 CPU とメモリは開発者の推測ではなくイメージ要件から取得
  • VZMacOSInstaller がリカバリイメージを仮想マシンにインストール

macOS デバイス:GPU、トラックパッド、ファイル共有

10:58)GPU アクセラレーションには VZMacGraphicsDeviceConfiguration を使います。

let graphicsConfiguration = VZMacGraphicsDeviceConfiguration()
graphicsConfiguration.displays = [
    VZMacGraphicsDisplayConfiguration(widthInPixels: 1920,
                                      heightInPixels: 1200,
                                      pixelsPerInch: 80)
]
configuration.graphicsDevices = [graphicsConfiguration]

キーポイント:

  • VZMacGraphicsDeviceConfiguration が仮想 Mac に GPU 機能を公開
  • display configuration で解像度とピクセル密度を定義
  • 仮想マシン内で Metal を実行でき、良好なグラフィックス性能を得られる

12:33)ホストと仮想 Mac 間のファイル共有には virtio ファイルシステムデバイスを使います。

let sharedDirectory = VZSharedDirectory(url: directoryURL, readOnly: false)
let share = VZSingleDirectoryShare(directory: sharedDirectory)

let tag = VZVirtioFileSystemDeviceConfiguration.macOSGuestAutomountTag
let sharingDevice = VZVirtioFileSystemDeviceConfiguration(tag: tag)
sharingDevice.share = share

configuration.directorySharingDevices = [sharingDevice]

キーポイント:

  • VZSharedDirectory でホストディレクトリと読み書き権限を指定
  • VZSingleDirectoryShare で単一ディレクトリを共有
  • macOSGuestAutomountTag で仮想 Mac が共有ディレクトリを自動マウント
  • ホストと仮想マシン間の変更は即座に反映

Linux:EFI、virtio グラフィックス、Rosetta

17:27)Linux は EFI ブートを使います。

let efi = VZEFIBootLoader()
efi.variableStore = VZEFIVariableStore(creatingVariableStoreAt: storeURL,
                                       options: [])
configuration.bootLoader = efi

キーポイント:

  • VZEFIBootLoader は Linux ディストリビューションに適している
  • VZEFIVariableStore が EFI 変数を保存
  • ISO インストールイメージは USB mass storage デバイスでマウント可能

18:24)Linux のグラフィックス出力には virtio GPU を使います。

let virtioGPU = VZVirtioGraphicsDeviceConfiguration()
virtioGPU.scanouts = [
    VZVirtioGraphicsScanoutConfiguration(widthInPixels: 1280, heightInPixels: 720)
]
configuration.graphicsDevices = [virtioGPU]

キーポイント:

  • VZVirtioGraphicsDeviceConfiguration が Linux 用グラフィックスデバイスを提供
  • scanouts で出力解像度を定義
  • フル GUI の Linux ディストリビューションの実行に適している

21:02)Rosetta サポートはディレクトリ共有で Linux に提供されます。

let rosettaDirectoryShare = try! VZLinuxRosettaDirectoryShare()
let directorySharingDevice = VZVirtioFileSystemDeviceConfiguration(tag: "RosettaShare")
directorySharingDevice.share = rosettaDirectoryShare

configuration.directorySharingDevices = [directorySharingDevice]

キーポイント:

  • VZLinuxRosettaDirectoryShare が Rosetta ランタイムを提供
  • Linux で virtiofs をマウント後、binfmt を登録
  • x86-64 Linux バイナリを Apple Silicon の Linux 仮想マシンで実行可能

重要ポイント

  • 分離された macOS 回帰テストマシン:テスト前に毎回固定のリカバリイメージから仮想 Mac を作成し、App をインストールして UI や互換性テストを実行。クリーンなシステム状態が必要なリリースフローに適している。

  • Mac 開発者 App に Linux ツールチェーンを組み込む:Virtualization フレームワークで GUI または CLI の Linux を起動し、共有ディレクトリでプロジェクトファイルにアクセス。ユーザーはフル仮想化環境を手動設定する必要がない。

  • 教育用の再現可能な実験環境:コース App がワンタップで同じ CPU、メモリ、ディスク、Linux ディストリビューションの仮想マシンを作成。学生の環境が統一され、講師のトラブルシュートが容易になる。

  • レガシー x86-64 Linux ツールの実行:研究、EDA、コンパイラツールチェーンに古いバイナリがある場合、Apple Silicon の Linux 仮想マシンで Rosetta を使って実行し、再コンパイルやツール置き換えのコストを削減。

関連セッション

コメント

GitHub Issues · utterances