(K)Ubuntu 17.10 - 使用 nouveau 或 nvidia-384 在 2 个 NVidia 卡上使用 loginctl Multi-Seat

(K)Ubuntu 17.10 - 使用 nouveau 或 nvidia-384 在 2 个 NVidia 卡上使用 loginctl Multi-Seat

我已经设置了一台带有两个 NVidia 显卡的机器:

$ lspci
01:00.0 VGA compatible controller: NVIDIA Corporation GK107 [GeForce GT 740] (rev a1)
02:00.0 VGA compatible controller: NVIDIA Corporation GK208 [GeForce GT 730] (rev a1)

然后我习惯loginctl将 GT 730 分配给座位 1,而将 GT 740 保持不变,因此它仍然分配给座位 0。座位 0 有两个显示器,座位 1 只有一个。

使用 nouveau

使用nouveauXOrg 驱动程序,我可以使用两个席位。两个席位都显示lightdm登录屏幕并允许登录。

这里有两个问题:

  • seat0 经常锁定,似乎只有在会话锁定时才会发生。鼠标仍然可以移动,但它不接受键盘输入。甚至时钟也停止更新。
    • 可以通过 ssh 进入盒子或登录座位 1 并简单地重新启动 lig​​htdm ( service lightdm restart) 来解决此问题,但显然这会注销两个座位,这充其量是很不方便的。
    • dmesg | grep nouveau显示几条消息,例如nouveau 0000:01:00.0: fifo: SCHED_ERROR 08 []nouveau 0000:01:00.0: Xorg[1250]: channel 2 killed!
  • 滚动网页时,1 号座位的显示屏闪烁。这可能是因为视频内存带宽太低,根据Nouveau 故障排除 - 显示器空白、闪烁、雪花或其他随机实时图像损坏。我还没有调查过这个。

使用专有 NVidia 驱动程序

当我安装专有 nvidia 驱动程序 ( apt install nvidia-384) 时,只有 GT 740 (分配给座位 0,配备两个显示器) 可用。GT 730 上的另一个显示器 (分配给座位 1,配备一个显示器) 保持黑屏。

然而好处是,我没有再遇到座位 0 上的锁定问题(并且显然座位 1 上也没有再出现闪烁,尽管这并不是真正的改进 ;-))

我也尝试使用硬件驱动程序设置应用程序或ubuntu-drivers在控制台上切换到驱动程序。它们都只列出一个 NVidia 卡,即 GT 740:

$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0 ==
modalias : pci:v000010DEd00000FC8sv00001458sd000036FFbc03sc00i00
vendor   : NVIDIA Corporation
model    : GK107 [GeForce GT 740]
driver   : nvidia-384 - distro non-free recommended
driver   : nvidia-340 - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

== cpu-microcode.py ==
driver   : amd64-microcode - distro non-free

结论

我的目标是让两个座位都运行,不锁定,不闪烁。我并不关心这是使用 nouveau 还是 nvidia 驱动程序实现的。

我目前没有 Xorg.conf 或修改过 lightdm 配置,因为我根本不知道该在那里放什么......我想只要让 nvidia 驱动程序识别第二张卡就可以了,但我不知道如何实现这一点。

有任何想法吗?

提前致谢,帕特里克

答案1

好的,我终于让它工作了。

一般的

