¿Cómo ejecutar Xvfb sin root?

¿Cómo ejecutar Xvfb sin root?

Resultado deseado en un servidor sin root:

1) Ejecutar Xvfbsin dispositivos de entrada, o

2) Solo ponte Xvfba correr

Fondo:

Tengo dos máquinas, ambas con versiones casi idénticas de CentOS. Una máquina tiene acceso de root e Internet y la otra está protegida (sin acceso de root) sin administradores de paquetes (sin yum) ni Xserver. Estoy tratando de conseguir Xvfb(X búfer de trama virtual) ejecutándose en la máquina de destino para experimentar conFirefox sin cabeza. Cuando Xvfbestá funcionando, puedo usar xvfb-run.

Lo que he probado:

He transferido con éxito las Xvfbbibliotecas binaria y compartida por el usuario usandoeste método(vea el comentario debajo de la respuesta). Puedo correr Xvfbasí

Xvfb :1 -nolisten tcp -screen 0 1680x1050x16

pero luego aparece un error de mapa de teclas (Aparte:También me gustaría solucionar el problema del directorio temporal como lo configuré 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)

No necesito ningún soporte físico para teclado o mouse. Si alguien pudiera explicar cómo ejecutarlo Xvfbsin dispositivos de entrada, entonces podemos detenernos aquí. He buscado durante horas sin éxito.


Cómo intenté hacer que xkb funcionara:

Mi siguiente acción fue traer xkbcompdesde la máquina fuente junto con las bibliotecas compartidas. Luego exporté el archivo del mapa de teclas desde la máquina fuente de esta manera:

xkbcomp -xkb $DISPLAY xkbmap

Intenté pasar xkbdiry xkbmapejecutar lo siguiente sin éxito

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

porque -xkbdires un parámetro válido, mientras que -xkbmapno lo es a pesar depágina de manualpara Xvfb indicando:

Además de las opciones normales del servidor descritas en la página del manual de Xserver(1), Xvfb acepta los siguientes modificadores de línea de comando:

y elpágina de manualpara Xserver indicando:

−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.

Si solo paso -xkbdir

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

entonces entiendo

_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)

Aquí es donde he estado atrapado durante horas. En una máquina sin root, tampoco

1) ¿Cómo puedo ejecutar Xvfbsin dispositivos de entrada? o

2) ¿Cómo puedo empezar Xvfba correr?

Respuesta1

Respuesta parcial: Cómo ejecutar Xvfb sin xkeycomp.

Según su descripción, su principal problema no parece ser ejecutar Xvfbcomo no root (eso funciona bastante bien en mi sistema), sino que como no root no puede instalar programas auxiliares como xkeycompy sus archivos de datos asociados en el lugar. donde Xvfblos espera.

Esto es difícil de simular sin saber exactamente qué está y qué no está instalado en su entorno CentOS de espacio aislado. Pero aquí se explica cómo deshacerse de la xkeycompdependencia:

Como se muestra stringsen el uso Xvfb, la invocación de xkeycompparece "%s%sxkbcomp" -w %d %s -xkm "%s" -em1 %s -emp %s -eml %s "%s%s.xkm"y los archivos fuente correspondientes sonxkbInit.cyddxLoad.c. Tras una inspección superficial, parece que el camino hacia xkbcompestá cableado. Pero la cadena es lo suficientemente larga como para reemplazarla con una llamada a un script, lo que muestra que Xvfbdesea compilar la siguiente descripción.

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)" };
};

proporcionado desde stdin, en el archivo /tmp/server-1.xkm. Entonces, en una máquina con X y herramientas, copie esta descripción en un archivo, por ejemplo default.xkb, y compílelo.

xkbcomp -xkm default.xkb 

a default.xkm. Ahora parchee su copia Xvfben el entorno limitado de CentOS buscando la invocación:

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

y parchearlo con una llamada a cp:

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

(por supuesto con tu posición y tu camino hacia default.xkm).

Eso funciona bien en mi máquina, pero en su máquina CentOS protegida ahora probablemente provocará el siguiente problema. :-)

Y la API X desacopla las funciones para inspeccionar la asignación del teclado de los dispositivos de entrada reales, por lo que incluso si no hay dispositivos de entrada, aún debe haber una asignación de teclado presente.

Respuesta2

Pude ejecutar Xvfb sin root.

Al final, descargué el código fuente dehttps://www.x.org/wiki/Releases/Download/, inyecté variables de entorno, instalé dependencias (yum) y compilé Xvfby transfirí esas bibliotecas binarias y compartidas a mi entorno de pruebas.

Fundamentalmente, [sources]/xkb/xkbInit.cagregué estas líneas alrededor de la línea 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;
}

Puedo configurar las variables de entorno XKB_BINDIRen mi xkbcompruta binaria (copiada en la zona de pruebas) y XKBDIRdonde default.xkmestá mi archivo.

Nuevamente, mi estrategia exitosa fue compilar Xvfbdesde el código fuente con modificaciones. Para obtener detalles insoportables e instrucciones paso a paso, escribí esto en mi sitio aquí:https://ericdraken.com/running-xvfb-on-a-shared-host- without-x/


@dirkt tenía un enfoque interesante que consistía en piratear el binario Xvfb y manipular cadenas. Eso es atractivo porque es rápido y algo travieso, pero tiene inconvenientes: 1) No puedo saber de antemano cuál es el número del servidor [1 .. 99], y 2) Mis rutas son demasiado largas y requerirían enlaces simbólicos. De hecho, probé un comando NOP (:) como reemplazo de cadena junto con la copia manual de server-N.xkm, excepto que haydosrutas lógicas con las que lidiar en el código fuente, una de las cuales es cuando el archivo xkm está almacenado en caché.

Respuesta3

Un enfoque similar es utilizar Xdummy, si xserver-xorg-video-dummy está disponible en su sistema de espacio aislado. Utiliza algunos controladores ficticios y proporciona un servidor X que puede ejecutarse sin privilegios de root. Puede encontrar algunas explicaciones y un xorg.conf de muestra en el sitio web de xpra:https://xpra.org/trac/wiki/Xdummy. Necesita que X esté instalado, pero no necesita un servidor X en ejecución.

(Lo siento, no tengo suficiente reputación para publicar esto como comentario)

información relacionada