루트 없이 Xvfb를 실행하는 방법은 무엇입니까?

루트 없이 Xvfb를 실행하는 방법은 무엇입니까?

루트가 없는 서버에서 예상되는 결과:

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)

제가 몇 시간 동안 갇혀 있던 곳이 바로 여기였습니다. 루트가 없는 머신에서, 또는

Xvfb1) 입력 장치 없이 어떻게 작동하나요? 또는

2) 어떻게 Xvfb달리기를 시작할 수 있나요?

답변1

부분 답변: xkeycomp.

설명에 따르면 주요 문제는 Xvfb루트가 아닌 사용자(내 시스템에서는 제대로 작동함)로 실행되지 않는 것 같지만 루트가 아닌 사용자는 xkeycomp도우미 프로그램 및 관련 데이터 파일을 Xvfb예상한 위치에 설치할 수 없습니다.

샌드박스 CentOS 환경에 무엇이 설치되어 있고 설치되지 않았는지 정확히 알지 못하면 시뮬레이션하기가 어렵습니다. 하지만 xkeycomp종속성을 제거하는 방법은 다음과 같습니다.

stringson을 사용하여 표시된 것처럼 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.c815번 줄 주위에 다음 줄을 추가했다는 것입니다.

        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바이너리 경로(샌드박스에 복사됨)와 XKBDIRdefault.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 서버는 필요하지 않습니다.

(죄송합니다. 평판이 부족하여 이 댓글을 게시할 수 없습니다.)

관련 정보