跳转到主内容

在 macOS 上对 Podman 进行故障排除

无法在 macOS 上为 Podman 设置自定义二进制路径

问题

当设置自定义二进制路径(在“首选项”->“自定义二进制路径”下)时,Podman 无法找到 gvproxypodman-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/containers.conf
[containers]

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

注意:预构建的二进制文件将被添加到 Podman 发布页面,因此您无需构建 podman-mac-helper。关于此问题,已有一个问题被提出

无法找到 Podman Engine

问题

即使已安装 Podman Engine,您仍可能收到如下错误 - Error: No such keg: /usr/local/Cellar/podman 或任何类似的错误,表示 Podman Engine 不存在。

解释

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

解决方案

要检查您的 Podman Engine 确切安装在哪里,请运行命令 -

which podman

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

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

sudo rm -rf /opt/podman

sudo rm -rf path-where-podman-exists

在这里,您将用 which podman 的输出替换 path-where-podman-exists

您现在可以进行 Podman Desktop 的全新安装

Apple Silicon 上的 Podman machine

问题

如果您正在使用 Apple Silicon 和 brew,在从 Podman Desktop 启动 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 machine 正在作为 x86_64 进程运行,这可能是由于 Homebrew 的双重安装:一个用于 x86_64,一个用于 arm64

解决方案

您可以

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

然后以原生模式(默认)运行终端并安装 Podman machine brew install podman

最后清理之前创建的 Podman machine 虚拟机,并创建新的虚拟机。

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

从这里开始,您应该会很高兴。

从启动失败中恢复

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

权宜之计

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

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

解决方案

使用 Podman 4.6.1 或更高版本。

Podman machine 无法与 brew 中的 QEMU 8.1.0 一起启动

当您使用 brew 安装 Podman 和 QEMU,并且 QEMU 版本为 8.1.0 时,Podman machine 可能会启动失败并出现类似以下错误:Error: qemu exited unexpectedly with exit code -1, stderr: qemu-system-x86_64: Error: HV_DENIED

解决方案

解决方法

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

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

    $ brew uninstall qemu
    $ curl -OSL https://raw.githubusercontent.com/Homebrew/homebrew-core/dc0669eca9479e9eeb495397ba3a7480aaa45c2e/Formula/qemu.rb
    $ brew install ./qemu.rb
  • 或者,在本地签署 QEMU 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 Machine 无法启动

在 Apple Silicon 上,当 Podman Machine 启动时,它会无限期地阻塞并显示“等待 VM”消息。

解决方案

对于 M1 和 M2 处理器

  • 更新到 Podman 4.9。

解决方法

对于 M3 处理器

  1. 为了获得一个干净的环境,移除所有 Podman 和 qemu 相关的构件

    1. 移除 Podman/Podman Desktop 安装程序中可能存在的安装

      $ 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。从 lima-vm/edk2-patched.tmp/releases 下载 EDK2

  6. 初始化 Podman machine。

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

    $ podman machine info | grep MachineConfigDir

  8. 更新 Podman machine 配置 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 machine。

附加资源

在没有手动配置的情况下,podman machine CLI 命令不适用于 libkrun 提供程序类型

当您使用 GPU enabled (LibKrun) 提供程序类型创建 Podman machine 时,所有 podman machine CLI 命令都会停止工作。

Podman machine 未列出

$ podman machine list
NAME VM TYPE CREATED LAST UP CPUS MEMORY DISK SIZE

错误:与默认 Podman machine 交互

$ podman machine ssh
Error: vm podman-machine-default not found: podman-machine-default: VM does not exist

解决方法

  • 在每个 podman machine 命令前加上 CONTAINERS_MACHINE_PROVIDER=libkrun。例如,CONTAINERS_MACHINE_PROVIDER=libkrun podman machine ls
  • 手动配置 containers.conf 文件或 CONTAINERS_MACHINE_PROVIDER 环境变量。请参阅使用 libkrun 作为 machine 提供程序

附加资源

macOS 上磁盘空间不足

在 macOS 上,.plist 文件会将 Podman Desktop 数据附加到之前的日志文件,从而增加其大小。

从 Podman Desktop 1.16 开始,日志文件在应用程序重启时会自动清理。这确保了日志文件的大小不会无限期地增加。但是,您可以随时检查日志文件的大小,以手动解决磁盘空间问题。

解决方案

检查 Podman Desktop 日志文件的大小以进行故障排除

$ ls -la ~/Library/Logs/Podman\ Desktop/*.log

使用 Podman Desktop 1.16.0 或更高版本,您的计算机可能需要重启才能截断 Podman Desktop 日志文件。为避免重启计算机,请逐一运行以下命令

$ launchctl unload  ~/Library/LaunchAgents/io.podman_desktop.PodmanDesktop.plist
$ launchctl load  ~/Library/LaunchAgents/io.podman_desktop.PodmanDesktop.plist