Настройка Multiseat на Ubuntu 14.04

Доброго времени суток, уважаемые читатели нашего блога! Недавно столкнулся с вопросом установки нескольких рабочих мест на один компьютер в операционной системе Ubuntu 14.04. У меня получилось настроить режим Multiseat, как я и хотел, три рабочих места с одним системным блоком компьютера.

Конечно, эта заметка никак не связана с программированием в 1С, PHP или Delphi, но все же чуть-чуть программирования вы увидите в конце этой статьи. Думаю, что мои записи будут полезны тем, кто хочет настроить на своем компьютере режим Multiseat. В прошлой заметке я делился мыслями как настроить XAMPP на Mac OS X, а сегодня разберемся с Multiseat. Поехали!

Содержание

    1. Подбор видеокарт
    2. Определение значений видеокарт и USB-портов среди устройств, зарегистрированных в Ubuntu
    3. Настройка правил для режима Multiseat
    4. Автозапуск Firefox

Подбор видеокарт

Для начала нужно определится с видеокартами. Желательно, чтобы они были одного производителя, например Nvidia. У меня было их три: GeForce 7300 GS, GeForce 210, GeForce GT 220. На материнской плате было три PCI-слота, в них я и поместил эти видеокарты.

Пробовал другую материнскую плату с двумя PCI-слотами и одной встроенной видеокартой, но биос не позволил сделать так, чтобы совместно работали и встроенная и внешняя видеокарта, поэтому остановился на варианте с тремя внешними видеокартами.

Чтобы убедится, что все три видеокарты видны системе можно воспользоваться следующей командой консоли Linux:

	$ lspci |grep VGA

Определение значений видеокарт и USB-портов среди устройств, зарегистрированных в Ubuntu

Чтобы правильно настроить Multiseat в Ubuntu 14.04 нужно знать уникальный идентификатор каждого устройства или порта. Для этого нужно воспользоваться командой консоли:

	$ udevadm info --export-db > /home/user/udevadm.txt

Эта команда создаст файл, по указанному пути и запишет информацию об устройствах. Открыв этот файл в текстовом редакторе, можно с помощью поиска найти ваши порты и устройства. Файл получается большой, поэтому в диалоге поиска можно ввести, например: «GeForce» для поиска видекарт или «usb7» для поиска идентификатора USB-порт. Привожу часть информации из моего файла:

...
E: DEVPATH=/devices/pci0000:00/0000:00:1c.0/0000:05:00.0
E: DRIVER=nouveau
E: ID_MODEL_FROM_DATABASE=G72 [GeForce 7300 GS]
E: ID_PCI_CLASS_FROM_DATABASE=Display controller
E: ID_PCI_INTERFACE_FROM_DATABASE=VGA controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=VGA compatible controller
E: ID_VENDOR_FROM_DATABASE=NVIDIA Corporation
...
N: bus/usb/007/001
E: BUSNUM=007
E: DEVNAME=/dev/bus/usb/007/001
E: DEVNUM=001
E: DEVPATH=/devices/pci0000:00/0000:00:1d.1/usb7
E: DEVTYPE=usb_device
...

Значения DEVPATH, которые выделены жирным шрифтом — «/devices/pci0000:00/0000:00:1c.0/0000:05:00.0» и «/devices/pci0000:00/0000:00:1d.1/usb7», как раз, то, что нам нужно. Они нам понадобятся на следующем шаге.

Чтобы посмотреть подключенные USB устройства воспользуйтесь командой:

	$ lsusb

С помощью этой команды можно увидеть какому физическому порту соответствует идентификатор из файла «udevadm.txt». Чтобы понять это, вытащите одно из устройств, (например, мышку или клавиатуру) из USB-порта и введите команду вновь, затем сверьте изменения, которые произошли после повторного ввода команды «lsusb».

Настройка правил для режима Multiseat

Давайте настроим файл правил для Multiseat, воспользовавшись информацией из предыдущего шага. Для этого создадим файл:

	$ sudo touch /etc/udev/rules.d/99-multiseat.rules

В нем запишем следующую информацию:

# ************************ SEAT-1 ************************

# назначение USB порта мыши для seat-1
TAG==»seat», DEVPATH==»/devices/pci0000:00/0000:00:1a.2/usb5*»,
ENV{ID_SEAT}=»seat-1″, TAG+=»seat-1″

# назначение USB порта клавиатуры для seat-1
TAG==»seat», DEVPATH==»/devices/pci0000:00/0000:00:1d.0/usb6*»,
ENV{ID_SEAT}=»seat-1″, TAG+=»seat-1″

# назначение видеокарты GeForce 210 для seat-1
TAG==»seat», DEVPATH==»/devices/pci0000:00/0000:00:06.0/0000:02:00.0*»,
ENV{ID_SEAT}=»seat-1″, TAG+=»seat-1″

# ************************ SEAT-2 ************************

# назначение USB порта мыши для seat-2
TAG==»seat», DEVPATH==»/devices/pci0000:00/0000:00:1d.1/usb7*»,
ENV{ID_SEAT}=»seat-1″, TAG+=»seat-1″

# назначение USB порта клавиатуры для seat-2
TAG==»seat», DEVPATH==»/devices/pci0000:00/0000:00:1d.2/usb8*»,
ENV{ID_SEAT}=»seat-1″, TAG+=»seat-2″

# назначение видеокарты GeForce 7300 GS для seat-1
TAG==»seat», DEVPATH==»/devices/pci0000:00/0000:00:1c.0/0000:05:00.0*»,
ENV{ID_SEAT}=»seat-2″, TAG+=»seat-2″

Как вы могли догадаться, значения, которые выделены жирным шрифтом взяты из файла «udevadm.txt» (значения без звездочки). Мы настраиваем три рабочих места, а в файле правил нужно прописать только два. Почему? Дело в том, что одна из видеокарт и не прописанные в файле правил USB-порты будут автоматически присвоены рабочему месту с именем «seat0» (без тире в названии, таковы правила именования рабочих мест). После выполнения всех шагов нужно перезагрузить компьютер, чтобы изменения вступили в силу. После перезагрузки в консоли можно увидеть список подключенных рабочих мест, выполнив команду:

	$ loginctl list-seats

Еще нужно проверить файл «/etc/lightdm/lightdm.conf» в нем должна быть секция с соответствующим идентификатором и значением:

[LightDM]
logind-load-seats=true

Автозапуск Firefox

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

Firefox is already running, but is not responding.
To open a new window, you must first close the existing Firefox process,
or restart your system.

Дело в том, что рабочие места инициализируются от имени одного пользователя, поэтому выпадала такая ошибка. Решилась эта проблема созданием нескольких профилей для Firefox:

  1. Запустим менеджера профилей командой консоли:
    	$ firefox -P
    
  2. В окне менеджера профилей создадим три профиля FullScreenStorage0, FullScreenStorage1, FullScreenStorage2.
  3. Создадим исполняемый файл «firefox.multiseat»:
    	$ sudo touch /home/user/firefox.multiseat
    
  4. В нем запишем запуск для каждого рабочего места:
    	#!/bin/bash
    	firefox -P FullScreenStorage`echo $DISPLAY | cut -f2 -d\:`
    
  5. Пропишем запуск файла «firefox.multiseat» в автозагрузке.