Как запустить Xvfb без рута?

Как запустить Xvfb без рута?

Желаемый результат на сервере без рута:

1) Запустить Xvfbбез устройств ввода или

2) Просто Xvfbбеги

Фон:

У меня есть две машины, обе с почти идентичными сборками CentOS. Одна машина имеет root-доступ и интернет, а другая находится в песочнице (без root-доступа) без менеджеров пакетов (без yum) и без Xserver. Я пытаюсь получить Xvfb(X виртуальный буфер кадра) запущен на целевой машине для экспериментов сбезголовый firefox. Когда Xvfbработает, я могу использовать xvfb-run.

Что я пробовал:

Я успешно перенес Xvfbдвоичные файлы и общие библиотеки пользователя с помощьюЭтот метод(см. комментарий под ответом). Я могу бегать Xvfbтак

Xvfb :1 -nolisten tcp -screen 0 1680x1050x16

но затем я получаю ошибку раскладки клавиатуры (В стороне:Я также хотел бы разобраться с этой проблемой временного каталога, как я установил 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)

Мне вообще не нужна поддержка физической клавиатуры или мыши.. Если кто-то может объяснить, как работать Xvfbбез устройств ввода, то мы можем остановиться здесь. Я искал часами, но безуспешно.


Как я пытался заставить xkb работать:

Моим следующим действием было перенести xkbcompс исходной машины вместе с общими библиотеками. Затем я экспортировал файл раскладки клавиатуры с исходной машины следующим образом:

xkbcomp -xkb $DISPLAY xkbmap

Я пытался передать xkbdirи xkbmapзапустить следующее, но безуспешно

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

поскольку -xkbdirявляется допустимым параметром, тогда как -xkbmapне является, несмотря настраница руководствадля Xvfb указано:

В дополнение к обычным параметрам сервера, описанным на странице руководства Xserver(1), Xvfb принимает следующие параметры командной строки:

истраница руководствадля Xserver указано:

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

Если я просто передам -xkbdir

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

тогда я получаю

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

Вот где я застрял на несколько часов. На машине без рута, либо

1) Как можно работать Xvfbбез устройств ввода? или

2) Как мне просто начать Xvfbбегать?

решение1

Частичный ответ: как запустить Xvfb без xkeycomp.

Согласно вашему описанию, ваша главная проблема заключается не в запуске Xvfbбез прав root (что вполне нормально работает на моей системе), а в том, что без прав root вы не можете устанавливать вспомогательные программы, такие как , xkeycompи связанные с ними файлы данных в том месте, где Xvfbих ожидаете.

Это трудно смоделировать, не зная точно, что установлено, а что нет в вашей изолированной среде CentOS. Но вот как избавиться от зависимости xkeycomp:

Как показывает использование stringson Xvfb, вызов xkeycompвыглядит так "%s%sxkbcomp" -w %d %s -xkm "%s" -em1 %s -emp %s -eml %s "%s%s.xkm", а соответствующие исходные файлы —xkbInit.cиddxLoad.c. При беглом осмотре кажется, что путь к xkbcompжестко зашит. Но строка достаточно длинная, чтобы заменить ее вызовом скрипта, который показывает, что Xvfbхочет скомпилировать следующее описание

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

предоставлено из stdin, в файл /tmp/server-1.xkm. Так что на машине с X и инструментами скопируйте это описание в файл, скажем default.xkb, и скомпилируйте его

xkbcomp -xkm default.xkb 

в default.xkm. Теперь исправьте свою копию Xvfbв песочнице CentOS, выполнив поиск вызова:

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

и исправьте его вызовом cp:

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

(конечно, с учетом вашей должности и вашего пути к default.xkm).

На моей машине это работает нормально, но на вашей изолированной машине CentOS это, скорее всего, вызовет следующую проблему. :-)

А X API отделяет функции проверки сопоставления клавиатуры от реальных устройств ввода, поэтому даже если устройства ввода отсутствуют, сопоставление клавиатуры все равно должно присутствовать.

решение2

Мне удалось успешно запустить Xvfb без прав root.

В конце концов, я скачал исходный код с сайтаhttps://www.x.org/wiki/Releases/Download/, внедрил переменные среды, установил зависимости (yum), скомпилировал Xvfbи перенес этот двоичный файл и общие библиотеки в мою песочницу.

Что особенно важно, [sources]/xkb/xkbInit.cя добавил эти строки около строки 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;
}

Я могу установить переменные среды XKB_BINDIRна мой xkbcompдвоичный путь (скопированный в песочницу) и XKBDIRна то, где находится мой default.xkmфайл.

Опять же, моя успешная стратегия заключалась в компиляции Xvfbиз исходников с модификациями. Для мучительных подробностей и пошаговых инструкций я написал это на своем сайте здесь -https://ericdraken.com/running-xvfb-on-a-shared-host-without-x/


@dirkt придумал интересный подход, который заключался во взломе двоичного файла Xvfb и выполнении строковых манипуляций. Это заманчиво, так как это быстро и немного непослушно, но у этого есть недостатки: 1) Я не могу знать заранее номер сервера [1 .. 99] и 2) Мои пути слишком длинные и потребуют символических ссылок. Я на самом деле попробовал команду NOP (:) в качестве замены строки вместе с ручным копированием server-N.xkm, за исключением того, что естьдвалогические пути, с которыми приходится иметь дело в исходном коде, один из которых возникает при кэшировании файла xkm.

решение3

Аналогичный подход заключается в использовании Xdummy, если xserver-xorg-video-dummy доступен в вашей изолированной системе. Он использует некоторые фиктивные драйверы и предоставляет X-сервер, который может работать без привилегий root. Вы можете найти некоторые объяснения и пример xorg.conf на сайте xpra:https://xpra.org/trac/wiki/Xdummy. Для этого требуется установить X, но не требуется работающий X-сервер.

(Извините, у меня недостаточно репутации, чтобы опубликовать это как комментарий)

Связанный контент