X11转发-从docker到WSL

X11转发-从docker到WSL

随着WSL-g的普及,只需要在WSL2中去SSH连接远程服务器时带上-X或者-Y,就能够把服务器上的图形界面程序转到Windows本机,这在过去需要本机是Linux电脑。

如果远程服务器上装了docker,想在docker里再跑图形界面程序则更加复杂。需要从docker转到服务器,然后再通过SSH转到本地WSL。为了更好地使用这些高级的操作,有必要学习相关的原理。

SSH X11 转发

XSOCK环境变量负责告诉图形界面程序,怎么去连接X11服务器,从而显示图像。在通常的ubuntu desktop系统中,往往图形服务器使用的是/tmp/.X11-unix。参考这里

SSH连接服务器如果带上了-X,则会设置DISPLAY和XAUTHORITY,DISPLAY通常指定为hostname:10.0。此时用的就是普通的tcp的端口,即6000+10=6010

此外,一般这个端口只允许localhost的连接,由sshd_config里的X11UseLocalhost no控制。

XAUTH 和 .Xauthority

TODO。不过根据这里,把.Xauthority文件挂载进去就好了:

1
--volume="$HOME/.Xauthority:/root/.Xauthority:rw"

docker X11 + SSH X11:要挂载/tmp/.X11-unix吗?

场景是,笔记本使用windows,连接服务器,服务器上在docker里运行图形界面程序,直接转发到笔记本显示。

这里介绍的转发方法使用了下面的挂载:

1
2
3
4
5
6
7
xhost +si:localuser:root
docker run -it --privileged \
--network=host \
-e DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
retypd-image \
bash
  • 挂载了/tmp/.X11-unix目录,这意味着假设x11转发走的是这里面的unix socks(一般本机需要是linux系统才会用这个)
  • --network=host使用本机网络,-e DISPLAY把当前的DISPLAY变量传进去。

但是我们是ssh的x11转发,所以和/tmp/.X11-unix没关系,可以放心地去掉这个挂载,最后我们得到下面几个flag:

1
2
3
--network=host \
-e DISPLAY \
--volume="$HOME/.Xauthority:/root/.Xauthority:rw" \