4

我试图在直接访问 X11 套接字的 docker 容器内运行嵌套的 X-server Xephyr,但是我遇到了我目前不理解的奇怪的图形错误。

的内容Dockerfile只是

FROM ubuntu:14.04

RUN apt-get update
RUN apt-get install -qqy xserver-xephyr

# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

构建它

sudo docker build -t xephyrtest .

并运行它

sudo docker run -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix xephyrtest Xephyr :1

输出以下内容:

Xephyr unable to use SHM XImages
Initializing built-in extension Generic Event Extension
Initializing built-in extension SHAPE
Initializing built-in extension MIT-SHM
Initializing built-in extension XInputExtension
Initializing built-in extension XTEST
Initializing built-in extension BIG-REQUESTS
Initializing built-in extension SYNC
Initializing built-in extension XKEYBOARD
Initializing built-in extension XC-MISC
Initializing built-in extension SECURITY
Initializing built-in extension XINERAMA
Initializing built-in extension XFIXES
Initializing built-in extension RENDER
Initializing built-in extension RANDR
Initializing built-in extension COMPOSITE
Initializing built-in extension DAMAGE
Initializing built-in extension MIT-SCREEN-SAVER
Initializing built-in extension DOUBLE-BUFFER
Initializing built-in extension RECORD
Initializing built-in extension DPMS
Initializing built-in extension Present
Initializing built-in extension DRI3
Initializing built-in extension X-Resource
Initializing built-in extension XVideo
Initializing built-in extension XVideo-MotionCompensation
Initializing built-in extension SELinux
Initializing built-in extension GLX
[dix] Could not init font path element /usr/share/fonts/X11/cyrillic, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/100dpi/:unscaled, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/75dpi/:unscaled, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/Type1, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/100dpi, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/75dpi, removing from list!

在这里,第一行Xephyr unable to use SHM XImages似乎是最重要的,因为它没有显示在 Xephyr 正常工作的主机上。

尽管会弹出 Xephyr 窗口,但使用该:1显示屏的应用程序会出现奇怪的故障。例如DISPLAY=:1 gedit看起来像这样(当鼠标在窗口内移动时输出会迅速变化):

在此处输入图像描述

是什么SHM XImages意思,我该如何解决它在容器中的不可用性?

4

3 回答 3

6

事实证明,从 Docker 1.5 开始,使用以下命令在 docker 容器中运行 Xephyr 实际上非常容易

sudo docker run -e DISPLAY -v /tmp:/tmp --ipc=host --pid=host xephyrtest Xephyr :1

两个附加参数是

  • --ipc=host允许容器使用与主机相同的 IPC 命名空间,因此也可以访问相同的共享内存段
  • --pid=host让容器查看(并修改)主机的进程。这是必要的,因为 X 服务器端口锁定是通过/tmp/.Xi-lock锁定文件(替换i为您的显示端口)完成的,其中包含在 port 上运行的 X 服务器的 pid i

除了容器内的 X11 unix 套接字之外,您还必须更改-v /tmp/.X11-unix:/tmp/.X11-unix-v /tmp:/tmp才能访问锁定文件。

尽管这工作得很好,但您必须注意,这两个附加参数和对主机/tmp文件夹的访问权限会授予容器重要权限,这在某些情况下可能会带来安全风险。

于 2015-04-15T19:11:56.460 回答
3

运行 Xephyr 并选择-extension MIT-SHM禁用共享内存。然后,您不需要使用 docker option 打破容器隔离--ipc=host

为避免使用 docker 选项--pid=host,请考虑在主机上运行 Xephyr,共享其 X 套接字并设置-e DISPLAY=:1。只共享 socket 文件就足够了/tmp/.X11-unix/X1,不需要共享整个文件夹,甚至整个/tmp.

于 2016-11-24T22:17:15.173 回答
0

MIT-SHM 扩展是一种允许在客户端和服务器之间(主要)更快地显示图像的方式,只要它们在同一台计算机上运行。这是通过创建一个 SysV shm 共享内存对象来完成的,客户端可以将图像数据写入并由 X 服务器直接显示,而不必通过套接字序列化图像。

如果 Docker 容器阻止它并且 gedit 依赖它,我不会感到惊讶。

于 2015-04-10T09:54:21.500 回答