无法使用 xdpyinfo 获取虚拟帧缓冲区/显示 (Xvfb) 信息

Tom*_*ber 5 virtualbox xvfb 16.04

在 VirtualBox 中运行的 Ubuntu Server 16.04

\n\n

设置

\n\n
sudo sh -c \'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list\'\nsudo apt-get update\nsudo apt-get install xvfb dbus-x11 google-chrome-stable\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试

\n\n
$xvfb-run -a --server-args=\'-screen 0, 1024x768x16\' google-chrome -start-maximized http://example.com > /dev/null &\n\n$ ps auxx | grep Xvfb\nuser   1355  1.2  1.6 174992 33808 ?        S    13:21   0:30 Xvfb :99 -screen 0, 1024x768x16 -nolisten tcp -auth /tmp/xvfb-run.adDyGd/Xauthority\n\n$ cat /tmp/xvfb-run.adDyGd/Xauthority\nuser99MIT-MAGIC-COOKIE-1\xef\xbf\xbd\xef\xbf\xbdgj\xef\xbf\xbd\xef\xbf\xbd/\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdauser@user:~$\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题

\n\n
$ xdpyinfo -display :99\nNo protocol specified\nxdpyinfo:  unable to open display ":99".\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • “未指定协议”是什么意思?
  • \n
  • 什么可能导致 xdpyinfo 在这里失败?
  • \n
\n\n

更新 2016 年 5 月 16 日

\n\n

手动启动 Xvfb 并在运行 chrome 之前定义显示编号是可行的。然而 xvfb-run 却没有。

\n\n

手动 Xvfb

\n\n
$ sudo sh -c \'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list\'\n$ sudo apt-get update\n$ sudo apt-get upgrade\n$ sudo apt-get install xvfb dbus-x11 google-chrome-stable\n\n$ Xvfb :99 -screen 0 1024x768x24 > /dev/null &\n\n$ xdpyinfo -display :99\nname of display:    :99\nversion number:    11.0\nvendor string:    The X.Org Foundation\nvendor release number:    11803000\nX.Org version: 1.18.3\nmaximum request size:  16777212 bytes\nmotion buffer size:  256\nbitmap unit, bit order, padding:    32, LSBFirst, 32\nimage byte order:    LSBFirst\nnumber of supported pixmap formats:    6\nsupported pixmap formats:\n    depth 1, bits_per_pixel 1, scanline_pad 32\n    depth 4, bits_per_pixel 8, scanline_pad 32\n    depth 8, bits_per_pixel 8, scanline_pad 32\n    depth 16, bits_per_pixel 16, scanline_pad 32\n    depth 24, bits_per_pixel 32, scanline_pad 32\n    depth 32, bits_per_pixel 32, scanline_pad 32\nkeycode range:    minimum 8, maximum 255\nfocus:  PointerRoot\nnumber of extensions:    25\n    ...\ndefault screen number:    0\nnumber of screens:    1\n\nscreen #0:\n  dimensions:    1024x768 pixels (260x195 millimeters)\n  resolution:    100x100 dots per inch\n  depths (6):    24, 1, 4, 8, 16, 32\n  root window id:    0x25c\n  depth of root window:    24 planes\n  number of colormaps:    minimum 1, maximum 1\n  default colormap:    0x20\n  default number of colormap cells:    256\n  preallocated pixels:    black 0, white 16777215\n  options:    backing-store WHEN MAPPED, save-unders NO\n  largest cursor:    1024x768\n  current input event mask:    0x0\n  number of visuals:    240\n  default visual id:  0x21\n\n$ export DISPLAY=:99 && google-chrome -start-maximized http://example.com > /dev/null &\n\n$ ps auxx | grep \'chrome\\|Xvfb\' | grep -v grep\nubuntu   14843  0.0  0.4 193320 35308 pts/0    Sl   17:57   0:00 Xvfb :99 -screen 0 1024x768x24\nubuntu   14856  0.2  1.3 569044 108484 pts/0   Sl   17:58   0:01 /opt/google/chrome/chrome -start-maximized http://example.com\nubuntu   14868  0.0  0.6 358448 49424 pts/0    S    17:58   0:00 /opt/google/chrome/chrome --type=zygote\nubuntu   14869  0.0  0.1 142096  9596 pts/0    S    17:58   0:00 /opt/google/chrome/nacl_helper\nubuntu   14872  0.0  0.1 358448 11012 pts/0    S    17:58   0:00 /opt/google/chrome/chrome --type=zygote\nubuntu   14960  0.0  0.7 446888 64060 pts/0    Sl   17:58   0:00 /opt/google/chrome/chrome --type=gpu-process --channel=14856.0.2123468494 --window-depth=24 --supports-dual-gpus=false --gpu-driver-bug-workarounds=4,53 --disable-accelerated-video-decode --gpu-vendor-id=0x1013 --gpu-device-id=0x00b8 --gpu-driver-vendor --gpu-driver-version --v8-natives-passed-by-fd --v8-snapshot-passed-by-fd\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用 xvfb 运行

