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."
解决方案
- 从 gvisor-tap-vsock 发布页面 下载 `gvproxy`。
- 从 Podman GitHub 页面 上的源代码构建 `podman-mac-helper`。
- 将 `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`。
解决方案
您可以
- 在您的 `x86_64` brew 安装(例如,从 Rosetta 下运行的终端)中卸载 Podman 机器 `brew uninstall podman`
- 或卸载 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 文件正在使用中。
解决方法
-
杀死剩余的 QEMU 进程并停止 Podman 机器
$ ps -edf | grep qemu-system | grep -v grep | awk '{print $2}' | xargs -I{} kill -9 {}; podman machine stop
-
启动 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`
解决方案
- 使用 .dmg 安装程序安装 Podman 桌面和 Podman,而不是 brew。Podman 安装程序包含一个已通过 Podman 测试的 QEMU 二进制文件。
解决方法
保留您的基于 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 处理器
-
要获得干净的环境,请删除所有 Podman 和 qemu 构件
-
删除 Podman/Podman 桌面安装程序中的任何安装
$ sudo rm -rf opt/podman
-
删除 brew 安装
$ brew uninstall podman-desktop
$ brew uninstall podman
$ brew uninstall qemu -
删除 Podman 文件
$ rm -rf ~/.ssh/podman-machine-default
$ rm -rf ~/.ssh/podman-machine-default.pub
$ rm -rf ~/.local/share/containers
$ rm -rf ~/.config/containers
-
-
使用 brew 重新安装 Podman
$ brew install podman
-
安装 bunzip2
$ brew install bzip2
-
将 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
-
安装修补的 EDK2。从 EDK2 下载,该文件位于 lima-vm/edk2-patched.tmp/releases。
-
初始化 Podman 机器。
-
找到 QEMU 配置目录以在下一步中定义 `qemu-config-directory`
$ podman machine info | grep MachineConfigDir
-
更新 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
-
启动 Podman 机器。