Ubuntu

來自 Linux 的 GUI 遠端無頭流式傳輸:X 在登錄前說“未指定協議”

  • May 21, 2016

目標:

我想流式傳輸我在無頭 Linux 機器上執行的 Java 程序的圖形輸出的影片(即到 Twitch)。我還希望能夠在不連接監視器的情況下遠端啟動它,例如,我可以sudo reboot通過 SSH 進行操作,然後在重新啟動後使用 SSH 再次啟動它。

我已經取得了實質性進展,第一部分基本上有效。然而,在這一點上,我對 ​​Linux 的了解太深了,無法對所有部分有一個有用的心智模型,所以我希望能得到一些關於下一步嘗試的建議。在我看來,問題在於登錄過程和/或登錄管理器以及它與 X 伺服器的關係,以及控制台使用者和虛擬使用者之間的區別。

問題:

  • 如果我將機器連接到顯示器和鍵盤並登錄,流式傳輸將按預期工作。我可以通過執行(在不同的螢幕會話中)通過 SSH 啟動應用程序和流:
DISPLAY=:0 ./gradlew viz
DISPLAY=:0 obs --startstreaming
  • 但是,如果我不登錄,這些應用程序將與 glxinfo 一起失敗。

如果我執行DISPLAY=:0 glxinfo

No protocol specified
Error: unable to open display :0

(嘗試使用不存在的顯示器時第一行不會出現,所以 :0 存在但由於某種原因無法正常工作。登錄後,glxinfo 按預期工作。)

在 Java 程序中,我得到:

Exception in thread "main" java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable.
       at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
       (etc.)

obs給了我:

No protocol specified
QXcbConnection: Could not connect to display :0
Aborted (core dumped)

ps aux 顯示一個正在執行的 Xorg 程序:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1227  0.1  0.2 149588 48116 tty7     Ss+  16:14   0:01 /usr/lib/xorg/Xorg :0 vt7 -nolisten tcp -auth /var/lib/xdm/authdir/authfiles/A:0-vcuAPl

正如我之前提到的,我真的很想避免任何我必須在電腦的物理位置的正常步驟,比如在連接到它的鍵盤上打字。

有關我目前設置的詳細資訊:

  • 我正在使用物理機器,而不是虛擬機。它執行的是 Ubuntu Server 16.04。
  • 這個盒子的主要目的是執行這個程序和我寫的其他一些程序。如有必要,我願意對已安裝的軟體進行重大更改以使其正常工作。重新安裝或更換作業系統是一種選擇,儘管很煩人。
  • 我正在使用 OBS Studio for Linux 進行流式傳輸。它最近添加了一個 –startstreaming 命令行參數,因此在連接了監視器後配置流一次後,我可以隨時遠端啟動流。
  • Linux 上的 OBS Studio 需要支持 OpenGL 3.2,因此我將 GeForce 9500 GT 重新用於電腦。只要我使用 NVidia 專有驅動程序(’nvidia-current’),它就支持必需版本的 OpenGL。
  • 與標準的 Ubuntu Server 安裝不同,我還必須執行 X 伺服器,並且我假設我還需要執行視窗管理器。為此,我根據以下頁面安裝了 Xorg、Fluxbox 和 XDM:https ://help.ubuntu.com/community/ServerGUI和https://help.ubuntu.com/community/Installation/LowMemorySystems,儘管在實際上,使用 GNOME(或 Ubuntu 桌面安裝)之類的東西不會有真正的問題。
  • 我買了一個“假顯示器”HDMI dongle,它似乎可以工作,所以不用擔心軟體解決方案會讓電腦認為連接了顯示器。(當我在連接電腦或連接實際監視器的情況下啟動電腦時, ps aux 顯示一個 Xorg 程序,顯示為:0;當它在未連接的情況下啟動時,該程序不存在。)

編輯:結果

這已被破解為更可用的狀態。我確信那裡有更好的解決方案,但我不再需要物理訪問流媒體盒。

首先,我刪除了 xdm。然後我添加了一個在啟動過程中執行“startx”的腳本。該腳本顯然以 root 身份執行,這會導致 Xauthority 問題和有關 MIT-MAGIC-COOKIE 的錯誤消息;所以我讓腳本執行 startx 並將 XAUTHORITY 設置為/home/myUsername/.Xauthority. 這需要另一種解決方法;我必須sudo chown在啟動後將 .Xauthority 文件返回給我的使用者(其所有權設置為 root)。在此之後,我可以按預期在 DISPLAY :0 中執行程序。

我可以推薦閱讀有關該主題的 ArchLinux wiki 頁面,因為它與最近使用 systemd 的 Ubuntu 有很多共同之處。擁有會話權限以及能夠在沒有 setuid root 的情況下執行 X 伺服器帶來了許多新問題。

首先設置一個 VT的自動登錄,然後從那裡執行startx或 xinit。其他要閱讀的頁面位於Xorg伺服器、顯示管理器systemd 使用者上。還要尋找關鍵字資訊亭模式,因為它與您想要的相似。我還沒有這樣做,所以無法提供更多細節。

引用自:https://unix.stackexchange.com/questions/283343