
在沒有 root 的伺服器上期望的結果:
1)Xvfb
在沒有輸入設備的情況下運行,或者
2)開始Xvfb
運行
背景:
我有兩台機器,它們的 CentOS 版本幾乎相同。一台機器具有 root 存取權和互聯網,另一台機器是沙箱(無 root 存取權限),沒有套件管理器(沒有 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)
這就是我被困了幾個小時的地方。在沒有 root 的機器上,或者
Xvfb
1)沒有輸入設備如何運作?或者
2)我要怎樣才能開始Xvfb
跑步?
答案1
部分答案:如何在沒有xkeycomp
.
根據您的描述,您的主要問題似乎不是Xvfb
以非root身份運行(在我的系統上運行得很好),而是作為非root您無法xkeycomp
在該位置安裝輔助程序及其關聯的數據文件哪裡Xvfb
期待他們。
如果不確切知道沙盒 CentOS 環境中安裝了什麼和未安裝什麼,就很難進行模擬。但擺脫xkeycomp
依賴性的方法如下:
如使用strings
onXvfb
所示, 的呼叫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
我成功地在沒有 root 的情況下運行 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)我的路徑太長並且需要符號連結。我實際上嘗試了 NOP 命令 (:) 作為字串替換以及手動複製server-N.xkm
,除了有二原始碼中需要處理的邏輯路徑,其中之一是當 xkm 檔案被快取時。
答案3
類似的方法是使用 Xdummy(如果 xserver-xorg-video-dummy 在您的沙盒系統上可用)。它使用一些虛擬驅動程式並提供無需 root 權限即可運行的 X 伺服器。您可以在 xpra 網站上找到一些解釋和範例 xorg.conf:https://xpra.org/trac/wiki/Xdummy。它需要安裝 X,但不需要正在運行的 X 伺服器。
(抱歉,我沒有足夠的聲譽來發表此評論)