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チームにバグレポートを送信する必要がありますか?

ありがとうございます。

編集:実際には2つのソケットデバイスのために奇妙な循環依存関係があるようです。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で実行中であることを確認するだけです。

関連情報