如何在沒有 root 的情況下運行 Xvfb?

如何在沒有 root 的情況下運行 Xvfb?

在沒有 root 的伺服器上期望的結果:

1)Xvfb在沒有輸入設備的情況下運行,或者

2)開始Xvfb運行

背景:

我有兩台機器,它們的 CentOS 版本幾乎相同。一台機器具有 root 存取權和互聯網,另一台機器是沙箱(無 root 存取權限),沒有套件管理器(沒有 yum),也沒有 Xserver。我試著得到XvfbX虛擬幀緩衝區)在目標機器上運行進行實驗無頭火狐。工作的時候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

我嘗試傳遞xkbdirxkbmap運​​行以下命令但沒有成功

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 的機器上,或者

Xvfb1)沒有輸入設備如何運作?或者

2)我要怎樣才能開始Xvfb跑步?

答案1

部分答案:如何在沒有xkeycomp.

根據您的描述,您的主要問題似乎不是Xvfb以非root身份運行(在我的系統上運行得很好),而是作為非root您無法xkeycomp在該位置安裝輔助程序及其關聯的數據文件哪裡Xvfb期待他們。

如果不確切知道沙盒 CentOS 環境中安裝了什麼和未安裝什麼,就很難進行模擬。但擺脫xkeycomp依賴性的方法如下:

如使用stringsonXvfb所示, 的呼叫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 伺服器。

(抱歉,我沒有足夠的聲譽來發表此評論)

相關內容