菜单

硬件直通

相关源文件

本文档介绍了 Docker-OSX 的硬件直通功能,该功能允许将宿主机的物理硬件设备暴露给容器内运行的 macOS 虚拟机。有关网络配置信息,请参阅 网络与端口转发,有关无头操作的详细信息,请参阅 无头操作

硬件直通概述

Docker-OSX 支持多种硬件直通方式,以增强功能性和可用性

  1. USB 设备 - 将 USB 设备(尤其是 iPhone/iPad)直通给 macOS,用于开发、测试和同步
  2. 音频设备 - 通过各种音频子系统启用声音输入/输出
  3. GPU - 通过直通有限支持图形加速(实验性)

核心直通机制依赖于 QEMU 的设备模拟能力以及正确的 Docker 设备映射。

来源: Dockerfile31-36 Dockerfile52-53 README.md274-366

USB 设备直通

Docker-OSX 支持两种主要的 USB 设备直通方法,对于连接 iPhone 和 iPad 特别有用

  1. 直接 USB 直通 (VFIO) - 将 USB 设备直接物理映射到虚拟机
  2. 基于网络的 USB 直通 (USBFLUXD) - 通过网络中继 USB 连接,适用于无法进行直接直通的情况

直接 USB 直通

要进行直接 USB 直通,您需要识别 USB 设备并将其传递给 Docker 容器

您还可以传递额外的 QEMU 参数来指定 USB 设备

基于网络的 USB 直通 (USBFLUXD)

对于无法进行直接 USB 直通的情况(例如笔记本电脑或某些宿主机),USBFLUXD 提供了一种基于网络的替代方案

设置 USBFLUXD 需要

  1. 在 Linux 宿主机上

    • 安装 usbmuxd、socat 和 usbfluxd
    • 启动服务并转发 USB 流量
  2. 在 macOS 客户机上

    • 安装 usbfluxd 和依赖项
    • 连接到宿主机的 usbfluxd 服务

来源: README.md274-366

音频直通

Docker-OSX 支持多种音频子系统,ALSA 是默认选项,而 PulseAudio 在许多环境中提供更好的兼容性。

ALSA 音频 (默认)

默认情况下,Docker-OSX 使用 ALSA 进行音频。要启用它

PulseAudio

为了获得更好的音频支持,尤其是在桌面环境中,建议使用 PulseAudio

适用于 Windows 上的 WSL2

禁用音频

如果您不需要音频,可以完全禁用它

音频配置由 QEMU 的 audiodev 参数处理

来源: Dockerfile194-205 README.md887-945

GPU 直通

Docker-OSX 中的 GPU 直通是实验性的,支持有限。它需要特定的硬件和配置。

GPU 直通的要求

  • 可用于直通的独立 GPU
  • CPU 和主板支持 IOMMU
  • 为 PCI 直通正确配置宿主机

基本设置

尝试 GPU 直通

这是高级功能,可能需要根据您的硬件进行额外的特定配置。

硬件直通故障排除

USB 设备未检测到

如果您的 USB 设备在 macOS 中未被检测到

  1. 验证设备是否已正确连接到宿主机
  2. 检查设备 ID 是否已正确传递给 Docker
  3. 如果直接直通不起作用,请尝试使用 USBFLUXD
  4. 确保设备未被宿主机系统占用

音频问题

如果您遇到音频问题

  1. 尝试从 ALSA 切换到 PulseAudio
  2. 检查您的宿主机音频系统是否正常工作
  3. 验证您的用户是否拥有访问音频设备的权限
  4. 如有必要,将您的用户添加到 audio

常见的 ALSA 错误

如果您看到像 "Cannot find card '0'" 或 "Unknown PCM default" 这样的 ALSA 错误

  1. 尝试改用 PulseAudio
  2. 检查 ALSA 在您的宿主机上是否配置正确
  3. 如果您不需要音频,请禁用它

GPU 直通问题

GPU 直通非常复杂,可能并非在所有环境中都有效

  1. 确保您的硬件支持 IOMMU 和虚拟化
  2. 检查您是否已正确将 GPU 与宿主机隔离
  3. 考虑使用 X11 转发作为图形应用程序的替代方案

为了在 Docker-OSX 硬件直通中获得最佳性能

硬件类型建议备注
USBUSB 3.0 端口为设备提供更好的带宽
音频PulseAudio与现代 Linux 发行版的兼容性更好
显卡独立 GPU实际 GPU 直通所需
CPU支持 IOMMU 的 CPU高效直通所需
内存8GB+ RAM更多的宿主机内存允许为虚拟机分配更多内存

来源: README.md274-366 README.md887-945 FAQ.md40-42 FAQ.md145-146