Como executar o Xvfb sem raiz?

5

Resultado desejado em um servidor sem raiz:

1) Execute Xvfb sem dispositivos de entrada ou

2) Apenas pegue Xvfb para executar

Antecedentes:

Eu tenho duas máquinas com construções quase idênticas do CentOS. Uma máquina tem acesso root e internet e a outra é sandbox (sem acesso root) sem gerenciadores de pacotes (sem yum) e sem Xserver. Estou tentando obter Xvfb ( X buffer de quadros virtuais ) em execução na máquina de destino para experimentar o firefox sem cabeça . Quando Xvfb está funcionando, posso usar xvfb-run .

O que eu tentei:

Transferi com êxito o binário Xvfb e as bibliotecas compartilhadas do usuário usando este método (consulte o comente abaixo a resposta). Eu sou capaz de executar Xvfb como assim

Xvfb :1 -nolisten tcp -screen 0 1680x1050x16

mas depois recebo um erro de mapa de teclado ( Aside: eu também gostaria de lidar com esse problema de pasta temporária como eu 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 puder explicar como executar Xvfb sem dispositivos de entrada, poderemos parar aqui. Eu 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, eu exportei o arquivo keymap da máquina de origem da seguinte forma:

xkbcomp -xkb $DISPLAY xkbmap

Eu tentei passar o xkbdir e xkbmap para 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 do man page para o Xvfb afirmando:

In addition to the normal server options described in the Xserver(1) manual page, Xvfb accepts the following command line switches:

e a página man para o Xserver declarando:

−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 passar no -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 pego

_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 raiz,

1) Como posso executar Xvfb sem dispositivos de entrada? ou

2) Como posso obter apenas Xvfb para executar?

    
por Drakes 04.10.2016 / 21:31

3 respostas

2

Eu consegui executar o Xvfb sem raiz.

No final, eu baixei o código-fonte do link , injetou variáveis de ambiente, dependências instaladas (yum ), e compilou Xvfb e transferiu as bibliotecas binárias e compartilhadas para o meu sandbox.

Criticamente, em [sources]/xkb/xkbInit.c , adicionei essas linhas ao redor 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;
}

Eu posso definir as variáveis de ambiente XKB_BINDIR para o caminho binário xkbcomp (copiado para a caixa de proteção) e XKBDIR para onde meu arquivo default.xkm é.

Novamente, minha estratégia bem-sucedida foi compilar Xvfb da fonte com modificações. Para detalhes excruciantes e instruções passo-a-passo, eu escrevi isso no meu site aqui - link

@dirkt tinha uma abordagem interessante que era hackear o binário Xvfb e fazer manipulação de string. Isso é atraente, pois é rápido e um pouco desobediente, mas tinha desvantagens: 1) Eu não posso saber qual é o número do servidor com antecedência [1 .. 99], e 2) Meus caminhos são muito longos e exigiriam links simbólicos. Eu realmente tentei um comando NOP (:) como a substituição da string junto com a cópia manual do server-N.xkm , exceto que existem dois caminhos lógicos para lidar com o código-fonte, sendo um deles quando o xkm arquivo é armazenado em cache.

    
por 13.10.2016 / 19:12
1

Resposta parcial: como executar o Xvfb sem xkeycomp .

De acordo com sua descrição, seu principal problema não parece ser executar Xvfb como não-root (que 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 em que Xvfb os espera.

Isso é difícil de simular sem saber exatamente o que é e o que não está instalado no ambiente do CentOS em área restrita. Mas aqui está como se livrar da dependência xkeycomp :

Como o strings on Xvfb mostra, 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ão xkbInit.c e ddxLoad.c . De uma inspeção superficial, parece que o caminho para xkbcomp é hardwired. Mas a string é longa o suficiente para substituí-la por uma chamada para um script, o que mostra que Xvfb quer 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 a partir de stdin , no arquivo /tmp/server-1.xkm . Então, em uma máquina com X e ferramentas, copie essa descrição para um arquivo, diga default.xkb , e compile-a

xkbcomp -xkm default.xkb 

para default.xkm . Agora, corrija sua cópia de Xvfb na caixa de proteção do CentOS procurando a invocação:

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

e remendá-lo 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 do CentOS na área de segurança, ele provavelmente acionará o próximo problema. : -)

E a API X desacopla as funções para inspecionar o mapeamento do teclado a partir de dispositivos de entrada reais, portanto, mesmo que não haja dispositivos de entrada, um mapeamento de teclado ainda deve estar presente.

    
por 08.10.2016 / 20:32
1

Uma abordagem semelhante é usar o Xdummy, se xserver-xorg-video-dummy estiver disponível no sistema de 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 do xorg.conf no site xpra: link . Ele precisa que o X seja instalado, mas não precisa de um servidor X em execução.

(Desculpe, eu não tenho reputação suficiente para postar isso como um comentário)

    
por 12.10.2016 / 17:12