MultiSeat systemd

Материал из ALT Linux Wiki

MultiSeat на системах с systemd

Необходимые условия

Требования к аппаратной конфигурации

Единственным необходимым условием для организации нескольких рабочих мест с помощью systemd является наличие нескольких видеокарт. Например, встроенной в процессор Intel и дискретной nVidia. Карты не обязательно должны быть разными. Далее везде предполагается, что рабочих места два.

Для реальной одновременной работы на нескольких рабочих местах кроме видеокарты понадобятся мониторы и комплекты клавиатуры и мыши на каждое рабочее место. Клавиатура и мышь могут быть подключены по USB, возможно через хаб.

Требования к программам

В системе должен использоваться systemd. Так же дисплейный менеджер должен поддерживать концепцию множественных рабочих мест (seat). На момент написания статьи это GDM и LightDM. К выходу версии sddm 1.0 в нем тоже обещают поддержку seat.

Пример Для перехода на LightDM с sddm выполните следующие команды:

apt-get install lightdm
systemctl disable sddm
systemctl enable lightdm

Предварительная настройка

Перед началом работы с несколькими рабочими местами необходимо убедиться, что система обнаруживает все видеокарты. Современный linux довольно успешно справляется с автоматическим определением и настройкой видеокарт. Поэтому в качестве первого шага при установке второй карты можно попробовать просто убрать все настройки видеокарт из /etc/X11/xorg.conf.d Косвенным признаком, что обе карты инициализировались нормально, должно быть наличие двух лог-файлов /var/log/Xorg.0.log и /var/log/Xorg.1.log без существенных ошибок в них.

Определение доступных устройств и распределение их между рабочими местами

По умолчанию в системе есть единственное рабочее место с именем seat0, к которому подключены все доступные устройства. Убедиться в этом можно следующим образом

$ loginctl list-seats 
SEAT 
seat0

1 seats listed.

Полный список устройств, подключенных к этому месту:

$ loginctl seat-status
seat0
        Sessions: *4
         Devices:
                  ├─/sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input16
                  │ input:input16 "Power Button"
                  ├─/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input17
                  │ input:input17 "Video Bus"
                  ├─/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input14
                  │ input:input14 "Power Button"
                  ├─/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input15
                  │ input:input15 "Sleep Button"
                  ├─/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1
                  │ [MASTER] drm:card1
                  ├─/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.1/sound/card2
                  │ sound:card2 "NVidia"
                  │ ├─/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.1/sound/card2/input31
                  │ │ input:input31 "HDA NVidia HDMI/DP,pcm=3"
                  │ ├─/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.1/sound/card2/input32
                  │ │ input:input32 "HDA NVidia HDMI/DP,pcm=7"
                  │ ├─/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.1/sound/card2/input33
                  │ │ input:input33 "HDA NVidia HDMI/DP,pcm=8"
                  │ └─/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.1/sound/card2/input34
                  │   input:input34 "HDA NVidia HDMI/DP,pcm=9"
                  ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card0
                  │ [MASTER] drm:card0
                  │ ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-DP-1
                  │ │ [MASTER] drm:card0-DP-1
                  │ ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-HDMI-A-1
                  │ │ [MASTER] drm:card0-HDMI-A-1
                  │ ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-HDMI-A-2
                  │ │ [MASTER] drm:card0-HDMI-A-2
                  │ ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-HDMI-A-3
                  │ │ [MASTER] drm:card0-HDMI-A-3
                  │ └─/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-VGA-1
                  │   [MASTER] drm:card0-VGA-1
                  ├─/sys/devices/pci0000:00/0000:00:02.0/graphics/fb1
                  │ graphics:fb1 "i915drmfb"
                  ├─/sys/devices/pci0000:00/0000:00:03.0/sound/card0
                  │ sound:card0 "HDMI"
                  │ ├─/sys/devices/pci0000:00/0000:00:03.0/sound/card0/input26
                  │ │ input:input26 "HDA Intel HDMI HDMI/DP,pcm=3"
                  │ ├─/sys/devices/pci0000:00/0000:00:03.0/sound/card0/input27
                  │ │ input:input27 "HDA Intel HDMI HDMI/DP,pcm=7"
                  │ ├─/sys/devices/pci0000:00/0000:00:03.0/sound/card0/input28
                  │ │ input:input28 "HDA Intel HDMI HDMI/DP,pcm=8"
                  │ ├─/sys/devices/pci0000:00/0000:00:03.0/sound/card0/input29
                  │ │ input:input29 "HDA Intel HDMI HDMI/DP,pcm=9"
                  │ └─/sys/devices/pci0000:00/0000:00:03.0/sound/card0/input30
                  │   input:input30 "HDA Intel HDMI HDMI/DP,pcm=10"
                  ├─/sys/devices/pci0000:00/0000:00:14.0/usb1
                  │ usb:usb1
                  │ └─/sys/devices/pci0000:00/0000:00:14.0/usb1/1-9
                  │   usb:1-9
                  │   ├─/sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9.1
                  │   │ usb:1-9.1
                  │   │ ├─/sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9.1/1-9.1.1/1-9.1.1:1.0/0003:04F3:0103.0003/input/input4
                  │   │ │ input:input4 "HID 04f3:0103"
                  │   │ ├─/sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9.1/1-9.1.1/1-9.1.1:1.1/0003:04F3:0103.0004/input/input5
                  │   │ │ input:input5 "HID 04f3:0103 Consumer Control"
                  │   │ └─/sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9.1/1-9.1.1/1-9.1.1:1.1/0003:04F3:0103.0004/input/input6
                  │   │   input:input6 "HID 04f3:0103 System Control"
                  │   ├─/sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9.4/1-9.4:1.0/input/input25
                  │   │ input:input25 "Microsoft LifeCam VX-800: Micro"
                  │   ├─/sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9.4/1-9.4:1.0/video4linux/video0
                  │   │ video4linux:video0 "Microsoft LifeCam VX-800: Micro"
                  │   ├─/sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9.4/1-9.4:1.0/video4linux/video1
                  │   │ video4linux:video1 "Microsoft LifeCam VX-800: Micro"
                  │   └─/sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9.4/1-9.4:1.2/sound/card3
                  │     sound:card3 "VX800"
                  ├─/sys/devices/pci0000:00/0000:00:14.0/usb2
                  │ usb:usb2
                  │ └─/sys/devices/pci0000:00/0000:00:14.0/usb2/2-3
                  │   usb:2-3
                  ├─/sys/devices/pci0000:00/0000:00:1a.0/usb7
                  │ usb:usb7
                  │ └─/sys/devices/pci0000:00/0000:00:1a.0/usb7/7-1
                  │   usb:7-1
                  ├─/sys/devices/pci0000:00/0000:00:1b.0/sound/card1
                  │ sound:card1 "PCH"
                  │ ├─/sys/devices/pci0000:00/0000:00:1b.0/sound/card1/input18
                  │ │ input:input18 "HDA Digital PCBeep"
                  │ ├─/sys/devices/pci0000:00/0000:00:1b.0/sound/card1/input19
                  │ │ input:input19 "HDA Intel PCH Rear Mic"
                  │ ├─/sys/devices/pci0000:00/0000:00:1b.0/sound/card1/input20
                  │ │ input:input20 "HDA Intel PCH Line"
                  │ ├─/sys/devices/pci0000:00/0000:00:1b.0/sound/card1/input21
                  │ │ input:input21 "HDA Intel PCH Line Out Front"
                  │ ├─/sys/devices/pci0000:00/0000:00:1b.0/sound/card1/input22
                  │ │ input:input22 "HDA Intel PCH Line Out Surround"
                  │ └─/sys/devices/pci0000:00/0000:00:1b.0/sound/card1/input23
                  │   input:input23 "HDA Intel PCH Line Out CLFE"
                  ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3
                  │ usb:usb3
                  │ └─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1
                  │   usb:3-1
                  │   └─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4
                  │     usb:3-1.4
                  │     ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.3/3-1.4.3:1.0/0003:1BCF:08A6.0005/input/input7
                  │     │ input:input7 "  Gaming Mouse"
                  │     ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.3/3-1.4.3:1.1/0003:1BCF:08A6.0006/input/input10
                  │     │ input:input10 "  Gaming Mouse System Control"
                  │     ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.3/3-1.4.3:1.1/0003:1BCF:08A6.0006/input/input8
                  │     │ input:input8 "  Gaming Mouse Keyboard"
                  │     ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.3/3-1.4.3:1.1/0003:1BCF:08A6.0006/input/input9
                  │     │ input:input9 "  Gaming Mouse Consumer Control"
                  │     ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.4/3-1.4.4:1.0/0003:04F3:0103.0007/input/input11
                  │     │ input:input11 "HID 04f3:0103"
                  │     ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.4/3-1.4.4:1.1/0003:04F3:0103.0008/input/input12
                  │     │ input:input12 "HID 04f3:0103 Consumer Control"
                  │     └─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.4/3-1.4.4:1.1/0003:04F3:0103.0008/input/input13
                  │       input:input13 "HID 04f3:0103 System Control"
                  ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb4
                  │ usb:usb4
                  ├─/sys/devices/pci0000:00/0000:00:1c.6/0000:0a:00.0/usb5
                  │ usb:usb5
                  │ └─/sys/devices/pci0000:00/0000:00:1c.6/0000:0a:00.0/usb5/5-1
                  │   usb:5-1
                  │   ├─/sys/devices/pci0000:00/0000:00:1c.6/0000:0a:00.0/usb5/5-1/5-1.1/5-1.1:1.0/0003:248A:8367.0001/input/input0
                  │   │ input:input0 "Telink Wireless Receiver Mouse"
                  │   ├─/sys/devices/pci0000:00/0000:00:1c.6/0000:0a:00.0/usb5/5-1/5-1.1/5-1.1:1.0/0003:248A:8367.0001/input/input1
                  │   │ input:input1 "Telink Wireless Receiver Consumer Control"
                  │   ├─/sys/devices/pci0000:00/0000:00:1c.6/0000:0a:00.0/usb5/5-1/5-1.1/5-1.1:1.0/0003:248A:8367.0001/input/input2
                  │   │ input:input2 "Telink Wireless Receiver System Control"
                  │   └─/sys/devices/pci0000:00/0000:00:1c.6/0000:0a:00.0/usb5/5-1/5-1.1/5-1.1:1.1/0003:248A:8367.0002/input/input3
                  │     input:input3 "Telink Wireless Receiver"
                  ├─/sys/devices/pci0000:00/0000:00:1c.6/0000:0a:00.0/usb6
                  │ usb:usb6
                  ├─/sys/devices/pci0000:00/0000:00:1d.0/usb8
                  │ usb:usb8
                  │ └─/sys/devices/pci0000:00/0000:00:1d.0/usb8/8-1
                  │   usb:8-1
                  ├─/sys/devices/platform/pcspkr/input/input24
                  │ input:input24 "PC Speaker"
                  ├─/sys/devices/platform/simple-framebuffer.0/graphics/fb0
                  │ graphics:fb0 "simple"
                  └─/sys/devices/virtual/misc/rfkill
                    misc:rfkill

