![(K)Ubuntu 17.10 - 使用 nouveau 或 nvidia-384 在 2 个 NVidia 卡上使用 loginctl Multi-Seat](https://linux22.com/image/1203523/(K)Ubuntu%2017.10%20-%20%E4%BD%BF%E7%94%A8%20nouveau%20%E6%88%96%20nvidia-384%20%E5%9C%A8%202%20%E4%B8%AA%20NVidia%20%E5%8D%A1%E4%B8%8A%E4%BD%BF%E7%94%A8%20loginctl%20Multi-Seat.png)
我已经设置了一台带有两个 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
使用nouveau
XOrg 驱动程序,我可以使用两个席位。两个席位都显示lightdm
登录屏幕并允许登录。
这里有两个问题:
- seat0 经常锁定,似乎只有在会话锁定时才会发生。鼠标仍然可以移动,但它不接受键盘输入。甚至时钟也停止更新。
- 可以通过 ssh 进入盒子或登录座位 1 并简单地重新启动 lightdm (
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!
- 可以通过 ssh 进入盒子或登录座位 1 并简单地重新启动 lightdm (
- 滚动网页时,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
好的,我终于让它工作了。
一般的
此部分内容是为其他人提供一个小“入门指南”,也是为我自己提供一个小“备忘录”...这不是唯一的方法,甚至可能不是最好的方法,这只是我采用的方法。
- 准备两个 USB 集线器,分别放在两个座位上,然后将其插入机器的两个 USB 端口。
- 获取 USB 声卡(带有一个麦克风输入和一个线路输出连接器的小型 USB 适配器)并将其插入机器的另一个 USB 端口。这假设已有另一个(板载)声音设备将在 seat0 上使用。
- 获取两个 USB 无线鼠标/键盘组合,并将其中一个 USB 加密狗插入两个 USB 集线器中。
- 将集线器分配到相应的座位(
loginctl attach seat1 /dev/...
)。这将自动分配插入集线器的鼠标和键盘。 - 将 USB 声卡分配给 seat1
- 将其中一张 Nvidia 卡(全部,包括 DRM 和声音设备)分配给 seat1。
- 如果您有任何其他未插入已分配的集线器的设备,那么也请分配它们。
运行
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 配置。
因此,我的程序是:
- 用于
loginctl attach seat1 ....
将所有必需的设备分配给座位 1 安装 nvidia 专有驱动程序(确保为您的系统选择正确的驱动程序;在终端运行中
ubuntu-drivers devices
查看可用驱动程序列表)apt install nvida-384
- 重启
- 登录seat0并运行
nvidia-seetings
。选择X Server Display Configuration
左侧,点击save to X Configuration File
右下角并将文件另存为~/xorg-template - 将 ~/xorg-template 配置文件复制两次到
/etc/X11
,一次作为xorg-seat0.conf
,一次作为xorg-seat1.conf
修改这两个 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
创建一个新文件
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
- 重启
您可能注意到,xorg-seat[01].conf 文件不包含任何有关座位的提示。我使用字符串 seat0 和 seat1 命名标识符,但这没有相关性。
但是,在 lightdm 配置中,需要使用您在创建座位时为座位指定的名称。seat0 无法更改,但第二个座位可以有您选择的任何名称(只要它以seat
字母、数字、- 和 _ 开头,后面跟着字母、数字、- 和 _)。确保使用该名称来配置第二个座位 - 我已经习惯了seat1
保持简单。
我非常确定有些东西可以从 X 配置文件中删除,但我还没有尝试整理它们。如果您发现更简单的文件可以很好地工作,请随时在此处发表评论,我会添加您的信息(好吧,除非您不想发布自己的整个答案)。
例如,在我的计算机上,两个 X 配置文件中配置的鼠标和键盘均不存在 - 它们是 添加的虚拟设备nvidia-settings
。物理设备(USB 无线鼠标和键盘)是动态添加的,因为它们分别连接到 seat0 和 seat1。