web-dev-qa-db-ja.com

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

ルートのないサーバーでの望ましい結果:

1)入力デバイスなしでXvfbを実行する、または

2)Xvfbを実行するだけです

バックグラウンド:

CentOSのビルドがほとんど同じである2台のマシンがあります。 1台のマシンにはrootアクセスとインターネットがあり、もう1台にはサンドボックス化(rootアクセスなし)があり、パッケージマネージャ(yumなし)とXserverはありません。 headless firefoxを試すために、ターゲットマシンでXvfbX virtual frame buffer )を実行しようとしています。 Xvfbが機能しているときは、xvfb-runを使用できます。

私が試したこと:

Xvfbバイナリとユーザー共有ライブラリを このメソッド を使用して正常に転送しました(回答の下のコメントを参照)。 Xvfbは次のように実行できます

Xvfb :1 -nolisten tcp -screen 0 1680x1050x16

しかし、キーマップエラーが表示されます(Aside: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

xkbdirxkbmapを渡して以下を実行しようとしましたが、成功しませんでした

Xvfb :1 -xkbdir ~/X11/xkb -xkbmap xkbmap -nolisten tcp -screen 0 1680x1050x16

-xkbdirは有効なパラメータですが、-xkbmapはXvfbの man page にもかかわらず、

Xserver(1)のマニュアルページで説明されている通常のサーバーオプションに加えて、Xvfbは次のコマンドラインスイッチを受け入れます。

そして man page 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を実行するにはどうすればよいですか?

5
Drakes

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_BINDIRxkbcompバイナリパス(サンドボックスにコピー)に設定し、XKBDIRdefault.xkmファイルの場所に設定できます。

繰り返しますが、私の成功した戦略は、ソースからXvfbを変更してコンパイルすることでした。厄介な詳細と段階的な手順については、これを自分のサイトのここに書いた- https://ericdraken.com/running-xvfb-on-a-shared-Host-without-x/ =


@dirktには、Xvfbバイナリをハックして文字列操作を行うという興味深いアプローチがありました。それは迅速でややエッチなので魅力的ですが、欠点がありました。1)サーバー番号が前もって何なのかわかりません[1 .. 99]、2)パスが長すぎてシンボリックリンクが必要になります。実際にNOPコマンド(:)を文字列の置換として試し、server-N.xkmを手動でコピーしましたが、2つの論理パスがあることを除きますxkmファイルがキャッシュされている場合に、ソースコードで対処します。

2
Drakes

部分的な回答:xkeycompなしでXvfbを実行する方法。

あなたの説明によると、あなたの主な問題は、Xvfbを非ルートとして実行することではないようです(私のシステムでは非常にうまく機能します)が、非ルートとしてxkeycompのような補助プログラムとそれに関連するデータファイルをインストールすることはできませんXvfbがそれらを期待する場所。

サンドボックス化されたCentOS環境に何がインストールされ、何がインストールされていないかを正確に理解しないと、これをシミュレートすることは困難です。しかし、ここにxkeycomp依存関係を取り除く方法があります:

stringsXvfbを使用しているように、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へ。次に、呼び出しを検索して、CentOSサンドボックス上のXvfbのコピーにパッチを適用します。

$ 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は、実際の入力デバイスからキーボードマッピングを検査する機能を切り離しているため、入力デバイスがない場合でも、キーボードマッピングが存在している必要があります。

1
dirkt

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

(申し訳ありませんが、これをコメントとして投稿するのに十分な評判がありません)

1
mviereck