此部分内容是为其他人提供一个小“入门指南”,也是为我自己提供一个小“备忘录”...这不是唯一的方法,甚至可能不是最好的方法,这只是我采用的方法。

  1. 准备两个 USB 集线器,分别放在两个座位上,然后将其插入机器的两个 USB 端口。
  2. 获取 USB 声卡(带有一个麦克风输入和一个线路输出连接器的小型 USB 适配器)并将其插入机器的另一个 USB 端口。这假设已有另一个(板载)声音设备将在 seat0 上使用。
  3. 获取两个 USB 无线鼠标/键盘组合,并将其中一个 USB 加密狗插入两个 USB 集线器中。
  4. 将集线器分配到相应的座位(loginctl attach seat1 /dev/...)。这将自动分配插入集线器的鼠标和键盘。
  5. 将 USB 声卡分配给 seat1
  6. 将其中一张 Nvidia 卡(全部,包括 DRM 和声音设备)分配给 seat1。
  7. 如果您有任何其他未插入已分配的集线器的设备,那么也请分配它们。
  8. 运行loginctl seat-status seat1。它看起来是这样的:

    seat1
            Sessions: *c3
             Devices:
                      ├─/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.0/drm/card1
                      │ [MASTER] drm:card1
                      ├─/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.0/drm/renderD129
                      │ drm:renderD129
                      ├─/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.1/sound/card2
                      │ sound:card2 "NVidia"
                      │ ├─/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.1/sound/card2/input20
                      │ │ input:input20 "HDA NVidia HDMI/DP,pcm=3"
                      │ └─/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.1/sound/card2/input21
                      │   input:input21 "HDA NVidia HDMI/DP,pcm=7"
                      ├─/sys/devices/pci0000:00/0000:00:04.0/0000:03:00.0/usb8
                      │ usb:usb8
                      │ ├─/sys/devices/pci0000:00/0000:00:04.0/0000:03:00.0/usb8/8-1
                      │ │ usb:8-1
                      │ │ ├─/sys/devices/pci0000:00/0000:00:04.0/0000:03:00.0/usb8/8-1/8-1.3
                      │ │ │ usb:8-1.3
                      │ │ ├─/sys/devices/pci0000:00/0000:00:04.0/0000:03:00.0/usb8/8-1/8-1.4/8-1.4:1.0/0003:046A:B102.0004/input/input5
                      │ │ │ input:input5 "HOLTEK USB Wireless Device"
                      │ │ └─/sys/devices/pci0000:00/0000:00:04.0/0000:03:00.0/usb8/8-1/8-1.4/8-1.4:1.1/0003:046A:B102.0005/input/input6
                      │ │   input:input6 "HOLTEK USB Wireless Device"
                      │ └─/sys/devices/pci0000:00/0000:00:04.0/0000:03:00.0/usb8/8-2
                      │   usb:8-2
                      │   └─/sys/devices/pci0000:00/0000:00:04.0/0000:03:00.0/usb8/8-2/8-2.3
                      │     usb:8-2.3
                      ├─/sys/devices/pci0000:00/0000:00:04.0/0000:03:00.0/usb9
                      │ usb:usb9
                      │ ├─/sys/devices/pci0000:00/0000:00:04.0/0000:03:00.0/usb9/9-1
                      │ │ usb:9-1
                      │ │ └─/sys/devices/pci0000:00/0000:00:04.0/0000:03:00.0/usb9/9-1/9-1.3
                      │ │   usb:9-1.3
                      │ └─/sys/devices/pci0000:00/0000:00:04.0/0000:03:00.0/usb9/9-2
                      │   usb:9-2
                      │   └─/sys/devices/pci0000:00/0000:00:04.0/0000:03:00.0/usb9/9-2/9-2.3
                      │     usb:9-2.3
                      ├─/sys/devices/pci0000:00/0000:00:12.0/usb4
                      │ usb:usb4
                      │ ├─/sys/devices/pci0000:00/0000:00:12.0/usb4/4-4/4-4:1.0/sound/card5
                      │ │ sound:card5 "Device"
                      │ └─/sys/devices/pci0000:00/0000:00:12.0/usb4/4-4/4-4:1.3/0003:0D8C:0014.0001/input/input2
                      │   input:input2 "C-Media Electronics Inc. USB Audio Device"
                      └─/sys/devices/pci0000:00/0000:00:12.2/usb1
                        usb:usb1
                        ├─/sys/devices/pci0000:00/0000:00:12.2/usb1/1-2
                        │ usb:1-2
                        ├─/sys/devices/pci0000:00/0000:00:12.2/usb1/1-3/1-3:1.0/input/input15
                        │ input:input15 "UVC Camera (046d:0807)"
                        ├─/sys/devices/pci0000:00/0000:00:12.2/usb1/1-3/1-3:1.0/video4linux/video0
                        │ video4linux:video0 "UVC Camera (046d:0807)"
                        ├─/sys/devices/pci0000:00/0000:00:12.2/usb1/1-3/1-3:1.2/sound/card3
                        │ sound:card3 "U0x46d0x807"
                        └─/sys/devices/pci0000:00/0000:00:12.2/usb1/1-5
                          usb:1-5
    

我不知道在使用 nouveau 驱动程序时,如何解决座位 1 屏幕闪烁和座位 0 锁定的问题。如果您正在寻找此问题的解决方案,可能值得一看 https://wiki.archlinux.org/index.php/Xorg_multiseat其中写道:

为了避免撕裂,这似乎对几乎所有配置都有帮助 - 将其添加到 /etc/environment:

CLUTTER_PAINT=disable-clipped-redraws:disable-culling 
CLUTTER_VBLANK=True 

