
Gewünschtes Ergebnis auf einem Server ohne Root:
1) Xvfb
Ohne Eingabegeräte laufen oder
2) Fang einfach Xvfb
an zu laufen
Hintergrund:
Ich habe zwei Maschinen, die beide nahezu identische CentOS-Builds haben. Eine Maschine hat Root-Zugriff und Internet und die andere ist in einer Sandbox (kein Root-Zugriff) ohne Paketmanager (kein Yum) und ohne Xserver. Ich versuche, Xvfb
(X virtueller Frame-Puffer) auf dem Zielcomputer ausgeführt wird, um zu experimentieren mitkopfloser Firefox. Wenn Xvfb
es funktioniert, kann ich verwenden xvfb-run
.
Was ich versucht habe:
Ich habe die Xvfb
Binärdatei und die vom Benutzer gemeinsam genutzten Bibliotheken erfolgreich übertragen mitdiese Methode(siehe den Kommentar unter der Antwort). Ich kann Xvfb
so laufen
Xvfb :1 -nolisten tcp -screen 0 1680x1050x16
aber dann bekomme ich einen Keymap-Fehler (Beiseite:Ich möchte mich auch mit dem Problem des temporären Verzeichnisses befassen, wie ich es festgelegt habe 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)
Ich brauche überhaupt keine physische Tastatur- oder Mausunterstützung. Wenn jemand erklären könnte, wie es ohne Eingabegeräte läuft Xvfb
, dann können wir hier aufhören. Ich habe stundenlang erfolglos gesucht.
So habe ich versucht, xkb zum Laufen zu bringen:
Meine nächste Aktion bestand darin, die Datei zusammen mit den gemeinsam genutzten Bibliotheken von der Quellmaschine zu übertragen xkbcomp
. Als Nächstes exportierte ich die Keymap-Datei wie folgt von der Quellmaschine:
xkbcomp -xkb $DISPLAY xkbmap
Ich habe versucht, Folgendes einzugeben xkbdir
und xkbmap
auszuführen, jedoch ohne Erfolg.
Xvfb :1 -xkbdir ~/X11/xkb -xkbmap xkbmap -nolisten tcp -screen 0 1680x1050x16
weil -xkbdir
ist ein gültiger Parameter, während -xkbmap
ist nicht trotz dermanpagefür Xvfb mit der Aussage:
Zusätzlich zu den normalen Serveroptionen, die auf der Manualpage Xserver(1) beschrieben sind, akzeptiert Xvfb die folgenden Kommandozeilenschalter:
und dasmanpagefür Xserver mit der Angabe:
−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.
Wenn ich einfach -xkbdir übergebe
$ export PATH=~/bin:$PATH; # all copied binaries are here, including xkbcomp
$ Xvfb :1 -xkbdir ~/X11/xkb -nolisten tcp -screen 0 1680x1050x16
dann bekomme ich
_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)
Hier hänge ich seit Stunden fest. Auf einem Rechner ohne Root entweder
1) Wie kann ich Xvfb
ohne Eingabegeräte laufen? oder
2) Wie kann ich einfach Xvfb
zum Laufen kommen?
Antwort1
Teilantwort: Wie führt man Xvfb ohne aus xkeycomp
?
Deiner Beschreibung zufolge scheint dein Hauptproblem nicht darin zu liegen, dass du es Xvfb
als Nicht-Root laufen hast (das klappt auf meinem System ganz gut), sondern dass du als Nicht-Root Hilfsprogramme wie xkeycomp
und die dazugehörigen Datendateien nicht an der Stelle installieren kannst, wo Xvfb
sie erwartet werden.
Das lässt sich nur schwer simulieren, ohne genau zu wissen, was in Ihrer CentOS-Sandbox-Umgebung installiert ist und was nicht. So können Sie die Abhängigkeit jedoch beseitigen xkeycomp
:
Wie die Verwendung strings
von on Xvfb
zeigt, xkeycomp
sieht der Aufruf von wie folgt aus "%s%sxkbcomp" -w %d %s -xkm "%s" -em1 %s -emp %s -eml %s "%s%s.xkm"
, und die entsprechenden Quelldateien sindxkbInit.cUndddxLoad.c. Bei flüchtiger Betrachtung sieht es so aus, als xkbcomp
sei der Pfad zu fest verdrahtet. Aber die Zeichenfolge ist lang genug, um sie durch einen Aufruf eines Skripts zu ersetzen, was zeigt, dass Xvfb
die folgende Beschreibung kompiliert werden soll
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)" };
};
bereitgestellt von stdin
, in die Datei /tmp/server-1.xkm
. Auf einer Maschine mit X und Tools kopieren Sie diese Beschreibung also in eine Datei, sagen wir default.xkb
, und kompilieren sie
xkbcomp -xkm default.xkb
zu default.xkm
. Patchen Sie jetzt Ihre Kopie von Xvfb
in der CentOS-Sandbox, indem Sie nach dem Aufruf suchen:
$ grep -FobUa '"%s%sxkbcomp' Xvfb
1648800:"%s%sxkbcomp
und patchen Sie es mit einem Aufruf von cp
:
echo -n '/bin/cp /home/dirk/tmp/xvfb/default.xkm /tmp/server-1.xkm ' | dd bs=1 of=Xvfb seek=1648800 conv=notrunc
(natürlich mit Deiner Position und Deinem Weg dorthin default.xkm
).
Auf meinem Rechner funktioniert das einwandfrei, aber auf Ihrem CentOS-Sandbox-Rechner wird es jetzt wahrscheinlich das nächste Problem auslösen. :-)
Und die X-API entkoppelt die Funktionen zur Überprüfung der Tastaturzuordnung von den tatsächlichen Eingabegeräten, sodass auch dann eine Tastaturzuordnung vorhanden sein muss, wenn keine Eingabegeräte vorhanden sind.
Antwort2
Es ist mir gelungen, Xvfb ohne Root zum Laufen zu bringen.
Am Ende habe ich den Quellcode heruntergeladen vonhttps://www.x.org/wiki/Releases/Download/, Umgebungsvariablen eingefügt, Abhängigkeiten (yum) installiert und Xvfb
diese Binär- und gemeinsam genutzten Bibliotheken kompiliert und in meine Sandbox übertragen.
Entscheidend ist, dass [sources]/xkb/xkbInit.c
ich diese Zeilen um Zeile 815 herum hinzugefügt habe:
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;
}
Ich kann die Umgebungsvariablen XKB_BINDIR
auf meinen xkbcomp
Binärpfad (in die Sandbox kopiert) und XKBDIR
auf den Speicherort meiner default.xkm
Datei einstellen.
Auch hier war meine erfolgreiche Strategie, aus dem Quellcode mit Änderungen zu kompilieren Xvfb
. Für quälende Details und schrittweise Anleitungen habe ich dies hier auf meiner Website aufgeschrieben -https://ericdraken.com/running-xvfb-on-a-shared-host-without-x/
@dirkt hatte einen interessanten Ansatz, der darin bestand, die Xvfb-Binärdatei zu hacken und Zeichenfolgenmanipulationen durchzuführen. Das ist ansprechend, da es schnell und etwas frech ist, aber es hatte Nachteile: 1) Ich kann die Servernummer nicht im Voraus kennen [1 .. 99] und 2) Meine Pfade sind zu lang und würden Symlinks erfordern. Ich habe tatsächlich einen NOP-Befehl (:) als Zeichenfolgenersatz zusammen mit dem manuellen Kopieren von ausprobiert server-N.xkm
, außer dass es gibtzweiIm Quellcode muss mit mehreren logischen Pfaden gerechnet werden, einer davon ist die Zwischenspeicherung der xkm-Datei.
Antwort3
Ein ähnlicher Ansatz ist die Verwendung von Xdummy, wenn xserver-xorg-video-dummy auf Ihrem Sandbox-System verfügbar ist. Es verwendet einige Dummy-Treiber und stellt einen X-Server bereit, der ohne Root-Rechte ausgeführt werden kann. Einige Erklärungen und ein Beispiel für xorg.conf finden Sie auf der xpra-Website:https://xpra.org/trac/wiki/Xdummy. X muss installiert sein, es ist jedoch kein laufender X-Server erforderlich.
(Entschuldigung, mein Ruf reicht nicht aus, um dies als Kommentar zu posten)