ルートなしでXvfbを実行する方法は?

ルートなしでXvfbを実行する方法は?

ルートなしのサーバーで予想される結果:

1)Xvfb入力装置なしで実行するか

2)Xvfb走り始める

背景:

ほぼ同じバージョンのCentOSを使用する2台のコンピュータがあります。あるシステムにはルートアクセスとインターネットがあり、他のシステムはサンドボックス(ルートアクセスなし)で、パッケージマネージャ(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)

私が何時間も閉じ込められていた場所はここでした。ルートのないマシンで、または

Xvfb1)入力装置なしでどのように機能しますか?または

2)どのようにXvfb走り始めることができますか?

答え1

部分的な答え: xkeycomp

説明によると、主な問題は、Xvfbroot以外のユーザー(私のシステムでは正しく動作します)で実行されていないようですが、root以外のユーザーは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)。

私のコンピュータでは正常に動作しましたが、Sandbox 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二つ処理する必要があるソースコードの論理パスの1つは、xkmファイルがキャッシュされる場合です。

答え3

同様のアプローチはXdummyを使用することです(サンドボックスシステムでxserver-xorg-video-dummyを使用できる場合)。いくつかの仮想ドライバを使用し、root権限なしで実行できるXサーバーを提供します。 xpraのウェブサイトでxorg.confのいくつかの説明と例を見つけることができます。https://xpra.org/trac/wiki/Xdummy。 Xをインストールする必要がありますが、実行中のXサーバーは必要ありません。

(申し訳ありません。評判が不足しているため、このコメントを投稿できません。)

関連情報