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