只有一个 X Screen 工作;如何获得两个X屏幕?

只有一个 X Screen 工作;如何获得两个X屏幕?

在内部nvidia-settings(以sudo提升的权限运行),我无法让第二个 X Screen 工作。这是我尝试过的一件事的逐步描述:

  1. 在左侧选择“X服务器显示配置”
  2. 选择辅助显示器(连接到接收器的显示器)
  3. 在“配置”下拉列表中选择“新 X 屏幕(需要重新启动 X)”
  4. 选择“应用”
  5. 当弹出“无法应用”对话框,说明配置必须保存到 X 配置文件时,选择“应用可能的内容”(然后可能需要在 15 秒内选择“确定”以保留更改)
  6. 选择“保存到X配置文件”并“保存”

要重新启动 X Server 以使更改生效,我尝试了多种方法,例如重新启动计算机并通过以下方式重新启动 X Server 进程:

sudo systemctl restart display-manager

经过多次尝试,仍然只有一个 X Screen。我systemd通过查了日记的内容journalctl -e _COMM=gdm-x-session。这是一个有趣的摘录:

(II) NVIDIA(0): Validated MetaModes:
(II) NVIDIA(0):     "DP-0:nvidia-auto-select+0+0"
(II) NVIDIA(0): Virtual screen size determined to be 2560 x 1440
(--) NVIDIA(0): DPI set to (108, 107); computed from "UseEdidDpi" X config
(--) NVIDIA(0):     option
(EE) NVIDIA(G0): GeForce GTX 960 (GPU-0) already has an X screen assigned;
(EE) NVIDIA(G0):     skipping this GPU screen
(EE) NVIDIA(G0): Failing initialization of X screen

这是一段有点有趣的摘录:

(II) Loading sub module "glxserver_nvidia"
(II) LoadModule: "glxserver_nvidia"
(II) Loading /usr/lib64/xorg/modules/extensions/libglxserver_nvidia.so
(II) Module glxserver_nvidia: vendor="NVIDIA Corporation"
        compiled for 1.6.99.901, module version = 1.0.0
        Module class: X.Org Server Extension
(II) NVIDIA GLX Module  440.82  Wed Apr  1 19:47:36 UTC 2020
(II) NVIDIA: The X server supports PRIME Render Offload.
(WW) NVIDIA(0): Failed to initialize Base Mosaic!  Reason: Only one GPU
(WW) NVIDIA(0):     detected.  Only one GPU will be used for this X screen.

这是一段不太有趣的摘录:

(II) Initializing extension GLX
(II) Indirect GLX disabled.
(II) GLX: Another vendor is already registered for screen 0

关于该消息GeForce GTX 960 (GPU-0) already has an X screen assigned; skipping this GPU screen Failing initialization of X screen,如果这确实是根本原因,我不明白为什么在重新安装 Fedora 31 之前这不是问题。我检查/etc/X11/xorg.conf并验证了当前定义了两个 GPU 设备 - 每个 X 一个文件中的屏幕(尽管它们指向同一物理设备)。以下是全文/etc/X11/xorg.conf

# nvidia-settings: X configuration file generated by nvidia-settings
# nvidia-settings:  version 440.82

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0" 0 2160
    Screen      1  "Screen1" Above "Screen0"
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
    Option         "Xinerama" "0"
EndSection

Section "Files"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/input/mice"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

Section "Monitor"
    # HorizSync source: edid, VertRefresh source: edid
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "Dell S2716DG"
    HorizSync       34.0 - 209.0
    VertRefresh     30.0 - 144.0
    Option         "DPMS"
EndSection

Section "Monitor"
    # HorizSync source: edid, VertRefresh source: edid
    Identifier     "Monitor1"
    VendorName     "Unknown"
    ModelName      "DENON, Ltd. DENON-AVR"
    HorizSync       30.0 - 136.0
    VertRefresh     58.0 - 121.0
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "GeForce GTX 960"
    BusID          "PCI:1:0:0"
    Screen          0
EndSection

Section "Device"
    Identifier     "Device1"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "GeForce GTX 960"
    BusID          "PCI:1:0:0"
    Screen          1
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "Stereo" "0"
    Option         "nvidiaXineramaInfoOrder" "DFP-1"
    Option         "metamodes" "DP-0: nvidia-auto-select +0+0"
    Option         "SLI" "Off"
    Option         "MultiGPU" "Off"
    Option         "BaseMosaic" "off"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

Section "Screen"
    Identifier     "Screen1"
    Device         "Device1"
    Monitor        "Monitor1"
    DefaultDepth    24
    Option         "Stereo" "0"
    Option         "metamodes" "HDMI-0: nvidia-auto-select +0+0 {AllowGSYNC=Off}"
    Option         "SLI" "Off"
    Option         "MultiGPU" "Off"
    Option         "BaseMosaic" "off"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

系统信息

  • 全新安装 Fedora 31
  • 一张显卡 (GeForce GTX 960),带有通过软件中心从“RPM Fusion for Fedora 31 - Nonfree - NVIDIA Driver”存储库安装的专有 Nvidia 驱动程序
  • 连接到显卡的两台显示器
    • 通过 DisplayPort 的主计算机显示屏(连接至戴尔计算机显示器)
    • 辅助显示器 + 通过 HDMI 输出声音(连接到 DENON 接收器)

问题

有谁知道如何让多个 X Screen 再次工作?如果我可以提供更多有用的技术信息,请告诉我(相关 shell 命令将不胜感激)。

其他背景:拥有两个 X 屏幕的动机

