ハイライト
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は仮想ハードウェア設定のルートオブジェクトcpuCountとmemorySizeで計算リソースを設定storageDevicesとpointingDevicesで仮想デバイスを追加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 を使って実行し、再コンパイルやツール置き換えのコストを削減。
関連セッション
- What’s new in managing Apple devices — Apple プラットフォーム全体のデバイス管理の強化
- Adopt declarative device management — 宣言型デバイス管理によるソリューションの簡素化
- Bring Continuity Camera to your macOS app — あらゆる Mac App で iPhone を外部カメラとして使用
コメント
GitHub Issues · utterances