podman 错误:套接字激活协议的文件描述符数量错误 (2 != 1)

podman 错误:套接字激活协议的文件描述符数量错误 (2 != 1)

我遇到了 podman 套接字激活机制的错误,但我不确定问题是 podman 还是 systemd。

我为 podman 服务创建了一个替代托管套接字单元,以便公开/run/docker.socketdocker 工具默认期望的标准路径:

# systemctl cat docker.socket
# /etc/systemd/system/docker.socket
[Unit]
Description=Docker API Socket
Documentation=man:podman-system-service(1)

[Socket]
ListenStream=%t/docker.sock
SocketMode=0660
Service=podman.service

[Install]
WantedBy=sockets.target

[Socket]
SocketGroup=wheel

与默认单位基本相同podman.socket

现在我不确定让多个套接字激活同一服务是否有问题,到目前为止似乎还不是这种情况,但假设默认podman.socket单元已正确禁用。

现在,如果我尝试连接到套接字(例如nc -D -U /run/docker.sock),从而激活 podman 服务,podman 就会陷入故障循环:

Mar 10 14:38:17 drpyser-workstation podman[266938]: time="2023-03-10T14:38:17-05:00" level=info msg="/usr/bin/podman filtering at log level info"
Mar 10 14:38:17 drpyser-workstation podman[266938]: time="2023-03-10T14:38:17-05:00" level=info msg="Setting parallel job count to 49"
Mar 10 14:38:17 drpyser-workstation podman[266938]: time="2023-03-10T14:38:17-05:00" level=info msg="Using systemd socket activation to determine API endpoint"
Mar 10 14:38:17 drpyser-workstation podman[266938]: Error: wrong number of file descriptors for socket activation protocol (2 != 1)
Mar 10 14:38:17 drpyser-workstation systemd[1]: podman.service: Main process exited, code=exited, status=125/n/a
Mar 10 14:38:17 drpyser-workstation systemd[1]: podman.service: Failed with result 'exit-code'

(如此重复一段时间,直到累为止)

/run/docker.sock我相信我可以通过查看激活 podman 时的听众来观察它所抱怨的情况。在我激活套接字之前,lsof /run/docker.sock显示

COMMAND PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE
 NAME
systemd   1 root   47u  unix 0x00000000bad2c1a8      0t0 776246
 /run/docker.sock type=STREAM (LISTEN)

到目前为止一切顺利,systemd 正在执行侦听套接字的工作,等待传入连接传递给 podman。

当我激活套接字时:

COMMAND PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE
 NAME
systemd   1 root   47u  unix 0x00000000bad2c1a8      0t0 776246
 /run/docker.sock type=STREAM (LISTEN)
systemd   1 root   49u  unix 0x00000000dec938bb      0t0 802883
 /run/docker.sock type=STREAM (LISTEN)

现在这种行为正常吗?这个 systemd 是否在套接字上生成一个新的文件描述符以传递给 podman,同时仍在侦听传入连接,在这种情况下 podman 没有业务抱怨,我应该向 podman 团队提交错误报告?

谢谢。

编辑:实际上,由于我的两个套接字单元,似乎存在一些奇怪的循环依赖关系。docker.socket如果我屏蔽的话将不起作用podman.socket

Mar 10 16:03:49 drpyser-workstation systemd[1]: docker.socket: Failed to queue service startup job (Maybe the service file is missing or not a non-template unit?): Unit podman.socket is masked.
Mar 10 16:03:49 drpyser-workstation systemd[1]: docker.socket: Failed with result 'resources'.

我未能找到一种方法来消除podman.service和之间的依赖关系podman.socket

podman.service
× ├─docker.socket
○ ├─podman.socket
● ├─system.slice
● └─sysinit.target
●   [...]

尽管尝试了覆盖:

# /usr/lib/systemd/system/podman.service
[Unit]
Description=Podman API Service
Requires=podman.socket
After=podman.socket
Documentation=man:podman-system-service(1)
StartLimitIntervalSec=0

[Service]
Delegate=true
Type=exec
KillMode=process
Environment=LOGGING="--log-level=info"
ExecStart=/usr/bin/podman $LOGGING system service

[Install]
WantedBy=default.target

# /etc/systemd/system/podman.service.d/override.conf
[Unit]
Requires=
After=
Requires=docker.socket
After=docker.socket

有没有办法让 systemd 明白我想删掉podman.socket

答案1

现在我不确定让多个套接字激活同一服务是否有问题,到目前为止似乎还没有出现这种情况,但假设默认的 podman.socket 单元已正确禁用。

命令

podman system service

目前不支持多个监听套接字。

相关源代码(截至 2023 年 7 月 2 日具有 GitHub 主分支的永久链接):

https://github.com/containers/podman/blob/539be58163a1730af0d84b39fcde585983cd9925/cmd/podman/system/service_abi.go#L48-L50

另请参阅:podman GitHub 问题#17754(“错误:套接字激活协议的文件描述符数量错误 (2 != 1)”)

答案2

根据systemd文档,您无法覆盖服务单元的依赖关系:

依赖项(After= 等)无法重置为空列表,因此只能在 drop-ins 中添加依赖项。如果要删除依赖项,则必须覆盖整个单元。

我发现安装该podman-docker软件包更容易。

它设置一个脚本,以便docker无缝重定向到类似命令podman,并且还设置一个符号链接以/run/docker.sock指向 Podman 套接字。上次我必须这样做时,不需要对 systemd 进行任何更改,只需确保它podman.socket已启用并正在运行即可。

相关内容