
루트가 없는 서버에서 원하는 결과:
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
부분 답변: .NET 파일 없이 Xvfb를 실행하는 방법
설명에 따르면 주요 문제는 Xvfb
루트가 아닌 사용자로 실행되는 것 같지 않지만(내 시스템에서는 꽤 잘 작동함) 루트가 아닌 사용자는 xkeycomp
해당 위치에 보조 프로그램 및 관련 데이터 파일을 설치할 수 없습니다. 어디에서 Xvfb
그들을 기대하는지.
샌드박스 CentOS 환경에 무엇이 설치되어 있고 설치되어 있지 않은지 정확히 알지 못하면 시뮬레이션하기가 어렵습니다. 그러나 종속성을 제거하는 방법은 다음과 같습니다 xkeycomp
.
strings
쇼 에서 사용하는 것처럼 보이는 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를 성공적으로 실행할 수 있었습니다.
결국 소스코드를 다운받았는데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) 경로가 너무 길고 심볼릭 링크가 필요합니다. 나는 실제로 server-N.xkm
의 수동 복사와 함께 문자열 교체로 NOP 명령(:)을 시도했습니다.둘소스 코드에서 다뤄야 할 논리 경로 중 하나는 xkm 파일이 캐시될 때입니다.
답변3
유사한 접근 방식은 샌드박스 시스템에서 xserver-xorg-video-dummy를 사용할 수 있는 경우 Xdummy를 사용하는 것입니다. 일부 더미 드라이버를 사용하고 루트 권한 없이 실행할 수 있는 X 서버를 제공합니다. xpra 웹사이트에서 몇 가지 설명과 샘플 xorg.conf를 찾을 수 있습니다.https://xpra.org/trac/wiki/Xdummy. X를 설치해야 하지만 실행 중인 X 서버는 필요하지 않습니다.
(죄송합니다. 평판이 부족하여 댓글로 게시할 수 없습니다.)