루트가 없는 서버에서 예상되는 결과:
1) Xvfb
입력 장치 없이 실행하거나
2) Xvfb
달리기 시작
배경:
거의 동일한 버전의 CentOS를 사용하는 두 대의 컴퓨터가 있습니다. 한 시스템에는 루트 액세스와 인터넷이 있고, 다른 시스템은 샌드박스(루트 액세스 없음)이며 패키지 관리자(yum 없음) 및 Xserver가 없습니다. 나는 Xvfb
(X 가상 프레임버퍼) 실험을 위해 대상 컴퓨터에서 실행헤드리스 파이어폭스. 일하면서 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)
제가 몇 시간 동안 갇혀 있던 곳이 바로 여기였습니다. 루트가 없는 머신에서, 또는
Xvfb
1) 입력 장치 없이 어떻게 작동하나요? 또는
2) 어떻게 Xvfb
달리기를 시작할 수 있나요?
답변1
부분 답변: xkeycomp
.
설명에 따르면 주요 문제는 Xvfb
루트가 아닌 사용자(내 시스템에서는 제대로 작동함)로 실행되지 않는 것 같지만 루트가 아닌 사용자는 xkeycomp
도우미 프로그램 및 관련 데이터 파일을 Xvfb
예상한 위치에 설치할 수 없습니다.
샌드박스 CentOS 환경에 무엇이 설치되어 있고 설치되지 않았는지 정확히 알지 못하면 시뮬레이션하기가 어렵습니다. 하지만 xkeycomp
종속성을 제거하는 방법은 다음과 같습니다.
strings
on을 사용하여 표시된 것처럼 Xvfb
호출 xkeycomp
은 다음과 같 "%s%sxkbcomp" -w %d %s -xkm "%s" -em1 %s -emp %s -eml %s "%s%s.xkm"
으며 해당 소스 파일은 다음과 같습니다.xkb 초기화 프로그램그리고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를 성공적으로 실행했습니다.
마지막으로 다음 웹사이트에서 소스 코드를 다운로드했습니다.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 서버를 제공합니다. xpra 웹사이트에서 xorg.conf에 대한 몇 가지 설명과 예제를 찾을 수 있습니다.https://xpra.org/trac/wiki/Xdummy. X를 설치해야 하지만 실행 중인 X 서버는 필요하지 않습니다.
(죄송합니다. 평판이 부족하여 이 댓글을 게시할 수 없습니다.)