macOS 12 “Monterey” 以降、Apple は Apple シリコンおよび Intel ベースの Mac で仮想マシン(VM)を作成・管理するための高水準 API、Virtualization framework を提供しています。Intel Mac では、より高度で機能豊富なサードパーティ製ハイパーバイザがあるため、これを使う必要はありません。しかし Apple シリコン搭載 Mac では、執筆時点で macOS を仮想化する唯一の手段のようです。
ただし、現時点の Virtualization framework はまだ最小限の機能にとどまり、次のような制約があります。
- macOS Monterey より前のバージョンはサポートされません(Virtualization framework は Monterey で導入されました)。
- macOS Monterey ホストで macOS Ventura の IPSW(復元イメージ)を使ってインストールしようとするとクラッシュします。
- 仮想ハードウェアを完全にはカスタマイズできず、ホストマシンのハードウェアを反映するのみです。
- VM 内で Apple ID にサインインできません。
このような事情から、Apple シリコン上の macOS 向けに商用グレードのサードパーティ製仮想化ソフトウェアがない理由も理解できるでしょう。当時の API は扱いづらすぎました。ただし、これらの制約を除けば非常によく動作し、Intel ベースの環境と比べても驚くほど高速です。
Apple シリコン搭載 MacBook Pro 上で動作する macOS Ventura VM。
事前準備
- Apple シリコン搭載 Mac
- このガイドは Apple のサンプルプロジェクトを基にしているため、Objective-C または Swift の基本知識
- コード署名用の開発者アカウントとして使う Apple ID
- Xcode の基本知識と Xcode 13 以降
- このサンプルプロジェクトのコピー
これでインストールを始められます。
仮想マシンを設定する
サンプルプロジェクトはそのままでも動作しますが、いくつか設定を調整したい場合があります。以降では Swift 版を例にしますが、Objective-C 版もほぼ同様です。
インストール先
ハードコードされたインストール先を変更するには、”Path.swift” を開いてパスを編集します。初期設定ではホームフォルダ内の “VM.bundle” にインストールされます。
CPU コア数
VM に割り当てる CPU コア数を変更するには、”MacOSVirtualMachineConfigurationHelper.swift” の “computeCPUCount()” 関数を探します。
static func computeCPUCount() -> Int {
let totalAvailableCPUs = ProcessInfo.processInfo.processorCount
var virtualCPUCount = totalAvailableCPUs <= 1 ? 1 : totalAvailableCPUs - 1
virtualCPUCount = max(virtualCPUCount, VZVirtualMachineConfiguration.minimumAllowedCPUCount)
virtualCPUCount = min(virtualCPUCount, VZVirtualMachineConfiguration.maximumAllowedCPUCount)
return virtualCPUCount
}
初期設定では、利用可能な総コア数から 1 を引いた値が使われます。.maximumAllowedCPUCount で最適な値を動的に計算することもできます。
メモリ
VM に割り当てるメモリを変更するには、”MacOSVirtualMachineConfigurationHelper.swift” の “computeMemorySize()” 関数を探します。
static func computeMemorySize() -> UInt64 {
// We arbitrarily choose 4GB.
var memorySize = (4 * 1024 * 1024 * 1024) as UInt64
memorySize = max(memorySize, VZVirtualMachineConfiguration.minimumAllowedMemorySize)
memorySize = min(memorySize, VZVirtualMachineConfiguration.maximumAllowedMemorySize)
return memorySize
}
初期値は 4 GB です。メモリ容量を固定せず、.maximumAllowedMemorySize で最適なサイズを動的に計算することもできます。
画面解像度と PPI
Virtualization framework はまだ動的な解像度変更をサポートしていません。画面解像度と PPI を変更するには、”MacOSVirtualMachineConfigurationHelper.swift” の “createGraphicsDeviceConfiguration()” 関数を探します。
static func createGraphicsDeviceConfiguration() -> VZMacGraphicsDeviceConfiguration {
let graphicsConfiguration = VZMacGraphicsDeviceConfiguration()
graphicsConfiguration.displays = [
// We abitrarily choose the resolution of the display to be 1920 x 1200.
VZMacGraphicsDisplayConfiguration(widthInPixels: 1920, heightInPixels: 1200, pixelsPerInch: 80)
]
return graphicsConfiguration
}
たとえば 14 インチ MacBook Pro の PPI は 284 です。この値を変更すると HiDPI(Retina)モードを有効にできます。
ディスク容量
VM の初期ディスク容量は 64 GB です。変更するには、”MacOSVirtualMachineInstaller.swift” の “createDiskImage()” 関数を探します。
private func createDiskImage() {
let diskFd = open(diskImagePath, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)
if diskFd == -1 {
fatalError("Cannot create disk image.")
}
// 64GB disk space.
var result = ftruncate(diskFd, 64 * 1024 * 1024 * 1024)
if result != 0 {
fatalError("ftruncate() failed.")
}
result = close(diskFd)
if result != 0 {
fatalError("Failed to close the disk image.")
}
}
安定して使用するには、少なくとも 64 GB を割り当ててください。
ほかにも調整できる設定はありますが、重要度は高くありません。
macOS Monterey をインストールする
設定後に “InstallationTool” を実行すると処理が始まります。ホスト Mac で公開されている最新のコピーを取得しようとします。ソースコードを変更して別の IPSW を使わせることもできますが、現時点では Monterey しか利用できないため、そのままで問題ありません。
インストール後、”macOSVirtualMachineSampleApp” を起動します。先ほどインストールした macOS Monterey VM のウィンドウが開くはずです。
macOS Ventura Beta をインストールする
VM にアクセスできたら Safari を開き、こちらから macOS Ventura インストーラ “InstallAssistant.pkg” をダウンロードします。この時点では Apple Developer サイトの “macOS Developer Beta Access Utility” を使うとエラーになり、直接アップグレードできません。
ダウンロードした PKG ファイルをインストールし、Applications フォルダ内の “Install macOS 13 beta.app” を開いて macOS のインストールを始めます。macOS Ventura では System Preferences の UI が大きく変わるため、アップグレード前に必要な設定を済ませておくことを勧めます。
インストールが終わるまで待ちます。これで Apple シリコン搭載 Mac 上で macOS Ventura VM を利用できます。