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是虚拟硬件配置根对象cpuCount和memorySize设置计算资源storageDevices和pointingDevices添加虚拟设备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
- What’s new in managing Apple devices — 跨平台设备管理增强
- Adopt declarative device management — 声明式设备管理简化方案
- Bring Continuity Camera to your macOS app — 将 iPhone 作为 Mac 应用的外部摄像头
评论
GitHub Issues · utterances