podman 오류: 소켓 활성화 프로토콜에 대한 파일 설명자 수가 잘못되었습니다(2 != 1).

podman 오류: 소켓 활성화 프로토콜에 대한 파일 설명자 수가 잘못되었습니다(2 != 1).

Podman의 소켓 활성화 메커니즘에 버그가 발생했지만 문제가 Podman인지 systemd인지 확실하지 않습니다.

/run/docker.socketdocker 도구가 기본적으로 예상하는 정규화된 경로를 노출하기 위해 podman 서비스에 대한 대체 관리형 소켓 장치를 만들었습니다 .

# 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이 활성화되었을 때 청취자를 보면 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)

지금 이 행동이 정상인가요? 이것은 들어오는 연결을 계속 수신하면서 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문서, 서비스 단위 종속성을 재정의할 수 없습니다.

종속성(이후= 등)은 빈 목록으로 재설정할 수 없으므로 종속성은 드롭인에서만 추가할 수 있습니다. 종속성을 제거하려면 전체 단위를 덮어써야 합니다.

podman-docker이 패키지를 설치하는 것이 더 쉽다고 생각합니다 .

docker유사한 명령으로의 원활한 리디렉션을 위한 스크립트를 설정하고 Podman 소켓을 가리키도록 podman심볼릭 링크도 설정합니다 . /run/docker.sock마지막으로 이 작업을 수행해야 했을 때는 systemd를 변경할 필요가 없었습니다. 단지 시스템이 podman.socket활성화되어 실행 중인지 확인하기만 하면 됩니다.

관련 정보