One
在 Apple Silicon Mac 上運行 macOS Ventura 預覽版虛擬機

本文亦提供以下語言版本: English


從 macOS 12「Monterey」開始,Apple 設計了 Virtualization 虛擬化框架,提供高階 APIs 用以於 Apple Silicon 和 Intel 架構的 Mac 電腦上建立和管理虛擬機。對 Intel 架構的 Mac 而言並沒有實際使用的必要,因為第三方商用虛擬機器監視器(Hypervisor)更加先進且具備更多功能;然而不幸的是,對於 Apple Silicon 架構的 Mac 來說,這是至本文撰寫為止唯一的 macOS 虛擬化方案。

然而,目前的 Virtualization 框架本身相當原始且有諸多限制,包含但不限於下列的項目:

  • 不支援安裝任何早於 macOS Monterey 的系統版本(因為 Virtualization 框架在其後才推出)。
  • 於 macOS Monterey 上嘗試使用 macOS Ventura 的 IPSW(還原映像檔)安裝虛擬機會發生錯誤性崩潰。
  • 無法完整客製化虛擬機硬體,僅能映射實體主機。
  • 虛擬機內無法登入系統 Apple ID。

現在你大概可以理解為何 Apple Silicon 上目前尚無商業化的 macOS 虛擬化解決方案:這些 API 目前在本質上難以實用化。但撇除這些限制,虛擬機運行得相當不錯且相較於 Intel 架構的 Mac 而言速度驚人的快。

macOS VM with Virtualization framework macOS Ventura 虛擬機運行於 Apple Silicon 架構的 MacBook Pro。

事前準備

  • 一台 Apple Silicon 架構的 Mac 電腦。
  • 因為本篇教學建立在 Apple 的範例專案上,你需要具備基礎的程式設計(不論是 Objective-C 亦或是 Swift)能力。
  • 一個 Apple ID 帳號作為開發者帳號,用於程式簽章。
  • Xcode 的基本使用知識,以及 Xcode 13 或更新的版本。
  • 一份官方範例專案

現在我們可以開始安裝啦!

設定虛擬機

雖然官方的範例專案本身可以直接執行,你可能會想要先行調整部分設定參數以便更硬體符合需求。之後的文章內容將會以 Swfit 版本的程式碼作為範例,但 Objective-C 版本差異並不大,可自行推敲。

安裝路徑

欲修改預設的安裝路徑,檢視「Path.swift」並作適當的修改。預設會將虛擬機安裝至使用者目錄下的「VM.bundle」。

處理器核心數

欲修改分配給虛擬機的處理器核心數,請修改「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 來動態產生最佳數值。

記憶體

欲修改分配給虛擬機的記憶體數值,請修改「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
}

預設程式分配 4GB 的記憶體。你也可以用演算的方式搭配 .maximumAllowedMemorySize 來動態產生最佳數值。

顯示器解析度以及點距(PPI)

Virtualization 框架目前尚未支援動態解析度調整。欲修改虛擬機的顯示器解析度以及點距,請修改「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 螢幕點距為 284,請依照你的實際硬體做修改。修改後將啟用高解析度(HiDPI,即 Retina)模式。

磁碟大小

預設的虛擬磁碟大小為 64GB。欲調整分配給虛擬機的磁碟空間,請修改「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.")
    }
}

請至少分配 64GB 的磁碟空間予虛擬機,以確保運行穩定。

當然,還有其他可以做調整的參數,不過並沒有前面提及的這些重要。

安裝 macOS Monterey

一旦完成設定,請執行「InstallationTool」來進行初始化。此工具會嘗試取得目前實體 Mac 主機公開發佈的最新 macOS 版本。你也可以修改原始碼來強制使用其他的 IPSW 檔案,不過由於目前僅有 Monterey 可供下載,我們可以不做更動。

安裝完成後,接著執行「macOSVirtualMachineSampleApp」。程式將於新視窗中啟動剛才安裝好的 macOS 虛擬機。

安裝 macOS Ventura 預覽版

當你可以操作虛擬機時,開啟 Safari 並下載此處的「InstallAssistant.pkg」macOS Ventura 安裝程式。目前透過 Apple 開發者網站取得之「macOS Developer Beta Access Utility」會發生錯誤而無法透過系統更新直接升級至 macOS Ventura 預覽版。

安裝下載完成的 PKG 檔案,接著開啟位於應用程式資料夾中的「Install macOS 13 beta.app」來開始 macOS 安裝。有鑒於 macOS Ventura 大幅度變更了系統偏好設定的介面,這裡建議先在目前的環境下做好所需的系統設定後再進行升級安裝。

接著等待安裝完成。你現在應該有一台能夠在 Apple Silicon 架構的 Mac 上正常操作的 macOS Ventura 虛擬機。