另一个提示是将用户添加到组中video,否则他们可能无法访问 DRI 接口。

这就是我能说的全部内容,然后我就转而使用 Nvidia 二进制驱动程序了。

NVidia

我遇到的问题显然是,尽管 GPU-1 被分配给了 seat1,但 seat0 的 X 服务器却以某种方式试图控制两个 GPU。

这不知何故混淆了 X 屏幕,并且座位 1 的 X 服务器无法找到任何可用的屏幕。

我花了几个小时摆弄/etc/X11/xorg.conf.d文件,把一些配置信息放进去,比如

Section "Device"
        Identifier      "graphic0"
        Driver          "nvidia"
        Option          "NoLogo"
        BusId           "PCI:1:0:0"
        MatchSeat       "seat-1"
        Option          "Monitor-DVI-1"         "monitor1"
EndSection

Section "ServerLayout"
        Identifier      "seat-1"
        Screen          "screen1"       0                   0
        InputDevice     "mouse1"        "CorePointer"
        InputDevice     "keyboard1"     "CoreKeyboard"
        Option          "Seat"  "seat-1"
        Option          "SingleCard" "on"
EndSection

根据建议https://wiki.archlinux.org/index.php/Xorg_multiseat(那里有很多有用的信息,尽管它没有解决我的问题)或https://devtalk.nvidia.com/default/topic/936873/linux/-howto-multiseat-with-ubuntu-16-04-systemd-gdm-proprietary-drivers/1(关于该问题的另一篇高质量讨论)。

最终对我而言有效的是采用困难的方法并为每个座位提供 X 配置。

