首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >podman错误:套接字激活协议的文件描述符数目错误(2 != 1)

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

Unix & Linux用户
提问于 2023-03-13 13:48:41
回答 1查看 66关注 0票数 0

虽然我不确定问题是podman还是systemd,但我遇到了一个与podman的套接字激活机制类似的bug。

我为podman服务创建了另一个托管套接字单元,以便公开默认情况下由docker工具所期望的标准/run/docker.socket路径:

代码语言:javascript
复制
# 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会被抛到一个失败循环中:

代码语言:javascript
复制
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显示

代码语言:javascript
复制
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。

当我激活插座时:

代码语言:javascript
复制
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)

现在这种行为正常吗?这个系统是否在套接字上产生了一个新的文件描述符来传递给podman,同时仍然在监听传入的连接,在这种情况下,podman没有抱怨的必要,我应该向podman团队提交一个bug报告?

谢谢。

编辑:实际上,由于我的两个套接字单元,似乎存在一些奇怪的循环依赖关系。如果我蒙蔽了podman.socketD11就不能工作了:

代码语言:javascript
复制
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.servicepodman.socket之间的依赖:

代码语言:javascript
复制
podman.service
× ├─docker.socket
○ ├─podman.socket
● ├─system.slice
● └─sysinit.target
●   [...]

尽管玩越野游戏:

代码语言:javascript
复制
# /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

有没有办法让系统理解我想要删除podman.socket

EN

回答 1

Unix & Linux用户

发布于 2023-03-13 15:54:17

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

依赖关系(After=等)不能将其重置为空列表,因此只能在下拉列表中添加依赖项。如果要删除依赖项,则必须覆盖整个单元。

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

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

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/739597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档