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

Create macOS or Linux virtual machines

观看原视频

Highlight

Virtualization 框架让开发者在 Apple Silicon 上通过 Swift 代码创建和运行 macOS 及 Linux 虚拟机,支持 GPU 加速、文件共享、virtio 图形设备和 Rosetta 2 运行 x86-64 Linux 二进制文件。

核心内容

在 Mac 上测试系统级变化,常见做法是准备多台机器、反复重装系统,或依赖完整虚拟化软件。问题是环境难复制,测试隔离差,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 应用
  • virtualMachine 属性绑定要显示的虚拟机
  • 适合做虚拟机管理器、教学沙盒或测试工具

创建虚拟 Mac

07:43)虚拟 Mac 需要 VZMacPlatformConfiguration。它包含 hardware model、auxiliary storage、machine identifier 三个 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 是虚拟机唯一标识,类似真实 Mac 序列号
  • VZMacOSBootLoader 负责引导 macOS

安装 macOS

09:16)安装流程分三步:获取恢复镜像、生成兼容配置、运行安装器。

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 暴露 GPU 能力给虚拟 Mac
  • 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,安装应用并跑 UI 或兼容性测试。适合需要干净系统状态的发布流程。

  • 把 Linux 工具链嵌进 Mac 开发者应用:用 Virtualization 框架启动 GUI Linux 或命令行 Linux,通过共享目录访问项目文件。用户不必手动配置完整虚拟化环境。

  • 为教学准备可复制实验环境:课程应用可以一键创建同样 CPU、内存、磁盘和 Linux 发行版的虚拟机。学生环境一致,老师更容易排查问题。

  • 运行遗留 x86-64 Linux 工具:科研、EDA、编译工具链有旧二进制时,在 Apple Silicon Linux 虚拟机中用 Rosetta 执行,减少重新编译和替换工具的成本。

关联 Session

评论

GitHub Issues · utterances