
Желаемый результат на сервере без рута:
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
:
Как показывает использование strings
on 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-сервер.
(Извините, у меня недостаточно репутации, чтобы опубликовать это как комментарий)