macOS Sonoma 虚拟化:可调整显示、状态保存与网络块设备
Create seamless experiences with Virtualization
2023年6月5日
一句话判断
Virtualization 框架在 macOS Sonoma 中支持运行时调整虚拟机分辨率、保存/恢复虚拟机状态、网络块设备和 NVMe 控制器——虚拟 Mac 终于像原生 App 一样好用了。
这场 Session 讲了什么
Scott 从虚拟化团队出发,介绍了 macOS Sonoma 中 Virtualization 框架的三方面更新:
可调整显示。VZVirtualMachineView 新增 automaticallyReconfiguresDisplay 属性,设为 true 后虚拟机分辨率会随窗口大小动态调整。之前虚拟机屏幕尺寸是固定的,最大化窗口只能看到黑边。
保存和恢复虚拟机状态。saveMachineState API 将运行中的虚拟机序列化到文件。恢复时用 restoreMachineState 从文件还原。保存文件是硬件加密的——其他 Mac 或用户账号无法读取。可以用来暂停工作稍后继续、创建备份快照、或回滚到之前的状态。
存储和输入配置。网络块设备(NBD)允许虚拟机的存储设备挂载到远程服务器,支持自定义 I/O(特殊镜像格式、物理驱动器)。NVMe 控制器作为 virtio block device 的替代方案。Mac 键盘映射将 Globe 键等 Apple 特殊按键直接传递给虚拟 Mac。
值得深挖的点
保存文件的加密和版本管理。保存文件使用硬件加密,安全性很高。但文件格式有版本号,未来的 macOS 更新可能改变格式。如果保存文件无法恢复,框架会返回特定错误码,你的 App 需要处理这种情况——丢弃文件、冷启动虚拟机。
NBD 的灵活性。存储不再局限于本地磁盘镜像。你可以实现自定义的 NBD 服务器来支持特殊需求(如加密镜像、去重存储),对虚拟机完全透明。
Rosetta 2 在 Linux 虚拟机中的性能提升。x86_64 应用在 ARM 架构的 Linux 虚拟机中通过 Rosetta 2 运行,今年有性能优化。
代码片段
// 可调整显示
let vmView = VZVirtualMachineView()
vmView.automaticallyReconfiguresDisplay = true // 窗口大小变化时自动调整分辨率
// 保存虚拟机状态
func saveVM(_ virtualMachine: VZVirtualMachine) async throws {
// 先暂停虚拟机,确保稳定状态
try await virtualMachine.pause()
// 保存状态到文件
let saveURL = URL(fileURLWithPath: "/path/to/save.vmstate")
try await virtualMachine.saveMachineState(to: saveURL)
// 外部资源(磁盘镜像等)需要单独复制
}
// 恢复虚拟机状态
func restoreVM() async throws {
let config = VZVirtualMachineConfiguration(/* ... */)
let virtualMachine = VZVirtualMachine(configuration: config)
let saveURL = URL(fileURLWithPath: "/path/to/save.vmstate")
try await virtualMachine.restoreMachineState(from: saveURL)
// 虚拟机恢复到保存时的状态,可以继续运行
try await virtualMachine.resume()
}
// 网络块设备(NBD)配置
let nbdURL = URL(string: "nbd://server.example.com:10809/disk1")!
let nbdAttachment = try VZNetworkBlockDeviceStorageDeviceAttachment(
url: nbdURL,
timeout: 30,
isForcedReadOnly: false,
synchronizationMode: .full
)
let storageDevice = VZVirtioBlockDeviceConfiguration(attachment: nbdAttachment)
// 监控连接状态变化
class NBDDelegate: NSObject, VZNetworkBlockDeviceStorageDeviceAttachmentDelegate {
func attachmentWasDisconnected(_ attachment: VZNetworkBlockDeviceStorageDeviceAttachment) {
// 处理断开:暂停虚拟机或重新连接
}
}
最佳实践
- 可调整显示应该默认开启,让虚拟机充分利用窗口空间。
- 保存状态前先暂停虚拟机,确保状态一致性。
- 处理保存文件格式不兼容的错误——丢弃文件并冷启动。
- NBD 连接可能随时断开,通过 delegate 监控并做好恢复准备。
- Mac 键盘映射让虚拟 Mac 的使用体验更接近原生。
还有什么值得关注
- NVMe 控制器适合需要标准存储接口的 Linux 发行版
- Rosetta 2 在 Linux 虚拟机中的 x86_64 兼容性今年有提升
- 保存/恢复功能让虚拟机的使用方式更像普通 Mac App