В этом списке можно обнаружить две видеокарты:

drm:card0
drm:card1

Сверившись в выводом программы lspci можно обнаружить, что это встроенная в процессор видеокарта Intel и дискретная nVidia

# lspci
...
00:02.0 Display controller: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06)
...
01:00.0 VGA compatible controller: NVIDIA Corporation GF108GL [Quadro 600] (rev a1)
...

Так как в BIOS'е выбрана опция "Инициализировать сначала PCIe карту", основным дисплеем читается card1, к ней по умолчанию привязан seat0. Не надо переключать эту карту на другие рабочие места!

Теперь пришло время выделить "вторую" карту на второе рабочее место:

loginctl attach seat1 /sys/devices/pci0000:00/0000:00:02.0/drm/card0

В данном случае seat1 это имя второго рабочего места. Может быть произвольным. Теперь можно перезагрузить систему. После перезагрузки на обоих мониторах должно появиться приглашения к логину в графическую сессию. Если все прошло удачно, нужно идентифицировать в списке устройств на seat0 клавиатуру и мышь, которые следует передать на второе рабочее место. А затем подключить их к этому рабочему месту. Если в USB-порт вставлен хаб, можно подключить к рабочему месту хаб целиком. Все устройства, которые уже вставлены в него, или будут вставлены потом, автоматически унаследуют подключение к нужному рабочему месту.

