如何在没有 root 的情况下运行 Xvfb?

如何在没有 root 的情况下运行 Xvfb?

在没有 root 的服务器上期望的结果:

1)Xvfb在没有输入设备的情况下运行,或者

2)开始Xvfb运行

背景:

我有两台机器,它们的 CentOS 版本几乎相同。一台机器具有 root 访问权限和互联网,另一台机器是沙箱(无 root 访问权限),没有包管理器(没有 yum),也没有 Xserver。我试图得到XvfbX虚拟帧缓冲区)在目标机器上运行进行实验无头火狐。工作的时候Xvfb,我可以使用xvfb-run.

我尝试过的:

我已使用以下命令成功传输了Xvfb二进制文件和用户共享库这个方法(请参阅答案下面的评论)。我能Xvfb像这样跑

Xvfb :1 -nolisten tcp -screen 0 1680x1050x16

但后来我收到键盘映射错误(在旁边:我还想处理我设置的临时目录问题export TMPDIR=~/tmp):

_XSERVTransmkdir: Owner of /tmp/.X11-unix should be set to root
XKB: Failed to compile keymap
Keyboard initialization failed. This could be a missing or incorrect setup of xkeyboard-config.
(EE)
Fatal server error:
(EE) Failed to activate core devices.(EE)

我根本不需要物理键盘或鼠标支持。如果有人可以解释如何Xvfb在没有输入设备的情况下运行,那么我们就可以到此为止。我已经搜索了几个小时但没有成功。


我如何尝试让 xkb 工作:

xkbcomp我的下一步行动是从源计算机以及共享库中引入。接下来,我从源计算机导出键盘映射文件,如下所示:

xkbcomp -xkb $DISPLAY xkbmap

我尝试传递xkbdirxkbmap运行以下命令但没有成功

Xvfb :1 -xkbdir ~/X11/xkb -xkbmap xkbmap -nolisten tcp -screen 0 1680x1050x16

因为-xkbdir是一个有效参数,而-xkbmap尽管手册页对于 Xvfb 来说:

除了 Xserver(1) 手册页中描述的常规服务器选项之外,Xvfb 还接受以下命令行开关:

手册页对于 Xserver 来说:

−xkbdir directory
    base directory for keyboard layout files. This option is not available for setuid X servers (i.e., when the X server’s real and effective uids are different).
    ...
−xkbmap filename
    loads keyboard description in filename on server startup.

如果我只是传入 -xkbdir

$ export PATH=~/bin:$PATH; # all copied binaries are here, including xkbcomp
$ Xvfb :1 -xkbdir ~/X11/xkb -nolisten tcp -screen 0 1680x1050x16

然后我得到

_XSERVTransmkdir: Owner of /tmp/.X11-unix should be set to root
    sh: /usr/bin/xkbcomp: No such file or directory <-- WHY THIS PATH?
    sh: /usr/bin/xkbcomp: No such file or directory
    XKB: Failed to compile keymap
    Keyboard initialization failed. This could be a missing or incorrect setup of xkeyboard-config.
    (EE)
    Fatal server error:
    (EE) Failed to activate core devices.(EE)

这就是我被困了几个小时的地方。在没有 root 的机器上,或者

Xvfb1)没有输入设备如何运行?或者

2)我怎样才能开始Xvfb跑步?

答案1

部分答案:如何在没有xkeycomp.

根据您的描述,您的主要问题似乎不是Xvfb以非root身份运行(在我的系统上运行得很好),而是作为非root您无法xkeycomp在该位置安装辅助程序及其关联的数据文件哪里Xvfb期待他们。

如果不确切知道沙盒 CentOS 环境中安装了什么和未安装什么,就很难进行模拟。但摆脱xkeycomp依赖性的方法如下:

