Wie kann ich Xvfb ohne Root ausführen?

Wie kann ich Xvfb ohne Root ausführen?

Gewünschtes Ergebnis auf einem Server ohne Root:

1) XvfbOhne Eingabegeräte laufen oder

2) Fang einfach Xvfban 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 Xvfbes funktioniert, kann ich verwenden xvfb-run.

Was ich versucht habe:

Ich habe die XvfbBinärdatei und die vom Benutzer gemeinsam genutzten Bibliotheken erfolgreich übertragen mitdiese Methode(siehe den Kommentar unter der Antwort). Ich kann Xvfbso 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 xkbdirund xkbmapauszuführen, jedoch ohne Erfolg.

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

weil -xkbdirist ein gültiger Parameter, während -xkbmapist 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 Xvfbohne Eingabegeräte laufen? oder

2) Wie kann ich einfach Xvfbzum 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 Xvfbals Nicht-Root laufen hast (das klappt auf meinem System ganz gut), sondern dass du als Nicht-Root Hilfsprogramme wie xkeycompund die dazugehörigen Datendateien nicht an der Stelle installieren kannst, wo Xvfbsie 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 stringsvon on Xvfbzeigt, xkeycompsieht 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 xkbcompsei der Pfad zu fest verdrahtet. Aber die Zeichenfolge ist lang genug, um sie durch einen Aufruf eines Skripts zu ersetzen, was zeigt, dass Xvfbdie 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 Xvfbin 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 Xvfbdiese Binär- und gemeinsam genutzten Bibliotheken kompiliert und in meine Sandbox übertragen.

Entscheidend ist, dass [sources]/xkb/xkbInit.cich 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_BINDIRauf meinen xkbcompBinärpfad (in die Sandbox kopiert) und XKBDIRauf den Speicherort meiner default.xkmDatei 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)

verwandte Informationen