
Resultado desejado em um servidor sem root:
1) Execute Xvfb
sem dispositivos de entrada, ou
2) Basta começar Xvfb
a correr
Fundo:
Eu tenho duas máquinas com versões quase idênticas do CentOS. Uma máquina tem acesso root e internet e a outra está em sandbox (sem acesso root), sem gerenciadores de pacotes (sem yum) e sem Xserver. Estou tentando conseguir Xvfb
(X buffer de quadro virtual) em execução na máquina de destino para experimentarFirefox sem cabeça. Quando Xvfb
está funcionando, posso usar xvfb-run
.
O que eu tentei:
Transferi com sucesso o Xvfb
binário e as bibliotecas compartilhadas pelo usuário usandoeste método(veja o comentário abaixo da resposta). Eu sou capaz de correr Xvfb
assim
Xvfb :1 -nolisten tcp -screen 0 1680x1050x16
mas então recebo um erro de mapa de teclado (Aparte:Eu também gostaria de lidar com esse problema de diretório temporário conforme defini 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)
Não preciso de suporte físico para teclado ou mouse. Se alguém pudesse explicar como rodar Xvfb
sem dispositivos de entrada, poderíamos parar por aqui. Procurei por horas sem sucesso.
Como tentei fazer o xkb funcionar:
Minha próxima ação foi trazer xkbcomp
da máquina de origem junto com as bibliotecas compartilhadas. Em seguida, exportei o arquivo keymap da máquina de origem assim:
xkbcomp -xkb $DISPLAY xkbmap
Tentei passar xkbdir
e xkbmap
executar o seguinte sem sucesso
Xvfb :1 -xkbdir ~/X11/xkb -xkbmap xkbmap -nolisten tcp -screen 0 1680x1050x16
porque -xkbdir
é um parâmetro válido, enquanto -xkbmap
não é apesar dopágina de manualpara Xvfb afirmando:
Além das opções normais do servidor descritas na página de manual do Xserver(1), o Xvfb aceita as seguintes opções de linha de comando:
e apágina de manualpara Xserver informando:
−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.
Se eu apenas passar -xkbdir
$ export PATH=~/bin:$PATH; # all copied binaries are here, including xkbcomp
$ Xvfb :1 -xkbdir ~/X11/xkb -nolisten tcp -screen 0 1680x1050x16
então eu recebo
_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)
É aqui que estou preso há horas. Em uma máquina sem root, também
1) Como posso rodar Xvfb
sem dispositivos de entrada? ou
2) Como posso simplesmente começar Xvfb
a correr?
Responder1
Resposta parcial: Como executar o Xvfb sem o xkeycomp
.
De acordo com sua descrição, seu principal problema não parece ser rodar Xvfb
como não-root (isso funciona muito bem no meu sistema), mas como não-root você não pode instalar programas auxiliares como xkeycomp
e seus arquivos de dados associados no local onde Xvfb
os espera.
Isso é difícil de simular sem saber exatamente o que está ou não instalado em seu ambiente CentOS em sandbox. Mas veja como se livrar da xkeycomp
dependência:
Como strings
nos Xvfb
programas, a invocação de xkeycomp
se parece com "%s%sxkbcomp" -w %d %s -xkm "%s" -em1 %s -emp %s -eml %s "%s%s.xkm"
e os arquivos de origem correspondentes sãoxkbInit.ceddxLoad.c. A partir de uma inspeção superficial, parece que o caminho xkbcomp
está programado. Mas a string é longa o suficiente para substituí-la por uma chamada para um script, o que mostra que Xvfb
deseja compilar a seguinte descrição
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)" };
};
fornecido de stdin
, para o arquivo /tmp/server-1.xkm
. Então, em uma máquina com X e ferramentas, copie esta descrição para um arquivo, digamos default.xkb
, e compile-o
xkbcomp -xkm default.xkb
para default.xkm
. Agora corrija sua cópia Xvfb
na sandbox do CentOS procurando pela invocação:
$ grep -FobUa '"%s%sxkbcomp' Xvfb
1648800:"%s%sxkbcomp
e corrija-o com uma chamada para cp
:
echo -n '/bin/cp /home/dirk/tmp/xvfb/default.xkm /tmp/server-1.xkm ' | dd bs=1 of=Xvfb seek=1648800 conv=notrunc
(é claro com sua posição e seu caminho para default.xkm
).
Isso funciona bem na minha máquina, mas na sua máquina CentOS em sandbox provavelmente irá desencadear o próximo problema. :-)
E a API X separa as funções para inspecionar o mapeamento do teclado dos dispositivos de entrada reais, portanto, mesmo que não haja dispositivos de entrada, um mapeamento do teclado ainda deve estar presente.
Responder2
Consegui fazer o Xvfb funcionar sem root.
No final, baixei o código fonte dehttps://www.x.org/wiki/Releases/Download/, injetei variáveis de ambiente, instalei dependências (yum) e compilei Xvfb
e transferi essas bibliotecas binárias e compartilhadas para minha sandbox.
Criticamente, [sources]/xkb/xkbInit.c
adicionei estas linhas em torno da linha 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;
}
Posso definir as variáveis de ambiente XKB_BINDIR
para meu xkbcomp
caminho binário (copiado para a sandbox) e XKBDIR
para onde está meu default.xkm
arquivo.
Novamente, minha estratégia bem-sucedida foi compilar Xvfb
a partir do código-fonte com modificações. Para obter detalhes dolorosos e instruções passo a passo, escrevi isso em meu site aqui -https://ericdraken.com/running-xvfb-on-a-shared-host-without-x/
@dirkt tinha uma abordagem interessante que era hackear o binário Xvfb e manipular strings. Isso é atraente porque é rápido e um tanto perverso, mas tinha desvantagens: 1) Não posso saber antecipadamente qual é o número do servidor [1 .. 99] e 2) Meus caminhos são muito longos e exigiriam links simbólicos. Na verdade, tentei um comando NOP (:) como substituição de string junto com a cópia manual do server-N.xkm
, exceto que hádoiscaminhos lógicos a serem enfrentados no código-fonte, sendo um deles quando o arquivo xkm é armazenado em cache.
Responder3
Uma abordagem semelhante é usar o Xdummy, se xserver-xorg-video-dummy estiver disponível em seu sistema em sandbox. Ele usa alguns drivers fictícios e fornece um servidor X que pode ser executado sem privilégios de root. Você pode encontrar algumas explicações e um exemplo de xorg.conf no site xpra:https://xpra.org/trac/wiki/Xdummy. Ele precisa que o X esteja instalado, mas não precisa de um servidor X em execução.
(Desculpe, não tenho reputação suficiente para postar isso como um comentário)