大多数浏览器和
Developer App 均支持流媒体播放。
-
使用 Virtualization 打造无缝体验
了解 Virtualization 框架的最新更新。我们将向你展示如何配置虚拟机 (VM) 以自动调整显示屏的大小,并指导你保存和恢复正在运行的 VM,此外我们还将探讨在桌面及数据中心运行的 Virtualization App 所具备的存储和性能选项。 想要了解更多有关 Virtualization 框架的信息,请观看 WWDC22 中“创建 macOS 或 Linux 虚拟机”部分。
章节
- 1:38 - Resize displays automatically
- 2:33 - Save and restore virtual machines
- 7:01 - Connect remote storage with Network Block Device
- 10:30 - Meet the NVMe storage device
- 11:48 - Add the Mac keyboard
- 12:01 - Improve Rosetta 2 performance in Linux virtual machines
资源
相关视频
WWDC22
-
下载
♪ ♪
Scott:大家好 我是来自 Virtualization 团队的 Scott Mionis 今天 我们将介绍 macOS Sonoma 中的功能 是如何帮助你使用 Virtualization 创造无缝体验的 使用 Virtualization 框架 你可以配置、 管理并运行虚拟机 在 macOS Sonoma 中 虚拟 Mac 和 Linux 虚拟机 展现出前所未有的能力 它们不仅使用简便 并且还具备高度自定义的 全新配置选项 而正是由于功能数量众多 macOS Sonoma 才表现出出色的能力 在本次讲座中 我们将深入探讨几个关键项目 以及你在 App 中 应用该项目的方法 首先是虚拟机的新工作流程 以及针对用户体验做出的改进 接着 我们会探讨新的存储 以及键盘配置选项 最后 我们会了解一下 Rosetta 2 是如何在 Linux 虚拟机中 提升 x86_64 App 运行速度的 我们先深入了解一些 使用虚拟机的新方法 我们将介绍两种强大的全新功能 第一个是 可调整大小的显示屏 这是虚拟机中一个新的显示选项 它可以在运行时调整显示屏的大小 从而填充窗口 第二个是 保存和恢复虚拟机 这是一种将正在运行的虚拟机序列化 到磁盘的机制 并且可以在稍后恢复运行 首先 我们从可调整大小的显示屏开始 在使用虚拟 Mac 过程中 屏幕尺寸是其中极为重要的一部分 借助可调整大小的显示屏 虚拟机便可以动态调整屏幕分辨率 以填充窗口 从而实现空间的高效利用 接下来 我们将这个过程转化为代码
为了在你的 App 中 使用可调整大小的显示屏 首先 初始化一个 VZVirtualMachineView
为了让显示屏可以调整大小 将新的 “automaticallyReconfiguresDisplay” 属性设置为 true 这样就可以了 现在 VZVirtualMachineView 的 大小一旦经过调整 该信息便会自动告知虚拟机 需要调整显示屏大小 如果你希望显示屏保持固定大小 将该属性保留为默认值即可 接下来 我们来谈谈 虚拟机的保存和恢复 停止虚拟机意味着关闭 VM 电源 启动虚拟机则意味着进行冷启动 在你使用 Mac 期间 大多数 App 都会在你工作时 保存进度 虚拟机在这点上也是如此
假如我正在运行虚拟机 并希望在不丢失进度的情况下 关闭它 那么我便可以将虚拟机保存到文件中 稍后再恢复运行 或者 假如我想备份我的工作 那么我便可以随时保存虚拟机 并确保磁盘和辅助存储之类的 外部资源得到克隆 或者 如果我想回到过去 那么我便可以将虚拟机 回滚到先前状态 该功能可以实现许多效果 现在 我们来实际应用一下 我正在运行 macOS Sonoma 在桌面上是一个虚拟 Mac 运用 Virtualization Sample App 该虚拟 Mac 也在运行 macOS Sonoma 我正在为下次 Apple Store 商店兴奋之旅做一些调研 我打开了 Apple 地图 并在 Apple 网站中进行了浏览 试图获取更多有关 AirPods 的信息 现在 我希望在不关闭虚拟机的 情况下休息一会儿 于是我在退出 App 的时候 对虚拟机进行了保存
接着 我再重新启动该 App 可以看到 虚拟机不仅从中断处恢复了运行 同时还打开了所有的标签页 接着 我们来谈谈如何将该功能 构建到你的 App 中
在保存虚拟机前 暂停虚拟机 这样可以使虚拟机进入稳定状态 并将执行挂起 接着调用新的 saveMachineState API 以将包含虚拟机所有运行状态的文件 写入你指定的 URL 中 这些便是你稍后恢复运行 所需的全部内容 并且 磁盘映像等外部资源 应当单独进行复制 现在我们已经保存了虚拟机 接下来我们来进行恢复
为了恢复虚拟机的状态 首先 根据相同的配置 创建一个新的 VZVirtualMachine
但是 请不要直接启动虚拟机 因为这样会冷启动虚拟机 直接调用新的 restoreMachineState API 并传入此前保存文件的 URL 现在 虚拟机就和之前的状态 完全一样了
你可以从中断处继续运行了 如果需要从此前保存中恢复虚拟机 请牢记以下几点 首先 由于保存文件包含虚拟机的数据 因此需要对该文件进行保护 通过对这些文件使用硬件加密 可以为其提供最有力的保护 这样其他任何 Mac 或用户账户都 无法读取其他人的保存文件 也无法恢复他人的虚拟机 并且 如今保存的文件 都经过了版本化 从而未来可在其中增加新的功能 如果文件格式发生了变化 那么保存文件将无法得到恢复 该框架将会返回特定的错误代码 以便你的 App 可以进行处理 如果发生了这种情况 丢弃该文件 重新启动虚拟机 那么你又可以正常使用了 接下来 我们来了解一些 构建虚拟机的新方法 第一种是网络块设备 该方法通过网络将存储设备 连接到虚拟机上 第二种是支持 NVMe 控制器设备 一种 virtio 块设备的替代方案 最后一种是 Mac 键盘 该方法通过将类似 Globe 键的 Apple-specific 键 直接映射到虚拟机中 从而使虚拟 Mac 的使用更加直观 我们先从网络块设备开始 在 Virtualization 框架中 存储通常由本地提供 即在同一个 Mac 上 读取和写入磁盘映像 但是在 macOS Sonoma 中 Virtualization 框架可以 从服务器上提供远程存储服务 而允许这种操作的协议 便是网络块设备 或称为 NBD 我们来深入了解一下 其工作原理是什么 Virtualization 框架实现了 NBD 协议的客户端 当虚拟机访问磁盘时 请求会转发到符合同一规范的 NBD 服务器中 在完成必需的 I/O 操作后 NBD 服务器 便会使用数据进行响应 出于两个原因 这个过程十分灵活 首先 存储可以驻留在任何地方 例如同一个 Mac 中 或是网络上的远程服务器中 其次 由于存储由你的服务器管理 因此 你可以实现任何所需的 自定义 I/O 操作 无论是自定义图像格式 还是物理驱动器 对于虚拟机来说 所有这些操作都是完全透明的 接着我们来看看如何进行该设置 在 Virtualization 框架 API 中 初始化存储设备包含两个部分
首先 你需要选择设备类型 该类型会定义呈现给虚拟机的接口 接着 你需要选择附件 该附件则决定了数据在 Mac 上的 实际表达方式 在虚拟机中 你可以进行混合搭配 Virtualization 框架支持的 虚拟设备 包括 virtio 块设备 以及 USB 大容量存储设备 无论使用其中哪种设备 你都可以使用附件 例如磁盘映像附件 在磁盘映像上读取和写入数据 而新的网络块设备附件 则可以在 NBD 服务器上 读取和写入数据 让我们在代码中 设置该 NBD 附件 为了将该附件应用至 App 中 首先指定一个指向 NBD 服务器的 URL 该特定 URL 可以识别出 特定服务器上的特定磁盘 接着 利用该 URL 初始化一个新的 NBD 存储附件 最后 使用该附件初始化一个存储设备 本示例 所使用的是 virtio 块设备 对于大多数用例而言 该设备可能是实现最佳性能的选项 由于存储是通过网络提供的 因此连接随时都可能丢失 如果该问题真的发生 你可能希望采取措施 暂停虚拟机 或重新建立连接
在这种情况下 你可以附加一个自定义的代理类 该类会在 连接状态发生变化时收到通知 你便可以运行你所需要的任何代码 Virtualization 框架中所增加的 存储选项 是非易失性内存主机 控制器接口规范 即 NVMe NVMe 是一种标准的化技术 并在大量 Linux 内核中得到启用 同时其应用也更加具体 我们首先来谈谈 你可能选择使用它的原因 对于绝大多数用例来说 virtio 块存储所提供的 半虚拟化接口 使用起来十分简单快捷 对于虚拟 Mac 来说 情况确实如此 但一些 Linux 虚拟机 却并不具备 virtio 驱动程序 因为其内核可能并非 针对虚拟环境中的运行进行构建 因此 其内核通常具备的 是 NVMe 控制器设备的驱动程序 在 macOS Sonoma 中 NVMe 控制器设备由 Virtualization 框架模拟 从而得以让更多的操作系统 可以在虚拟机中运行 如果你需要配置 NVMe 构建虚拟机时使用新设备类型即可 但是 NVMe 仅适用于 Linux 虚拟机 当然了 还支持 NBD 此外 借助 Mac 键盘 Apple-specific 键可以由 虚拟 Mac 捕获 这就意味着 你可以使用 Globe 键 实现语言切换等多种功能 甚至还可以在虚拟 Mac 中 实现情感表达 接下来 我们来谈谈 Rosetta 2 Linux 虚拟机 所使用的 Rosetta 2 与 macOS 所使用的技术完全相同 在 macOS Sonoma 中 性能改善意味着 Rosetta 2 可以在虚拟 Linux 环境中 提高运行速度 我们来深入探讨一下 这点是如何实现的
由于 Rosetta 2 按需翻译可执行页面 因此 相较于等待并翻译完整 x86_64 App 其能够更快地启动可执行文件 但同时这也意味着 在 App 运行时 Rosetta 2 必须定期挂起执行 以翻译新的代码区域 尤其在 App 刚刚开始运行时 这种开销尤为明显 因为在刚刚开始运行时 所有的代码都需要经过翻译 并且当我启动另一个 链接到相同库 或运行相同可执行文件的 App 时 即便代码已经得到了翻译 Rosetta 2 还是必须再次进行翻译 该问题可以借助缓存来解决 每当一个库 或者可执行二进制文件被翻译时 Rosetta 2 便会将结果 保存在磁盘的缓存中 并与其他所有需要翻译的 App 进行共享 从而避免不必要的重新翻译开销 在 macOS Sonoma 中 Virtualization 框架 借助新的运行时守护进程 将该优化 引入到 Linux 虚拟机中 设置该功能共需要两个步骤 首先 有一个新的 API 用于 配置 Rosetta 2 运行时 和新缓存守护进程之间的通信通道 接着 在虚拟机中启用守护进程 这样 Rosetta 2 运行时和新守护进程 便可以在虚拟机中并行运行了 以上两个程序与 Virtualization 框架 通信并建立起连接 动态链接器请求等内容 会转发到管理缓存的 守护进程中 接着 Rosetta 2 运行时 便可直接从守护进程中 获取预翻译的二进制文件 从而消除了重新翻译开销 尤其是在编译及软件包安装这类 执行繁重的任务中 你可以最大程度上感受到该种效果 Virtualization 框架为你的 App 带来了许多功能强大的选项 我们来谈谈其中一些入门方案 你可以考虑为虚拟 Mac 和 Linux 虚拟机 使用可调整大小的显示屏 仅需一行代码 便可显著改善你的用户体验 经过专门设计的 Mac 键盘 可与最新版的 虚拟 Mac 无缝配合使用 使用该设备配置虚拟 Mac 你便可以轻松提高用户体验 构建块也是其中部分功能 利用该功能 你也可以构建强大的体验 保存虚拟机便是其中一例 此外 你还可以研究如何将回滚及保存进度 融入到你的 App 中 最后 由于 NBD 展现出了强大的灵活性 你也可以使用 NBD 在需要自定义 I/O 的 App 中 探索无限可能 这些仅仅是虚拟机在 macOS Sonoma 中 所具备的基础功能 感谢你的观看 Virtualization 团队期待看到你的成果 ♪ ♪
-
-
1:58 - Set display as resizable
// virtualMachine is a VZVirtualMachine. let virtualMachineView = VZVirtualMachineView() virtualMachineView.virtualMachine = virtualMachine virtualMachineView.automaticallyReconfiguresDisplay = true
-
4:20 - Save a virtual machine
// virtualMachine is a running VZVirtualMachine. try await virtualMachine.pause() let saveFileURL = URL(filePath: "SaveFile.vzvmsave", directoryHint: .notDirectory) try await virtualMachine.saveMachineStateTo(url: saveFileURL)
-
4:58 - Restore a virtual machine
let configuration = VZVirtualMachineConfiguration() // Customize configuration. let virtualMachine = VZVirtualMachine(configuration: configuration) let saveFileURL = URL(filePath: "SaveFile.vzvmsave", directoryHint: .notDirectory) try await virtualMachine.restoreMachineStateFrom(url: saveFileURL) try await virtualMachine.resume()
-
9:28 - Configure a Virtio block device with the NBD attachment
let url = URL(string: "nbd://localhost:10809/myDisk")! let attachment = try VZNetworkBlockDeviceStorageDeviceAttachment(url: url) let blockDevice = VZVirtioBlockDeviceConfiguration(attachment: attachment)
-
10:02 - Respond to events with a delegate with the NBD attachment
let url = URL(string: "nbd://localhost:10809/myDisk")! let attachment = try VZNetworkBlockDeviceStorageDeviceAttachment(url: url) // NetworkBlockDeviceAttachmentDelegate implements the delegate protocol. let delegate = NetworkBlockDeviceAttachmentDelegate() attachment.delegate = delegate let blockDevice = VZVirtioBlockDeviceConfiguration(attachment: attachment)
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。