私のディスプレイソケットを探す

私のディスプレイソケットを探す

コンテナに渡すためにディスプレイソケットを見つけようとしています。私はそれが中にあるか/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ユーザー)。someusersocat

このコマンドを実行すると、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ソケットでは同じアプローチが失敗する可能性があります。

おすすめ記事