MultiSeat systemd
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]
Пожелания
Есть пожелания по созданию интерфейса для настройки рабочих мест.