несколько компьютеров и общая клавиатура/мышь

    2014-05-03 18:08 | Автор: jekader | Filed under: Jekader

    Так сложилось, что на работе у меня два компьютера и в сумме аж 4 монитора. КДПВ:

    Ноутбук работает на Debian и контролирует левые два дисплея. Мониторы справа подключены к системнику на RHEL6, причём один из них расположен вертикально. Пришлось немного поработать напильником, чтобы сделать это удобным для работы. Решил описать процесс здесь пока не забыл. Предложения по оптимизации принимаются!

    Задачи, которые потребовалось решить:
    1) использовать мышь и клавиатуру с ноутбука для управления обеими системами
    2) перевернуть четвёртый монитор вертикально
    3) одновременно блокировать/разблокировать экраны обоих компьютеров

    Решения по порядку, с применением изрядного количества костылей:

    1) естественно, для использования одного комплекта устройств ввода будет применяться synergy.
    Будем считать, что у нас слева стоит компьютер debian.lan а справа от него - rhel.lan. Клавиатура и мышь подключены к debian.lan, поэтому со стороны synergy эта машина будет выступать "сервером".

    Для начала устанавливаем софт.
    Debian:
    я привык пользоваться GUI надстройкой QuickSynergy, поэтому качаем её
    # apt-get install quicksynergy
    RHEL:
    Скачиваем synergy-plus из EPEL:
    # yum install synergy-plus

    В качестве сервера выступит Debian и GUI SynergyPlus - мне так удобнее, но без проблем можно обойтись и консольной утилитой. Запускаем егои указываем hostname клиента в поле с той стороны, с какой хотим подключить его экраны. В моём случае справа:

    Synergy работает на порту 24800, так что открываем его в iptables.
    Настройки со стороны "сервера" закончены, нажимаем "Execute".

    На стороне RHEL цепляемся из консоли:
    $ synergyc debian.lan

    Проверив что всё работает я написал скрипт с этой командой и поставил его в автозагрузку при логине пользователя в KDE.
    (Параметры Системы -> Системное Администрирование -> Запуск и завершение -> Автозапуск -> Добавить скрипт)

    2) KDE в RHEL6 ни в какую не желает переворачивать дисплей, поэтому я воспользовался xrandr:
    поворачиваем второй дисплей:
    $ xrandr --output DVI-I-2 --rotate left
    передвигаем его чуть ниже, иначе они выравниваются по верхнему краю согласно схеме:
    0 1680 1680+1080

    0 A-------------------
    | |
    | |
    | |
    600 B---------------------| DVI-I-2 |
    | | |
    | | |
    | | |
    | | |
    | DVI-I-1 | 1080x1920 |
    | 1680x1050 | |
    | | |
    ----------------------| |
    | |
    1920 --------------------

    Таким образом, первый дисплей должен быть смещён на 600 пикселей по оси Y а второй - на 1680 по оси X.
    Итоговая команда:
    $ xrandr --output DVI-I-1 --pos 0x600 --output DVI-I-2 --pos 1680x0
    (схема будет ниже)

    эти команды я вписал в тот-же скрипт автозагрузки, перед запуском synergy. Итоговый скрипт выглядит так:
    $ cat /home/jekader/start_synergy.sh
    #!/bin/sh
    /usr/bin/xrandr --output DVI-I-2 --rotate left
    /usr/bin/xrandr --output DVI-I-1 --pos 0x600 --output DVI-I-2 --pos 1680x0
    /usr/bin/synergyc debian.lan

    3) В современных дистрибутивах отдавать команды блокировки/разблокировки экрана можно через D-Bus. Самым простым решением для меня было написать скрипт на основе этого примера. Он находит активную сессию D-bus текущего пользователя и выдаёт в ней команду на блокирование экрана. Этот скрипт я сохранил на машине с RHEL:

    $ cat /home/jekader/screenlock.sh
    #!/bin/bash

    compatiblePrograms=( nautilus kdeinit kded4 pulseaudio trackerd )
    # Attempt to get a program pid
    for index in ${compatiblePrograms[@]}; do
    PID=$(/sbin/pidof -s ${index})
    if [[ "${PID}" != "" ]]; then
    break
    fi
    done
    if [[ "${PID}" == "" ]]; then
    echo "Could not detect active login session"
    exit 1
    fi

    QUERY_ENVIRON="$(tr '\0' '\n' < /proc/${PID}/environ | grep "DBUS_SESSION_BUS_ADDRESS" | cut -d "=" -f 2-)"
    if [[ "${QUERY_ENVIRON}" != "" ]]; then
    export DBUS_SESSION_BUS_ADDRESS="${QUERY_ENVIRON}"
    else
    echo "Could not find dbus session ID in user environment."
    exit 1
    fi

    case "$1" in
    "lock")
    /usr/bin/qdbus org.freedesktop.ScreenSaver /ScreenSaver Lock
    ;;
    "unlock")
    /usr/bin/qdbus org.freedesktop.ScreenSaver /ScreenSaver SetActive false
    ;;
    esac

    На стороне Debian пришлось вклиниться в работу kscreenlocker и заменить бинарник на скрипт, который сначала выполняет SSH команду по блокированию экрана RHEL, а затем запускает "настоящий" kscreenlocker. Когда экран разблокируется, Kscreenlocker завершается и скрипт выполняет команду разблокировки экрана RHEL.

    Делается это так:
    - обмениваемся SSH ключами, чтобы скрипт логинился без пароля.
    - создаём наш скрипт как /usr/lib/kde4/libexec/fake_kscreenlocker_greet:
    cat /usr/lib/kde4/libexec/fake_kscreenlocker_greet
    #!/bin/sh
    # Do stuff before locking...
    /usr/bin/ssh rhel.lan -o ConnectTimeout=3 -C "/bin/bash /home/jekader/screenlock.sh lock" >/dev/null 2&>1 &
    # Launch actual kscreenlocker...
    /usr/lib/kde4/libexec/real_kscreenlocker_greet $@
    # Do stuff after unlocking...
    /usr/bin/ssh rhel.lan -o ConnectTimeout=3 -C "/bin/bash /home/jekader/screenlock.sh unlock" >/dev/null 2&>1 &

    - делаем его исполняемым:
    chmod +x /usr/lib/kde4/libexec/fake_kscreenlocker_greet
    - подменяем kscreenlocker:

    mv /usr/lib/kde4/libexec/kscreenlocker_greet /usr/lib/kde4/libexec/real_kscreenlocker_greet
    ln -s /usr/lib/kde4/libexec/fake_kscreenlocker_greet /usr/lib/kde4/libexec/kscreenlocker_greet

    Теперь при блокировании экрана Debian блокируется и RHEL, а мышь с клавиатурой работают на всех четырёх экранах. Буфер обмена, между прочим, также синхронизируется. Только окошки двигать между компьютерами нельзя, а ведь иногда так хочется 🙂

    Источники:
    перехват D-Bus сессии: http://ubuntuforums.org/showthread.php?t=1059023
    перехват kscreenlocker: https://forum.kde.org/viewtopic.php?f=111&t=85545

    1 Star2 Stars3 Stars4 Stars5 Stars (4 votes, average: 5,00 out of 5)
    Loading...

    Метки: , , , ,

    Comments (1) »


    1 комментарий

    1. jekader:

      Note to self:

      для KDE5 положение kscreenlocker_greet изменилось. Исправленные шаги:

      # cd /usr/lib/x86_64-linux-gnu/libexec/
      # cat >> fake_kscreenlocker_greet

      #!/bin/sh
      /usr/bin/ssh rhel.lan -o ConnectTimeout=3 -C «/bin/bash /home/jekader/screenlock.sh lock» >/dev/null 2&>1 &
      /usr/lib/x86_64-linux-gnu/libexec/real_kscreenlocker_greet $@
      /usr/bin/ssh rhel.lan -o ConnectTimeout=3 -C «/bin/bash /home/jekader/screenlock.sh unlock» >/dev/null 2&>1 &

      # chmod +x fake_kscreenlocker_greet
      # mv kscreenlocker_greet real_kscreenlocker_greet
      # ln -s fake_kscreenlocker_greet kscreenlocker_greet

    Leave a comment

    *