计算机坚持认为连接到 HDMI 的任何显示器对于某些活动都是“主要”的,无论在 中选择哪个显示器作为“主要显示器”nvidia-settings或如何排序xorg.conf。我相信这是显卡固件的一个功能,因为 POST 消息、GRUB2 菜单和其他低级软件始终通过 HDMI 显示(如果已连接)。这是不可配置的。

运行操作系统时,这种“默认为 HDMI”现象会导致在辅助显示器上打开新窗口时出现严重问题。新窗口不可见,因为连接到接收器的电视几乎总是关闭的,而接收器本身仍然打开以提供声音。我了解到我可以使用shift+ window btn+arrow btn快捷方式将活动窗口显示到我选择的显示器上,而无需打开电视通过 GUI 将其拖动;这略有帮助。除了烦人之外,有时新打开的窗口会被忽视,甚至更糟:某些全屏应用程序(例如游戏)无法移动到正确的显示器,或者只能跨越两个显示器。这是一个主要的可用性问题。

在某些时候,我能够提出以下解决方案:创建一个新的 X Screen 并为每个显示器分配其自己的 X Screen。这当然只是解决了我在操作系统中遇到的问题,但这是一个相当令人满意的解决方案。游戏可以运行,窗口永远不会出现错误的显示,等等。

现在的问题是,在新安装 Fedora 后,我无法让 X Server 再次运行两个 X Screens。

答案1

经过大量研究和实验(使用.conf文件和其他方式),我始终无法确定此问题的根本原因。通过完全重新安装 Fedora 并在安装专有的 Nvidia 驱动程序时格外勤奋,我最终确实让两个 X Screen 再次工作。该问题可能与首次安装 Nvidia 驱动程序时的细微差别有关。我最好的理论是,当 Nvidia 驱动程序安装程序提示我运行 Xconfig 实用程序时,我可能选择了“是”。不幸的是,我不记得我的选择,所以我不确定这是否是问题所在。

下面,我描述了我最近一次安装 Nvidia 驱动程序的方法,该方法导致了预期的 X Screen 设置行为。该过程包括一些我的个人偏好,这些偏好与驱动程序安装并不真正相关,但由于我执行了这些操作而被记录下来(这些个人偏好已标记为此类)。第 1 步是全新安装后我做的第一件事。

Fedora GNU/Linux 上的专有 Nvidia 驱动程序安装:

  1. sudo dnf upgrade
  2. 重新启动计算机sudo shutdown -r now
  3. sudo dnf install kernel-devel kernel-headers gcc make dkms acpid libglvnd-glx libglvnd-opengl libglvnd-devel pkgconfig
  4. sudo vi /etc/default/grub
    1. GRUB_CMDLINE_LINUX条目中,删除rhgh quiet(这是我个人的喜好)
    2. 仍然在GRUB_CMDLINE_LINUX条目中添加rd.driver.blacklist=nouveaunouveau.modeset=0
    3. 在该GRUB_TIMEOUT行之后添加新行“ GRUB_TIMEOUT_STYLE=menu”(这是我个人的喜好)
    4. :wq保存并退出vi
  5. sudo grub2-editenv - unset menu_auto_hide(这是我个人的喜好)
  6. 我有 UEFI 启动并且正在运行 Fedora,以便重新生成我使用的 GRUB2 配置:(sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg这通常与旧版启动或其他发行版不同)
  7. 重新启动计算机sudo shutdown -r now(显示将是低分辨率和低质量)
  8. sudo init 3将操作系统切换到运行级别 3
  9. 根据提示登录
  10. cd到包含.run从 Nvidia 下载的文件的目录(对我来说是~/Downloads
  11. sudo ./NVIDIA_driver_file_name.run(可能需要执行sudo chmod +x [file_name]才能使其可执行)
  12. 提示时,安装 DKMS 并安装 32 位兼容性库
  13. 提示时,不要运行 Xconfig 实用程序
  14. 重新启动计算机sudo shutdown -r now

答案2

让我给你一个配置文件的例子,我在 CentOS7 和 CentOS8 上成功使用了两个屏幕。它们与您正在使用的 Fedora 非常相似。在以前的系统(CentOS5)上我使用了 xorg.conf,但现在我将其放入/etc/X11/xorg.conf.d/20-nvidia-graphics.conf

Section "ServerLayout"
    Identifier     "Default Layout"
    Screen         0 "Screen0" 0 0
    Screen         1 "Screen1" LeftOf "Screen0"
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
    Option         "Xinerama" "0"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/input/mice"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "Device"
    Identifier     "Device1"
    Driver         "nvidia"
    Screen         1
    Option         "UseDisplayDevice" "DFP-1"
    Option         "ConnectedMonitor" "DFP-0, DFP-1"
    Option         "CustomEDID" "DFP-1:/etc/X11/ADP361.bin; DFP-0:/etc/X11/0.bin"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    Screen         0
    Option         "UseDisplayDevice" "DFP-0"
    Option         "ConnectedMonitor" "DFP-0, DFP-1"
EndSection

Section "Screen"
    Identifier     "Screen1"
    Device         "Device1"
    DefaultDepth    24
    Option         "metamodes" "DFP-1: 1200x1920 +0+0"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    DefaultDepth    24
    Option         "metamodes" "DFP-0: 2048x2048 +0+0"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

该文件在我的计算机上创建两个屏幕,我什至可以在每个屏幕上运行不同的窗口管理器。我猜你会在两者上运行相同的窗口管理器。我认为技巧之一是禁用 Xinerama,它将所有屏幕连接在一起。

您应该调整配置文件,直到正确为止。我相信,我的样本是一个好的开始,因为它对我有用。

也许您可以使用 read-edid 来读取显示器 EDID 并将其提供在文件中。这样,驱动程序认为连接的内容并不重要,因为它将使用文件提供的 EDID。

相关内容