Пример:

# loginctl seat-status seat1 
seat1
        Sessions: *1
         Devices:
                  ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card0
                  │ [MASTER] drm:card0
                  │ ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-DP-1
                  │ │ [MASTER] drm:card0-DP-1
                  │ ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-HDMI-A-1
                  │ │ [MASTER] drm:card0-HDMI-A-1
                  │ ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-HDMI-A-2
                  │ │ [MASTER] drm:card0-HDMI-A-2
                  │ ├─/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-HDMI-A-3
                  │ │ [MASTER] drm:card0-HDMI-A-3
                  │ └─/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-VGA-1
                  │   [MASTER] drm:card0-VGA-1
                  ├─/sys/devices/pci0000:00/0000:00:02.0/graphics/fb1
                  │ graphics:fb1 "i915drmfb"
                  ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.3/3-1.4.3:1.0/0003:1BCF:08A6.0005/input/input7
                  │ input:input7 "  Gaming Mouse"
                  ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.3/3-1.4.3:1.1/0003:1BCF:08A6.0006/input/input10
                  │ input:input10 "  Gaming Mouse System Control"
                  ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.3/3-1.4.3:1.1/0003:1BCF:08A6.0006/input/input8
                  │ input:input8 "  Gaming Mouse Keyboard"
                  ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.3/3-1.4.3:1.1/0003:1BCF:08A6.0006/input/input9
                  │ input:input9 "  Gaming Mouse Consumer Control"
                  ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.4/3-1.4.4:1.0/0003:04F3:0103.0007/input/input11
                  │ input:input11 "HID 04f3:0103"
                  ├─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.4/3-1.4.4:1.1/0003:04F3:0103.0008/input/input12
                  │ input:input12 "HID 04f3:0103 Consumer Control"
                  └─/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/0000:05:01.0/0000:06:00.0/usb3/3-1/3-1.4/3-1.4.4/3-1.4.4:1.1/0003:04F3:0103.0008/input/input13
                    input:input13 "HID 04f3:0103 System Control"


Все, минимальное конфигурирование двух рабочих мест закончено. Два пользователя могут одновременно входить в свои сессии и работать независимо!

Настройка звука

Если в системе имеется несколько звуковых карт (например, на материнской плате и дискретная, или подключенная по USB), то достаточно просто передать одну карту на второе рабочее место. Звук с этого рабочего места автоматически пойдет через выделенную ему карту. Если в системе только одна, но многоканальная карта, то можно попробовать разделить ее на две виртуальные карты через настройки ALSA, а затем уже их распределить между рабочими местами.

Удаление устройств из рабочего места

К сожалению, невозможно удалить одно устройство из рабочего места. Можно только удалить дополнительные рабоче места сразу:

#loginctl flush-devices

Поэтому, если вы что-то добавили неправильно, сохраните вывод loginctl seat-status seat1, чтоб не потерять "правильные" устройства.

Тем не менее см. тж. /etc/udev/rules.d/72-seat-*.rules.

Ссылки

Примерно то же самое написано тут: [1]

Пожелания

Есть пожелания по созданию интерфейса для настройки рабочих мест.