\n\n
$ xvfb-run -a --server-args=\'-screen 0, 1024x768x24\' google-chrome -start-maximized http://example.com > /dev/null &\n\n$ ps auxx | grep \'chrome\\|Xvfb\' | grep -v grep\nubuntu    1196  0.0  0.0   4508  1644 pts/0    S    18:15   0:00 /bin/sh /usr/bin/xvfb-run -a --server-args=-screen 0, 1024x768x24 google-chrome -start-maximized http://example.com\nubuntu    1208  0.0  0.4 193192 35572 pts/0    Sl   18:15   0:00 Xvfb :99 -screen 0, 1024x768x24 -nolisten tcp -auth /tmp/xvfb-run.8pPvAX/Xauthority\nubuntu    1213  0.4  1.3 619068 106576 pts/0   Sl   18:15   0:00 /opt/google/chrome/chrome -start-maximized http://example.com\nubuntu    1224  0.0  0.5 358448 47768 pts/0    S    18:15   0:00 /opt/google/chrome/chrome --type=zygote\nubuntu    1225  0.0  0.1 142128  9600 pts/0    S    18:15   0:00 /opt/google/chrome/nacl_helper\nubuntu    1228  0.0  0.1 358448 10492 pts/0    S    18:15   0:00 /opt/google/chrome/chrome --type=zygote\nubuntu    1440  0.0  0.7 738140 62828 pts/0    Sl   18:15   0:00 /opt/google/chrome/chrome --type=renderer --lang=en-US --enable-offline-auto-reload --enable-offline-auto-reload-visible-only --enable-pinch --num-raster-threads=1 --content-image-texture-target=3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553 --video-image-texture-target=3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553 --disable-accelerated-video-decode --disable-webrtc-hw-encoding --disable-gpu-compositing --channel=1213.0.1322123415 --v8-natives-passed-by-fd --v8-snapshot-passed-by-fd\n\n$ xdpyinfo -display :99\nNo protocol specified\nxdpyinfo:  unable to open display ":99".\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意 xvfb-run 使用的 Xvfb 命令的差异:

\n\n
Xvfb :99 -screen 0, 1024x768x24 -nolisten tcp -auth /tmp/xvfb-run.8pPvAX/Xauthority\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,这不是问题,因为它本身运行并获取显示信息工作得很好。

\n

tom*_*tom 1

晦涩的错误消息是因为客户端(xdpyinfo)没有正确的授权数据。

正如@TomSchober 在问题中指出的那样,xvfb-run 创建一个授权文件,其路径格式为/tmp/xvfb-run.XXXXXX/Xauthority,并将 Xvfb 配置为使用该文件。客户端需要使用该文件(而不是默认的~/.Xauthority)。这可以通过设置 XAUTHORITY 环境变量来完成:

DISPLAY=:99 XAUTHORITY=/tmp/xvfb-run.XXXXXX/Xauthority xdpyinfo
Run Code Online (Sandbox Code Playgroud)

这里的 XXXXXX 应替换为与实际路径匹配。pgrep -ax Xvfb可以通过使用并检查选项值打印 Xvfb 进程的参数来发现路径-auth。或者,xvfb-run 有一个选项--auth-file可用于设置 Xauthority 文件的位置(如果文件不存在,将打印警告;您可以忽略警告,或预先在该位置创建一个空文件) 。


@TomSchober 在问题中提出的一个有趣的观察是,如果您手动调用 xvfb-run 使用的 Xvfb 命令(即使用选项-auth),即使未设置 XAUTHORITY,客户端也可能进行连接。这是因为 xvfb-run 在运行 Xvfb 之前向 Xauthority 文件添加了一个授权条目。如果未添加此条目,并且文件为空/丢失,Xvfb 将允许客户端无需授权即可连接 (!)。仅当 Xauthority 文件中至少有一项时,Xvfb 才需要授权。可以使用以下命令手动添加授权条目:

XAUTHORITY=/path/to/Xauthority xauth source - <<EOF
add :99 . $(mcookie)
EOF
Run Code Online (Sandbox Code Playgroud)