目标:

目标:

目标:

我想要流式传输我在无头 Linux 机器上运行的 Java 程序的图形输出的视频(即到 Twitch)。我还希望能够在不连接显示器的情况下远程启动它,例如,这样我可以通过sudo rebootSSH 进行操作,然后在重新启动后使用 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/ServerGUIhttps://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 中运行程序。

答案1

我建议您阅读有关此主题的 ArchLinux wiki 页面,因为它与最近使用 systemd 的 Ubuntu 有很多共同点。引入了很多新问题会议权限,并且能够在没有 setuid root 的情况下运行 X 服务器。

首先设置一个自动登录到 VT,然后运行启动x或从那里 xinit 。其他要阅读的页面位于奥格服务器和显示管理器系统用户。还找关键词信息亭模式因为它与你想要的相似。我还没有做过任何这些,所以无法提供更多细节。

相关内容