正如使用stringsonXvfb所示, 的调用xkeycomp如下所示"%s%sxkbcomp" -w %d %s -xkm "%s" -em1 %s -emp %s -eml %s "%s%s.xkm",对应的源文件为xkb初始化程序ddxLoad.c。从粗略的观察来看,通往的路径似乎xkbcomp是硬连线的。但该字符串足够长,可以将其替换为对脚本的调用,这表明Xvfb要编译以下描述

xkb_keymap "default" {
    xkb_keycodes             { include "evdev+aliases(qwerty)" };
    xkb_types                { include "complete" };
    xkb_compatibility        { include "complete" };
    xkb_symbols              { include "pc+us+inet(evdev)" };
    xkb_geometry             { include "pc(pc105)" };
};

提供自stdin、 到文件中/tmp/server-1.xkm。因此,在具有 X 和工具的机器上,将此描述复制到文件中,例如default.xkb,然后编译它

xkbcomp -xkm default.xkb 

default.xkm。现在Xvfb通过搜索调用来修补 CentOS 沙盒上的副本:

$ grep -FobUa '"%s%sxkbcomp' Xvfb
1648800:"%s%sxkbcomp

并通过调用来修补它cp

echo -n '/bin/cp /home/dirk/tmp/xvfb/default.xkm /tmp/server-1.xkm          ' | dd bs=1 of=Xvfb seek=1648800 conv=notrunc

(当然还有你的位置和你的路径default.xkm)。

这在我的机器上运行良好,但在您的沙盒 CentOS 机器上,它现在可能会触发下一个问题。 :-)

X API 将检查键盘映射的函数与实际输入设备解耦,因此即使没有输入设备,键盘映射也必须存在。

答案2

我成功地在没有 root 的情况下运行 Xvfb。

最后,我从以下网站下载了源代码https://www.x.org/wiki/Releases/Download/,注入环境变量,安装依赖项(yum),编译Xvfb二进制和共享库并将其传输到我的沙箱。

重要的是,[sources]/xkb/xkbInit.c我在第 815 行周围添加了这些行:

        if (++i >= argc)
            UseMsg();
        else
            XkbDfltRepeatInterval = (long) atoi(argv[i]);
        return 2;
    }
    /* End original code */


    // Change xkbcomp bin directory with an environment variable
    char *xkbBinDir = getenv("XKB_BINDIR");
    if (xkbBinDir) {
        XkbBinDirectory = Xstrdup(xkbBinDir);
    }

    // Change base xkb directory with an environment variable
    char *xkbBaseDir = getenv("XKBDIR");
    if (xkbBaseDir) {
        XkbBaseDirectory = Xstrdup(xkbBaseDir);
    }


    /* Original code */
    return 0;
}

我可以将环境变量设置XKB_BINDIR为我的xkbcomp二进制路径(复制到沙箱)以及XKBDIR我的default.xkm文件所在的位置。

同样,我的成功策略是从源代码进行修改进行编译Xvfb。对于令人难以忍受的细节和分步说明,我在我的网站上写了这个 -https://ericdraken.com/running-xvfb-on-a-shared-host-without-x/


@dirkt 有一个有趣的方法,那就是破解 Xvfb 二进制文件并进行字符串操作。这很吸引人,因为它很快而且有点顽皮,但它有缺点:1)我无法提前知道服务器编号是多少[1 .. 99],2)我的路径太长并且需要符号链接。我实际上尝试了 NOP 命令 (:) 作为字符串替换以及手动复制server-N.xkm,除了有源代码中需要处理的逻辑路径,其中之一是当 xkm 文件被缓存时。

答案3

类似的方法是使用 Xdummy(如果 xserver-xorg-video-dummy 在您的沙盒系统上可用)。它使用一些虚拟驱动程序并提供无需 root 权限即可运行的 X 服务器。您可以在 xpra 网站上找到一些解释和示例 xorg.conf:https://xpra.org/trac/wiki/Xdummy。它需要安装 X,但不需要正在运行的 X 服务器。

(抱歉,我没有足够的声誉来发表此评论)

相关内容