Como executar o Xvfb sem root?

Como executar o Xvfb sem root?

Resultado desejado em um servidor sem root:

1) Execute Xvfbsem dispositivos de entrada, ou

2) Basta começar Xvfba 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 Xvfbestá funcionando, posso usar xvfb-run.

O que eu tentei:

Transferi com sucesso o Xvfbbinário e as bibliotecas compartilhadas pelo usuário usandoeste método(veja o comentário abaixo da resposta). Eu sou capaz de correr Xvfbassim

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 Xvfbsem 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 xkbcompda 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 xkbdire xkbmapexecutar o seguinte sem sucesso

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

porque -xkbdiré um parâmetro válido, enquanto -xkbmapnã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 Xvfbsem dispositivos de entrada? ou

2) Como posso simplesmente começar Xvfba 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 Xvfbcomo não-root (isso funciona muito bem no meu sistema), mas como não-root você não pode instalar programas auxiliares como xkeycompe seus arquivos de dados associados no local onde Xvfbos 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 xkeycompdependência:

Como stringsnos Xvfbprogramas, a invocação de xkeycompse 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 xkbcompestá programado. Mas a string é longa o suficiente para substituí-la por uma chamada para um script, o que mostra que Xvfbdeseja 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 Xvfbna 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 Xvfbe transferi essas bibliotecas binárias e compartilhadas para minha sandbox.

Criticamente, [sources]/xkb/xkbInit.cadicionei 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_BINDIRpara meu xkbcompcaminho binário (copiado para a sandbox) e XKBDIRpara onde está meu default.xkmarquivo.

Novamente, minha estratégia bem-sucedida foi compilar Xvfba 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)

informação relacionada