Метки
amd bittorrent bug centos debian enlightenment fedora fedora 8 fedora 9 fedora 10 fedora 11 fedora 12 fedora 13 fedora 15 fedora 16 FedoraMD fglrx firefox flash player gnome google intel interview java kde kernel linux livecd migrate moldova nvidia openoffice OpenStreetMap opera Orange ovirt radeon red hat rpmfusion Sandel skype video virtualisation vmware wine
несколько компьютеров и общая клавиатура/мышь
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
Метки: d-bus, debian, kde, rhel, synergy
7, 2015 9:35
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