來自 Linux 的 GUI 遠端無頭流式傳輸:X 在登錄前說“未指定協議”
目標:
我想流式傳輸我在無頭 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 使用者上。還要尋找關鍵字資訊亭模式,因為它與您想要的相似。我還沒有這樣做,所以無法提供更多細節。