在 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/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
。
解决方案
您可以
- 在您的
x86_64
brew 安装中卸载 Podman machine(例如,从 Rosetta 下运行的终端)brew uninstall podman
- 或者卸载 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 文件正在使用。
权宜之计
-
杀死剩余的 QEMU 进程并停止 Podman machine
$ ps -edf | grep qemu-system | grep -v grep | awk '{print $2}' | xargs -I{} kill -9 {}; podman machine stop
-
启动 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
解决方案
- 使用 .dmg 安装程序安装 Podman Desktop 和 Podman,而不是 brew。Podman 安装程序包含一个已通过 Podman 测试的 QEMU 二进制文件。
解决方法
保留您的基于 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 处理器
-
为了获得一个干净的环境,移除所有 Podman 和 qemu 相关的构件
-
移除 Podman/Podman Desktop 安装程序中可能存在的安装
$ 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。从 lima-vm/edk2-patched.tmp/releases 下载 EDK2。
-
初始化 Podman machine。
-
查找 QEMU 配置目录以在下一步中定义
qemu-config-directory
$ podman machine info | grep MachineConfigDir
-
更新 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
-
启动 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