コンテナに渡すためにディスプレイソケットを見つけようとしています。私はそれが中にあるか/tmp/X11.unix
中にあることを望んでいます/run/user/xxxx/wayland-0
が、どちらも存在しません。私はKDEプラズマとX11を使用しています。
答え1
説明に示されている正確な結果に基づいて、システムが抽象ソケットのみを使用するように切り替えたか、Unixソケットファイルが削除されたか、Xサーバー自体が代替インストール名前空間の下にある他のインストール名前空間で実行されている可能性があります。名前空間スペースにソケット/tmp
(systemdのいくつかの設定などPrivateTmp=yes
)または他の同様の項目を隠します。とにかくクラシックUnixソケットは使用できません(マウント/tmp
ネームスペースの代替ソケットにアクセスできるはずですが、コンテナで使用するためにバインドマウントしてはいけません)。
かなり伝統的なX11モニタでは、次のものを比較できます。
# ss -xlnp src == unix:/tmp/.X11-unix/X0
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
u_str LISTEN 0 4096 /tmp/.X11-unix/X0 20428 * 0 users:(("Xorg",pid=1287,fd=8))
そして:
# ss -xlnp src == unix:@/tmp/.X11-unix/X0
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
u_str LISTEN 0 4096 @/tmp/.X11-unix/X0 20427 * 0 users:(("Xorg",pid=1287,fd=7))
同じ手順では、2つの異なるソケットタイプを使用する2つの方法を提供します。前者はファイルシステムを備えた古典的なUnixソケットですが、/tmp/.X11-unix/X0
後者は(Linux固有)抽象Unixソケットファイルシステムが存在しません。実際にネットワークネームスペースバインディング。これは、他のネットワーク名前空間(コンテナなど)では簡単には使用できませんが、通常はプロキシ可能であることを意味します。
次のツールを使用できます。socat
クラシックUNIXソケットから抽象ソケットに中継。たとえば、次は通常の位置に次のソケットを返します。
socat unix-listen:/tmp/.X11-unix/X0,umask=000,fork abstract-connect:/tmp/.X11-unix/X0
X11内で十分な権限を付与してください(例:プロセスを実行しているxhost +si:localuser:someuser
ユーザー)。someuser
socat
このコマンドを実行すると、socat
コンテナー技術によって提供される一般的なバインドマウント方法を使用して、コンテナー内の対応するソケットに再びアクセスできます。
それ以外の場合(抽象ソケットにアクセスするために)ホストネットワークネームスペースにとどまり、コンテナのマウントネームスペースに切り替えてすぐにそこにクラシックUnixソケットを作成することを想像することができますが、これがトランジションを実行するツール自体ではない場合を意味します。socat
コンテナでコマンド(たとえば)を使用できる必要があり、十分な権限を持つためには、すべてがルート(ホストシステム上)で実行される必要があります。
somecontainer
たとえば、すでに実行中であり、socat
このコマンドがインストールされているLXCというコンテナの場合は、次のように実行できます。
X11モニターユーザー:
xhost +si:localuser:root
rootユーザーとして:
nsenter -t $(lxc-info -Hp -n somecontainer) --mount -- sh -c 'mkdir -p -m 1777 /tmp/.X11-unix; exec socat unix-listen:/tmp/.X11-unix/X0,umask=000,fork abstract-connect:/tmp/.X11-unix/X0'
注:Dockerに該当するlxc-info -Hp -n somecontainer
ものはdocker inspect --format '{{.State.Pid}}' somecontainer
。
WaylandプロトコルはUnixソケット通信でファイル記述子をサイドデータとして渡し、socat
それについて何も知らないため、Waylandソケットでは同じアプローチが失敗する可能性があります。