因此,我的程序是:

  1. 用于loginctl attach seat1 ....将所有必需的设备分配给座位 1
  2. 安装 nvidia 专有驱动程序(确保为您的系统选择正确的驱动程序;在终端运行中ubuntu-drivers devices查看可用驱动程序列表)

    apt install nvida-384
    
  3. 重启
  4. 登录seat0并运行nvidia-seetings。选择X Server Display Configuration左侧,点击save to X Configuration File右下角并将文件另存为~/xorg-template
  5. 将 ~/xorg-template 配置文件复制两次到/etc/X11,一次作为xorg-seat0.conf,一次作为xorg-seat1.conf
  6. 修改这两个 Xorg 配置文件以分别匹配 seat0 和 seat1 设置。我只需要更改几行 - GPU 的 PCI 地址和显示器数量。不过,为了清晰起见,我还更改了标识符的命名 - 我想这实际上不是必需的。以下是我的配置:

    • 座位0

      # xorg-seat0.conf
      Section "ServerLayout"
          Identifier     "Layout-seat0"
          Screen      0  "Screen-seat0" 0 0
          InputDevice    "Keyboard-seat0" "CoreKeyboard"
          InputDevice    "Mouse-seat0" "CorePointer"
          Option         "Xinerama" "0"
      EndSection
      
      Section "Files"
      EndSection
      
      Section "InputDevice"
          # generated from default
          Identifier     "Mouse-seat0"
          Driver         "mouse"
          Option         "Protocol" "auto"
          Option         "Device" "/dev/psaux"
          Option         "Emulate3Buttons" "no"
          Option         "ZAxisMapping" "4 5"
      EndSection
      
      Section "InputDevice"
          # generated from default
          Identifier     "Keyboard-seat0"
          Driver         "kbd"                                                                                                                                                                                                                    
      EndSection                                                                                                                                                                                                                                  
      
      Section "Monitor"                                                                                                                                                                                                                           
          # HorizSync source: edid, VertRefresh source: edid                                                                                                                                                                                      
          Identifier     "Monitor-seat0_1"                                                                                                                                                                                                        
          VendorName     "Unknown"                                                                                                                                                                                                                
          ModelName      "FUS H22-1W"                                                                                                                                                                                                             
          HorizSync       28.0 - 79.0                                                                                                                                                                                                             
          VertRefresh     50.0 - 75.0                                                                                                                                                                                                             
          Option         "DPMS"                                                                                                                                                                                                                   
      EndSection                                                                                                                                                                                                                                  
      
      Section "Device"                                                                                                                                                                                                                            
          Identifier     "Device-seat0"                                                                                                                                                                                                           
          Driver         "nvidia"                                                                                                                                                                                                                 
          VendorName     "NVIDIA Corporation"                                                                                                                                                                                                     
          BoardName      "GeForce GT 740"                                                                                                                                                                                                         
          BusID          "PCI:1:0:0"                                                                                                                                                                                                              
      EndSection                                                                                                                                                                                                                                  
      
      Section "Screen"                                                                                                                                                                                                                            
          Identifier     "Screen-seat0"                                                                                                                                                                                                           
          Device         "Device-seat0"                                                                                                                                                                                                           
          Monitor        "Monitor-seat0_1"                                                                                                                                                                                                        
          DefaultDepth    24                                                                                                                                                                                                                      
          Option         "Stereo" "0"
          Option         "nvidiaXineramaInfoOrder" "DFP-0"
          Option         "metamodes" "DVI-D-0: nvidia-auto-select +0+0, DVI-D-1: nvidia-auto-select +1680+0"
          Option         "SLI" "Off"
          Option         "MultiGPU" "Off"
          Option         "BaseMosaic" "off"
          SubSection     "Display"
              Depth       24
          EndSubSection
      EndSection
      
    • 座位1

      # xorg-seat1.conf
      Section "ServerLayout"
          Identifier     "Layout-seat1"
          Screen      0  "Screen-seat1" 0 0
          InputDevice    "Keyboard-seat1" "CoreKeyboard"
          InputDevice    "Mouse-seat1" "CorePointer"
          Option         "Xinerama" "0"
      EndSection
      
      Section "Files"
      EndSection
      
      Section "InputDevice"
          # generated from default
          Identifier     "Mouse-seat1"
          Driver         "mouse"
          Option         "Protocol" "auto"
          Option         "Device" "/dev/psaux"
          Option         "Emulate3Buttons" "no"
          Option         "ZAxisMapping" "4 5"
      EndSection
      
      Section "InputDevice"
          # generated from default
          Identifier     "Keyboard-seat1"
          Driver         "kbd"
      EndSection
      
      Section "Monitor"
          # HorizSync source: edid, VertRefresh source: edid
          Identifier     "Monitor-seat1_1"
          VendorName     "Unknown"
          ModelName      "FUS H22-1W"
          HorizSync       28.0 - 79.0
          VertRefresh     50.0 - 75.0
          Option         "DPMS"
      EndSection
      
      Section "Device"
          Identifier     "Device-seat1"
          Driver         "nvidia"
          VendorName     "NVIDIA Corporation"
          BoardName      "GeForce GT 730"
          BusID          "PCI:2:0:0"
      EndSection
      
      Section "Screen"
          Identifier     "Screen-seat1"
          Device         "Device-seat1"
          Monitor        "Monitor-seat1_1"
          DefaultDepth    24
          Option         "Stereo" "0"
          Option         "nvidiaXineramaInfoOrder" "DFP-0"
          Option         "metamodes" "DVI-D-0: nvidia-auto-select +0+0"
          Option         "SLI" "Off"
          Option         "MultiGPU" "Off"
          Option         "BaseMosaic" "off"
          SubSection     "Display"
              Depth       24
          EndSubSection
      EndSection
      
  7. 创建一个新文件10-seats.conf/etc/lightdm/lightdm.conf.d/如果尚不存在则创建文件夹)并将布局和配置文件分配给每个 X 服务器:

    # 10-seats.conf
    [Seat:seat0]
    xserver-command=/usr/bin/X :0
    xserver-config=/etc/X11/xorg-seat0.conf
    xserver-layout=Layout-seat0
    
    [Seat:seat1]
    xserver-command=/usr/bin/X :1
    xserver-config=/etc/X11/xorg-seat1.conf
    xserver-layout=Layout-seat1
    
  8. 重启

您可能注意到,xorg-seat[01].conf 文件不包含任何有关座位的提示。我使用字符串 seat0 和 seat1 命名标识符,但这没有相关性。

但是,在 lightdm 配置中,需要使用您在创建座位时为座位指定的名称。seat0 无法更改,但第二个座位可以有您选择的任何名称(只要它以seat字母、数字、- 和 _ 开头,后面跟着字母、数字、- 和 _)。确保使用该名称来配置第二个座位 - 我已经习惯了seat1保持简单。

我非常确定有些东西可以从 X 配置文件中删除,但我还没有尝试整理它们。如果您发现更简单的文件可以很好地工作,请随时在此处发表评论,我会添加您的信息(好吧,除非您不想发布自己的整个答案)。

例如,在我的计算机上,两个 X 配置文件中配置的鼠标和键盘均不存在 - 它们是 添加的虚拟设备nvidia-settings。物理设备(USB 无线鼠标和键盘)是动态添加的,因为它们分别连接到 seat0 和 seat1。

相关内容