在没有 root 的服务器上期望的结果:
1)Xvfb
在没有输入设备的情况下运行,或者
2)开始Xvfb
运行
背景:
我有两台机器,它们的 CentOS 版本几乎相同。一台机器具有 root 访问权限和互联网,另一台机器是沙箱(无 root 访问权限),没有包管理器(没有 yum),也没有 Xserver。我试图得到Xvfb
(X虚拟帧缓冲区)在目标机器上运行进行实验无头火狐。工作的时候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
我尝试传递xkbdir
并xkbmap
运行以下命令但没有成功
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 的机器上,或者
Xvfb
1)没有输入设备如何运行?或者
2)我怎样才能开始Xvfb
跑步?
答案1
部分答案:如何在没有xkeycomp
.
根据您的描述,您的主要问题似乎不是Xvfb
以非root身份运行(在我的系统上运行得很好),而是作为非root您无法xkeycomp
在该位置安装辅助程序及其关联的数据文件哪里Xvfb
期待他们。
如果不确切知道沙盒 CentOS 环境中安装了什么和未安装什么,就很难进行模拟。但摆脱xkeycomp
依赖性的方法如下:
正如使用strings
onXvfb
所示, 的调用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 服务器。
(抱歉,我没有足够的声誉来发表此评论)