实现双卡双座+串流联机

成功使用logind+lightdm实现了双卡双头多座(multiseat),可以用sunshine串流打小游戏。

用了差不多快一周(净时间,实际两三周),太久了,在此留下记录以免未来的昔日自己栽坑。不过现在我妹在用该电脑打游戏,我也先写个作业,待会再写:grin:

1 个赞

我安装了Nvidia显卡,可能是n卡驱动的x配置文件会强行使用n卡,我的seat1 使用lightdm时黑屏。所以必须为seat1做单独的x配置(例如单开一文件设置Section "Device"并为核显设置modesetting驱动),并在lightdm配置中的[Seat:对应seat名]中加载,我的配置放在lightdm启动x的参数了(可参考 lightdm/data/lightdm.conf at main · canonical/lightdm · GitHub
配置多座就比较简单,较好的参考有Multi_Seat_Debian_HOWTO - Debian Wiki,但一定要为sunshine的虚拟输入配置udev规则然后重启来分配

我现在在外回不了家,暂不能展示x和udev配置,回去发这些。

这些是相关的配置文件,配置过程问ai很多,不免有冗赘,欢迎指出
/usr/share/lightdm/lightdm.conf.d/logind-seats.conf (lightdm配置,我觉得放在这里不是最好的) :

[LightDM]
logind-load-seats=true
logind-check-graphical=true

[Seat:seat1]
xserver-command=/usr/bin/X -config /etc/X11/conf.per-seats/90-seat1.conf

/etc/X11/conf.per-seats/90-seat1.conf (seat1的X配置,放的地方能访问到应该都行) :

Section "Device"
    Identifier  "card0"
    Driver      "modesetting"
    BusID       "PCI:0:2:0"
EndSection

loginctl seat-status结果:

~> loginctl seat-status seat1
seat1
Sessions: *6
 Devices: n/a
         ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card1
         │ [MASTER] drm:card1
         │ ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card1/card1-HDMI-A-1
         │ │ [MASTER] drm:card1-HDMI-A-1
         │ ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card1/card1-HDMI-A-2
         │ │ [MASTER] drm:card1-HDMI-A-2
         │ └─/sys/devices/pci0000:00/0000:00:02.0/drm/card1/card1-VGA-1
         │   [MASTER] drm:card1-VGA-1
         ├─/sys/devices/pci0000:00/0000:00:02.0/drm/renderD128
         │ drm:renderD128
         ├─/sys/devices/pci0000:00/0000:00:14.0/usb3/3-11
         │ usb:3-11
         │ ├─/sys/devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/0003:18F8:1286.0002/hidraw/hidraw1
         │ │ hidraw:hidraw1
         │ ├─/sys/devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/0003:18F8:1286.0002/input/input6
         │ │ input:input6 "INSTANT USB GAMING MOUSE "
         │ ├─/sys/devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.1/0003:18F8:1286.0003/hidraw/hidraw2
         │ │ hidraw:hidraw2
         │ └─/sys/devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.1/0003:18F8:1286.0003/input/input7
         │   input:input7 "INSTANT USB GAMING MOUSE  Keyboard"
         └─/sys/devices/platform/i8042/serio0/input/input0
           input:input0 "AT Translated Set 2 keyboard"
           ├─/sys/devices/platform/i8042/serio0/input/input0/input0::capslock
           │ leds:input0::capslock
           ├─/sys/devices/platform/i8042/serio0/input/input0/input0::numlock
           │ leds:input0::numlock
           └─/sys/devices/platform/i8042/serio0/input/input0/input0::scrolllock
             leds:input0::scrolllock

/etc/udev/rules.d/99-sunshine-vinputs-could-attach.rules (udev规则,把sunshine的虚拟输入分给seat1(loginctl分配会因没有tag失败)) :

SUBSYSTEM=="input", \
  ENV{PRODUCT}=="3/beef/dead/111", \
  ENV{NAME}=="*passthrough*", \
  ENV{ID_FOR_SEAT}="sunshine-vinput-%k", \
  ENV{ID_SEAT}="seat1"

写udev规则时注意"==“是匹配而”="会赋值

sunshine的虚拟输入的udevadm info结果,一般找到关键词扔进rules.d匹配即可:

~> udevadm info -q property /sys/devices/virtual/input/input*/
DEVPATH=/devices/virtual/input/input78
PRODUCT=3/beef/dead/111
NAME="Mouse passthrough"
PROP=0
EV=17
KEY=ff0000 0 0 0 0
REL=1943
MSC=10
MODALIAS=input:b0003vBEEFpDEADe0111-e0,1,2,4,k110,111,112,113,114,115,116,117,r0,1,6,8,B,C,am4,lsfw
SUBSYSTEM=input
USEC_INITIALIZED=9295994415
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_SERIAL=noserial
ID_FOR_SEAT=sunshine-vinput-input78
ID_SEAT=seat1
TAGS=:seat:
CURRENT_TAGS=:seat:
DEVPATH=/devices/virtual/input/input79
PRODUCT=3/beef/dead/111
NAME="Mouse passthrough (absolute)"
PROP=2
EV=b
KEY=10000 0 0 0 0
ABS=3
MODALIAS=input:b0003vBEEFpDEADe0111-e0,1,3,k110,ra0,1,mlsfw
SUBSYSTEM=input
USEC_INITIALIZED=9295994617
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_SERIAL=noserial
ID_FOR_SEAT=sunshine-vinput-input79
ID_SEAT=seat1
TAGS=:seat:
CURRENT_TAGS=:seat:
DEVPATH=/devices/virtual/input/input80
PRODUCT=3/beef/dead/111
NAME="Keyboard passthrough"
PROP=0
EV=3
KEY=a00000000 0 40000 4400 ee80ffde25cfffff fffffffffffffffe
MODALIAS=input:b0003vBEEFpDEADe0111-e0,1,k77,79,7A,7B,7D,7E,7F,8A,8E,D2,161,163,ramlsfw
SUBSYSTEM=input
USEC_INITIALIZED=9295994831
ID_INPUT=1
ID_INPUT_KEY=1
ID_INPUT_KEYBOARD=1
ID_SERIAL=noserial
ID_FOR_SEAT=sunshine-vinput-input80
ID_SEAT=seat1
TAGS=:seat:
CURRENT_TAGS=:seat:

声音我还没有去处理,目前seat1会处于完全无音频状态而sunshine会去抓seat0(主板声卡)的音频