目标:
我想要流式传输我在无头 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。
- 该框的主要用途是运行该程序和我编写的其他一些程序。如有必要,我愿意对已安装的软件进行重大更改以使其正常工作。重新安装或更换操作系统是一种选择,尽管很烦人。
- 我正在使用适用于 Linux 的 OBS Studio 进行流式传输。它最近添加了一个 --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适配器,它似乎可以工作,所以不用担心软件解决方案让计算机认为已连接显示器。 (当我在连接了显示器或实际显示器的情况下启动计算机时,ps aux 显示一个带有 display :0 的 Xorg 进程;当它在没有连接显示器或实际显示器的情况下启动时,该进程不存在。)
编辑:结果
这已被破解为更可用的状态。我确信有更好的解决方案,但我不再需要物理访问流媒体盒。
首先我删除了xdm。然后我添加了一个在启动过程中运行“startx”的脚本。该脚本显然以 root 身份运行,这会导致 Xauthority 问题和有关 MIT-MAGIC-COOKIE 的错误消息;所以我让脚本运行 startx 并将 XAUTHORITY 设置为/home/myUsername/.Xauthority
。这需要另一种解决方法;启动后我必须将sudo chown
.Xauthority 文件返回给我的用户(其所有权设置为 root)。之后,我可以按预期在 DISPLAY :0 中运行程序。