跳至主要内容

MacOS 上的 Podman 故障排除

无法为 MacOS 上的 Podman 设置自定义二进制文件路径

问题

设置自定义二进制文件路径(在首选项 -> 自定义二进制文件路径下)时,Podman 无法找到 `gvproxy` 和 `podman-mac-helper`

Error: unable to start host networking: "could not find \"gvproxy\" in one of [/usr/local/opt/podman/libexec /opt/homebrew/bin /opt/homebrew/opt/podman/libexec /usr/local/bin /usr/local/libexec/podman /usr/local/lib/podman /usr/libexec/podman /usr/lib/podman $BINDIR/../libexec/podman].  To resolve this error, set the helper_binaries_dir key in the `[engine]` section of containers.conf to the directory containing your helper binaries."

解决方案

  1. gvisor-tap-vsock 发布页面 下载 `gvproxy`。
  2. Podman GitHub 页面 上的源代码构建 `podman-mac-helper`。
  3. 将 `helpers_binaries_dir` 条目添加到 `~/.config/containers/conf`
[containers]

helper_binaries_dir=["/Users/user/example_directory"]

注意:预构建的二进制文件将添加到 Podman 发布页面,因此您无需构建 `podman-mac-helper`。一个 问题已为此开放

无法找到 Podman 引擎

问题

尽管已安装 Podman 引擎,您可能会收到以下错误 - `Error: No such keg: /usr/local/Cellar/podman` 或任何类似的错误,表明 Podman 引擎不存在。

解释

Podman 安装程序和 Homebrew 使用不同的位置在文件系统中存储 Podman 引擎文件。例如,Podman 安装程序将 Podman 引擎安装在路径 ` /opt/podman` 中,而 Homebrew 在 macOS Intel 中使用路径 ` /usr/local`,在 Apple Silicon 中使用路径 ` /opt/homebrew`,在 Linux 中使用路径 ` /home/linuxbrew/.linuxbrew`。

解决方案

要检查您的 Podman 引擎到底安装在哪里,请运行以下命令 -

which podman

这将返回 Podman 引擎安装的路径。这将有助于确定下一步的操作。

例如,如果您想从系统中完全卸载 Podman 引擎以进行全新安装,则运行 `which podman` 将返回 Podman 仍然存在的路径。这可能是 Podman 安装程序存储 Podman 引擎的路径,例如 ` /opt/podman`。一旦您知道路径,请运行

sudo rm -rf /opt/podman

或者

sudo rm -rf path-where-podman-exists

在这里,您需要将 `path-where-podman-exists` 替换为 `which podman` 的输出。

您现在可以继续进行 Podman 桌面的全新安装

Apple Silicon 上的 Podman 机器

问题

如果您使用的是 Apple Silicon 和 brew,从 Podman 桌面启动 Podman 时,您可能会遇到以下错误

Error: qemu exited unexpectedly with exit code 1, stderr: qemu-system-x86_64: invalid accelerator hvf
qemu-system-x86_64: falling back to tcg
qemu-system-x86_64: unable to find CPU model 'host'

解释

Podman 机器作为 `x86_64` 进程运行,这可能是由于 Homebrew 的双重安装:一个用于 `x86_64`,另一个用于 `arm64`。

解决方案

您可以

  1. 在您的 `x86_64` brew 安装(例如,从 Rosetta 下运行的终端)中卸载 Podman 机器 `brew uninstall podman`
  2. 或卸载 brew `x86_64`,因为大多数 brew 食谱现在都有 arm64 支持:请按照 这些说明 从 Rosetta 下运行的终端进行操作

然后,在原生模式(默认)下运行一个终端,并安装 Podman 机器 `brew install podman`

最后,清理之前创建的 Podman 机器 VM,并创建新的 VM。

$ podman machine rm podman-machine-default
$ podman machine init

从此以后,您应该成为一个快乐的用户。

从失败的启动中恢复

启动失败后,Podman 机器可能无法启动,因为 QEMU 进程仍在运行,并且 PID 文件正在使用中。

解决方法

  1. 杀死剩余的 QEMU 进程并停止 Podman 机器

    $ ps -edf | grep qemu-system | grep -v grep | awk '{print $2}' | xargs -I{} kill -9 {}; podman machine stop
  2. 启动 Podman 机器。

解决方案

使用 Podman 4.6.1 或更高版本。

Podman 机器无法使用 brew 中的 QEMU 8.1.0 启动

当您使用 brew 安装了 Podman 和 QEMU,并且 QEMU 版本为 8.1.0 时,Podman 机器可能无法启动,并出现以下错误:`Error: qemu exited unexpectedly with exit code -1, stderr: qemu-system-x86_64: Error: HV_DENIED`

解决方案

解决方法

保留您的基于 brew 的安装,并应用以下解决方法之一

  • 将 brew 包中的 QEMU 回滚到 v8.0.3。

    $ brew uninstall qemu
    $ curl -OSL https://raw.githubusercontent.com/Homebrew/homebrew-core/dc0669eca9479e9eeb495397ba3a7480aaa45c2e/Formula/qemu.rb
    $ brew install ./qemu.rb
  • 或者,在本地对 brew 二进制文件进行签名

    $ cat >entitlements.xml <<EOF
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>com.apple.security.hypervisor</key>
    <true/>
    </dict>
    </plist>
    EOF
    $ codesign --sign - --entitlements entitlements.xml --force /usr/local/bin/qemu-system-$(uname -m | sed -e s/arm64/aarch64/)

其他资源

在 Apple Silicon 上,Podman 机器无法启动

在 Apple Silicon 上,当 Podman 机器启动时,它会一直处于阻塞状态,并显示“正在等待 VM”消息。

解决方案

对于 M1 和 M2 处理器

  • 更新到 Podman 4.9。

解决方法

对于 M3 处理器

  1. 要获得干净的环境,请删除所有 Podman 和 qemu 构件

    1. 删除 Podman/Podman 桌面安装程序中的任何安装

      $ sudo rm -rf opt/podman
    2. 删除 brew 安装

      $ brew uninstall podman-desktop
      $ brew uninstall podman
      $ brew uninstall qemu
    3. 删除 Podman 文件

      $ rm -rf ~/.ssh/podman-machine-default
      $ rm -rf ~/.ssh/podman-machine-default.pub
      $ rm -rf ~/.local/share/containers
      $ rm -rf ~/.config/containers
  2. 使用 brew 重新安装 Podman

    $ brew install podman
  3. 安装 bunzip2

    $ brew install bzip2
  4. 将 QEMU 8.2.0 安装到 ` /opt/homebrew/Cellar/qemu/8.2.0`

    $ curl -sL https://github.com/AkihiroSuda/qemu/raw/704f7cad5105246822686f65765ab92045f71a3b/pc-bios/edk2-aarch64-code.fd.bz2 | bunzip2 > /opt/homebrew/Cellar/qemu/8.2.0/share/qemu/edk2-aarch64-code.fd
  5. 安装修补的 EDK2。从 EDK2 下载,该文件位于 lima-vm/edk2-patched.tmp/releases

  6. 初始化 Podman 机器。

  7. 找到 QEMU 配置目录以在下一步中定义 `qemu-config-directory`

    $ podman machine info | grep MachineConfigDir

  8. 更新 Podman 机器配置 json

    $ sed -i 's@file=.\*edk2-aarch64-code.fd@file=/path/to/downloaded/edk2-aarch64-code.fd@g' qemu-config-directory/podman-machine-default.json
  9. 启动 Podman 机器。

其他资源