컨테이너에 전달할 수 있도록 디스플레이 소켓을 찾으려고 합니다. 나는 그것이 안에 있거나 /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))
동일한 절차에서는 서로 다른 두 소켓 유형을 사용하는 두 가지 방법을 제공합니다. 전자는 파일 시스템을 갖춘 고전적인 유닉스 소켓인 반면, /tmp/.X11-unix/X0
후자는(Linux 특정) 추상 유닉스 소켓파일 시스템이 존재하지 않습니다. 실제로네트워크 네임스페이스 바인딩. 이는 다른 네트워크 네임스페이스(예: 컨테이너)에서는 쉽게 사용할 수 없지만 일반적으로 프록시될 수 있음을 의미합니다.
다음과 같은 도구를 사용할 수 있습니다.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
루트 사용자로서:
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 소켓에서는 동일한 접근 방식이 실패할 수 있습니다.