1)入力デバイスなしでXvfb
を実行する、または
2)Xvfb
を実行するだけです
CentOSのビルドがほとんど同じである2台のマシンがあります。 1台のマシンにはrootアクセスとインターネットがあり、もう1台にはサンドボックス化(rootアクセスなし)があり、パッケージマネージャ(yumなし)とXserverはありません。 headless firefoxを試すために、ターゲットマシンでXvfb
( X 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
を実行する方法を誰かが説明できたら、ここで止めることができます。私は何時間も検索しましたが、成功しませんでした。
次のアクションは、ソースライブラリからxkbcomp
を共有ライブラリと一緒に持ち込むことでした。次に、次のようにソースマシンからキーマップファイルをエクスポートしました。
xkbcomp -xkb $DISPLAY xkbmap
xkbdir
とxkbmap
を渡して以下を実行しようとしましたが、成功しませんでした
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
を実行するにはどうすればよいですか?
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_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
を手動でコピーしましたが、2つの論理パスがあることを除きますxkmファイルがキャッシュされている場合に、ソースコードで対処します。
部分的な回答:xkeycomp
なしで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
へ。次に、呼び出しを検索して、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は、実際の入力デバイスからキーボードマッピングを検査する機能を切り離しているため、入力デバイスがない場合でも、キーボードマッピングが存在している必要があります。
サンドボックス化されたシステムでxserver-xorg-video-dummyが利用可能な場合は、同様のアプローチでXdummyを使用します。いくつかのダミードライバーを使用し、ルート権限なしで実行できるXサーバーを提供します。 xpraのウェブサイトでいくつかの説明とサンプルxorg.confを見つけることができます: https://xpra.org/trac/wiki/Xdummy 。 Xをインストールする必要がありますが、実行中のXサーバーは必要ありません。
(申し訳ありませんが、これをコメントとして投稿するのに十分な評判がありません)