Вопрос или проблема
У меня есть мощная машина, которую я хочу использовать как многосидячую систему. У нее есть две графические карты и две пары клавиатур и мышей. Мне удалось успешно настроить два “места” с использованием udev и Xorg.conf и запустить два X-сервера из скрипта, чтобы два пользователя могли иметь независимые сеансы. Для справки, вот мой файл правил udev, где я идентифицирую каждый USB-хаб и маркирую устройства и места:
SUBSYSTEM=="drm", KERNEL=="card[0-9]*", ATTRS{vendor}=="0x10de", DRIVERS=="nvidia", TAG+="master-of-seat"
# SUBSYSTEM=="drm", KERNEL=="card0", ENV{ID_SEAT}="seat0"
# SUBSYSTEM=="drm", KERNEL=="card1", ENV{ID_SEAT}="seat1"
SUBSYSTEM=="input", ENV{ID_INPUT.tags}="input_default"
# KVM HUBS
KERNELS=="3-2", ATTRS{bDeviceClass}=="09", ENV{KVM_HUB}="1", ENV{ID_SEAT}="seat0"
KERNELS=="3-8", ATTRS{bDeviceClass}=="09", ENV{KVM_HUB}="2", ENV{ID_SEAT}="seat1"
# Устройства HUB 1
KERNEL=="event*", ENV{KVM_HUB}=="1", ATTRS{bInterfaceProtocol}=="01" SYMLINK+="kvm_keyboard_1"
KERNEL=="event*", ENV{KVM_HUB}=="1", ATTRS{bInterfaceProtocol}=="02" SYMLINK+="kvm_mouse_1"
# Устройства HUB 2
KERNEL=="event*", ENV{KVM_HUB}=="2", ATTRS{bInterfaceProtocol}=="01" SYMLINK+="kvm_keyboard_2"
KERNEL=="event*", ENV{KVM_HUB}=="2", ATTRS{bInterfaceProtocol}=="02" SYMLINK+="kvm_mouse_2"
# Стандартное место
SUBSYSTEM=="input", TAG=="seat", ENV{ID_SEAT}=="" , ENV{ID_SEAT}="seat0"
# устанавливаем все теги соответственно
ENV{ID_SEAT}!="", ENV{ID_INPUT.tags}+="$env{ID_SEAT}" TAG+="$env{ID_SEAT}"
Соответствующая часть моего xorg.conf
файла выглядит так:
Section "ServerFlags"
# Option "AutoAddDevices" "false"
# Option "AutoEnableDevices" "false"
Option "DefaultServerLayout" "Layout0"
Option "AllowMouseOpenFail" "true"
Option "Xinerama" "0"
EndSection
# ---------------------------------------------------------------
# РАСКЛАД
Section "ServerLayout"
Identifier "Layout0"
Screen "Screen0"
MatchSeat "seat0"
Option "Clone" "off"
EndSection
Section "ServerLayout"
Identifier "Layout1"
Screen "Screen1"
MatchSeat "seat1"
Option "Clone" "off"
EndSection
Как я и говорил, я могу успешно запускать два независимых сеанса, используя следующий скрипт, но я хотел бы, чтобы это происходило автоматически при загрузке.
#!/bin/bash
set +x
rm /etc/X11/xorg.conf
cp ./xorg_independientes /etc/X11/xorg.conf
# X (:0)
systemctl stop gdm
killall Xorg
killall X
systemctl restart gdm
sleep 7
# X (:1)
su - sit -c "startx /usr/bin/gnome-session -- :1 vt4 -layout Layout1 -seat seat1 -sharevts" &
sleep 10
DISPLAY=:1 xhost +
Мой подход состоит в том, чтобы установить целевой уровень запуска по умолчанию на 4 (чтобы он имел все, кроме графики), а затем разместить эти команды в скрипте где-то.
Начиная с RHEL6, они используют Upstart для запуска процессов при загрузке. Чтобы запустить два разных X-сервера, создайте 2 отдельных скрипта для запуска вашего X-сервера на :0 и :1.
start_colon_0.sh:
#!/bin/sh
su - sit -c "startx -- :0 vt4 -layout Layout0 -seat seat0 -sharevts" &
start_colon_1.sh:
#!/bin/sh
su - sit -c "startx -- :1 vt4 -layout Layout1 -seat seat1 -sharevts" &
В /etc/init
создайте 2 файла конфигурации следующим образом:
x_server_0.conf:
start on stopped rc RUNLEVEL=5
stop on starting rc RUNLEVEL=[!5]
console output
respawn
exec start_colon_0.sh
x_server_1.conf:
start on stopped rc RUNLEVEL=5
stop on starting rc RUNLEVEL=[!5]
console output
respawn
exec start_colon_1.sh
Это будет запускать ваши скрипты при загрузке в уровень запуска 5.
Смотрите учебник по Upstart
Ответ или решение
Запуск двух X серверов при загрузке на RHEL
Если вам нужно автоматически запускать два независимых X сервера на системе Red Hat Enterprise Linux (RHEL), вы можете воспользоваться системой инициализации Upstart (начиная с RHEL 6). Ниже приведено пошаговое руководство, как это сделать:
Подготовка скриптов для запуска X серверов
Для начала создайте два скрипта, которые будут отвечать за запуск X серверов на экранах :0 и :1.
-
Создание скрипта для запуска X сервера на :0
Создайте файл
start_colon_0.sh
с следующим содержимым:#!/bin/sh su - sit -c "startx -- :0 vt4 -layout Layout0 -seat seat0 -sharevts" &
-
Создание скрипта для запуска X сервера на :1
Создайте файл
start_colon_1.sh
с следующим содержимым:#!/bin/sh su - sit -c "startx -- :1 vt4 -layout Layout1 -seat seat1 -sharevts" &
Не забудьте сделать оба скрипта исполняемыми:
chmod +x start_colon_0.sh
chmod +x start_colon_1.sh
Конфигурация Upstart
Теперь создайте конфигурационные файлы для Upstart в каталоге /etc/init
. Эти файлы будут управлять запуском ваших скриптов при загрузке.
-
Создание конфигурационного файла для :0
Создайте файл
/etc/init/x_server_0.conf
со следующим содержимым:start on stopped rc RUNLEVEL=5 stop on starting rc RUNLEVEL=[!5] console output respawn exec /path/to/your/start_colon_0.sh
Замените
/path/to/your
на фактический путь к вашему скрипту. -
Создание конфигурационного файла для :1
Создайте файл
/etc/init/x_server_1.conf
со следующим содержимым:start on stopped rc RUNLEVEL=5 stop on starting rc RUNLEVEL=[!5] console output respawn exec /path/to/your/start_colon_1.sh
Убедитесь, что путь к скрипту правильный.
Проверка изменений
После создания всех необходимых файлов, перезагрузите систему и проверьте, запустились ли оба X сервера. Если всё сделано правильно, пользователи, подключенные к seat0
и seat1
, должны иметь возможность работать независимо друг от друга.
Заключение
С помощью вышеуказанных шагов вы сможете автоматически запускать два независимых X сервера на RHEL. Этот подход не только обеспечивает удобство многопользовательского взаимодействия на одном мощном компьютере, но и настраивает эффективный рабочий процесс для различных пользователей. Убедитесь, что в системе правильно настроены все необходимые компоненты, включая udev, Xorg и пользовательские сессии, чтобы избежать возможных конфликтов при запуске.
Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!