
Resultado deseado en un servidor sin root:
1) Ejecutar Xvfb
sin dispositivos de entrada, o
2) Solo ponte Xvfb
a 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 Xvfb
está funcionando, puedo usar xvfb-run
.
Lo que he probado:
He transferido con éxito las Xvfb
bibliotecas binaria y compartida por el usuario usandoeste método(vea el comentario debajo de la respuesta). Puedo correr Xvfb
así
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 Xvfb
sin 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 xkbcomp
desde 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 xkbdir
y xkbmap
ejecutar lo siguiente sin éxito
Xvfb :1 -xkbdir ~/X11/xkb -xkbmap xkbmap -nolisten tcp -screen 0 1680x1050x16
porque -xkbdir
es un parámetro válido, mientras que -xkbmap
no 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 Xvfb
sin dispositivos de entrada? o
2) ¿Cómo puedo empezar Xvfb
a correr?
Respuesta1
Respuesta parcial: Cómo ejecutar Xvfb sin xkeycomp
.
Según su descripción, su principal problema no parece ser ejecutar Xvfb
como no root (eso funciona bastante bien en mi sistema), sino que como no root no puede instalar programas auxiliares como xkeycomp
y sus archivos de datos asociados en el lugar. donde Xvfb
los 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 xkeycomp
dependencia:
Como se muestra strings
en el uso Xvfb
, la invocación de xkeycomp
parece "%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 xkbcomp
está cableado. Pero la cadena es lo suficientemente larga como para reemplazarla con una llamada a un script, lo que muestra que Xvfb
desea 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 Xvfb
en 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é Xvfb
y transfirí esas bibliotecas binarias y compartidas a mi entorno de pruebas.
Fundamentalmente, [sources]/xkb/xkbInit.c
agregué 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_BINDIR
en mi xkbcomp
ruta binaria (copiada en la zona de pruebas) y XKBDIR
donde default.xkm
está mi archivo.
Nuevamente, mi estrategia exitosa fue compilar Xvfb
desde 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)