x2x: одна клавиатура, два экрана

Как разделить клавиатуру и мышь между двумя X11-дисплеями с помощью x2x — без KVM-переключателя, без удалённого рабочего стола.

Два монитора рядом с курсором, перемещающимся между ними

Что делает x2x

x2x связывает два X-дисплея так, что клавиатура и мышь на одном управляют другим. Перемещаешь курсор за край экрана — он появляется на втором дисплее. Печатаешь на клавиатуре — буквы идут туда. Буфер обмена тоже работает между дисплеями.

Инструменту больше 20 лет, изначально его написал Давид Чайкен в DEC. Под капотом используется расширение XTEST. Работает через обычные X11-соединения или SSH-туннели.

Никакого KVM-переключателя. Никакого окна удалённого рабочего стола, съедающего половину экрана. Просто курсор скользит с одного монитора на другой.

Мой сетап

На полке рядом с телевизором стоит ThinkPad T460s. На нём Archcraft, он подключён к док-станции и соединён с телевизором через HDMI. С дивана я сижу со своим основным ноутбуком. Запускаю x2x — и когда двигаю курсор за правый край экрана ноутбука, он появляется на телевизоре. Могу управлять хомсервером оттуда — открыть браузер, починить застрявший медиаплеер, заглянуть в десктопное приложение — без второй клавиатуры.

Вот и вся суть. Одна клавиатура, одна мышь, два экрана.

Что я пробовал до этого

К x2x я пришёл не сразу. Сначала перепробовал более очевидные варианты:

  • RDP — полноценный удалённый рабочий стол в отдельном окне. Работает, но это именно окно поверх моего экрана, а не бесшовный переход курсора. Для «быстро что-то поправить на сервере» — избыточно.
  • VNC — та же история: окно с чужим рабочим столом, лаг картинки, приходится жать по крошечному превью. Не то ощущение, которое мне было нужно.
  • KDE Connect — умеет использовать телефон как тачпад/клавиатуру и много чего ещё между устройствами, но заточен под связку «телефон ↔ компьютер», а не «два десктопных X-дисплея рядом».

Все они решают задачу «показать чужой экран у себя». А мне нужно было обратное — оставить оба экрана как есть и просто перегонять между ними клавиатуру и мышь. В моём случае x2x подошёл заметно лучше всего перечисленного: никакого окна, никакого второго рабочего стола — курсор просто перетекает на соседний монитор.

Установка

x2x есть в большинстве дистрибутивов:

Terminal window
# Arch Linux / AUR
yay -S x2x
# Debian / Ubuntu
sudo apt install x2x
# Fedora
sudo dnf install x2x
# Gentoo
sudo emerge x11-misc/x2x

Или собрать из исходников:

Terminal window
git clone https://github.com/dottedmag/x2x && cd x2x
./bootstrap.sh
./configure
make && sudo make install

Способ 1: через SSH (проще и безопаснее)

Самый простой путь — подключиться по SSH с пробросом X11 и запустить x2x на удалённой машине:

Terminal window
ssh -XC homeserver x2x -east -to :0.0
  • -X включает проброс X11 через SSH
  • -C включает сжатие
  • -east означает, что дисплей хомсервера справа (на восток) от ноутбука
  • -to :0.0 указывает на дефолтный дисплей удалённой машины

Если ноутбук справа, а сервер слева — используйте -west.

Полный адрес дисплея тоже работает:

Terminal window
ssh -XC homeserver x2x -west -to homeserver:0.0

Когда отключаетесь от SSH, x2x останавливается автоматически. Никаких зависших процессов.

На практике команда, которую я реально запускаю с ноутбука, выглядит так:

Terminal window
ssh -YC archcraft-lan "/usr/bin/x2x -east -to :0"

Полный путь до x2x важен: когда вы передаёте команду через SSH, логин-профиль не загружается и PATH может не содержать эту программу. -YC включает проброс с сжатием, archcraft-lan — хостнейм в моей локальной сети, -to :0 указывает на дефолтный дисплей хомсервера.

Способ 2: прямое подключение через xauth

Если нужен буфер обмена между дисплеями или хочется обойтись без SSH, можно запустить x2x локально и подключиться к удалённому X-серверу напрямую.

Сначала скопируйте куки аутентификации X11 с хомсервера на ноутбук.

На хомсервере:

Terminal window
# Проверяем текущий дисплей
echo $DISPLAY
# :0.0
# Извлекаем куки аутентификации
xauth nextract - :0.0
# Вывод: MIT-MAGIC-COOKIE-1 0412deadbeefcafe1234567890abcdef

На ноутбуке добавьте эту куки:

Terminal window
xauth nmerge - <вставьте куки сюда>

Теперь запускайте x2x напрямую:

Terminal window
x2x -from :0 -to homeserver:0.0 -east

Где :0 — дисплей ноутбука, а homeserver:0.0 — удалённый дисплей.

Проверить наличие куки можно командой:

Terminal window
xauth nlist

Также нужно, чтобы TCP-порт X11 был открыт на обеих машинах (порт 6000 + номер дисплея). Проверьте /etc/X11/xorg.conf или настройки вашего дисплей-менеджера.

Способ 3: через xhost (только для локальной сети, быстро, но небезопасно)

Для домашней локалки можно обойтись совсем без куки. На хомсервере разрешите подключение ноутбука:

Terminal window
xhost +<ip-адрес-ноутбука>

Затем на ноутбуке:

Terminal window
x2x -from :0 -to homeserver:0.0 -east

Это наименее безопасный вариант. Любой в сети может подключиться к вашему X-серверу. Нормально для домашней локалки, которой вы доверяете, но не для чего-то доступного извне.

Полезные опции

Terminal window
# Направление
x2x -to server:0.0 -east # сервер справа
x2x -to server:0.0 -west # сервер слева
x2x -to server:0.0 -north # сервер сверху
x2x -to server:0.0 -south # сервер снизу
# Только клавиатура, без мыши
x2x -to server:0.0 -east -nomouse
# Без буфера обмена
x2x -to server:0.0 -east -nosel
# Ждать готовности дисплеев (удобно в скриптах)
x2x -to server:0.0 -east -wait
# Блокировать возврат курсора при зажатых кнопках мыши
x2x -to server:0.0 -east -buttonblock

Проблема застрявшего курсора

Одна реальная проблема, которую я пока не решил до конца: когда SSH-соединение обрывается (WiFi дёрнулся, ноутбук уснул и т.д.), курсор может застрять на дисплее хомсервера. Обратно его не вернуть, потому что x2x уже не передаёт события мыши, но удалённый X-сервер всё ещё считает, что владеет курсором.

Обходные пути:

  • Убить и перезапустить x2x. Если SSH-сессия ещё жива, убийство x2x на удалённой стороне возвращает курсор на локальный дисплей.
  • Подключиться по SSH и запустить xdotool mousemove. Если есть шелл на хомсервере, можно переместить курсор программно:
    Terminal window
    ssh homeserver xdotool mousemove 0 0
  • Использовать xhost + на хомсервере напрямую. Если есть физический доступ — подойдите к телевизору и наберите:
    Terminal window
    # На хомсервере убить зависший x2x
    pkill x2x

Если у кого-то есть более элегантное решение — буду рад услышать.

Когда использовать x2x

Подходит для:

  • Управления машиной рядом с основным рабочим местом
  • Домашнего сервера, подключённого к телевизору, с которым нужно иногда взаимодействовать
  • Ситуаций, когда нужен весь экран, а не окно удалённого рабочего стола
  • Быстрых двухмашинных сетапов, которые не оправдывают KVM-переключатель

Не подходит для:

  • Машин далеко друг от друга на медленной сети (задержка важна)
  • Wayland — см. ниже
  • Сложных мультимониторных раскладок (бывает капризничает)

Wayland: готовой замены нет (пока)

x2x работает через расширение XTEST, которое позволяет внедрять события ввода в окна другого X-сервера. Wayland построен с более строгой моделью безопасности — один композитор не может напрямую управлять вводом другого. Это ломает основной функционал x2x.

Прямого аналога для Wayland сегодня нет. Ближайшие варианты:

  • Input Leap (форк Barrier/Synergy) — делится клавиатурой и мышью по сети, лучше поддерживает Wayland, чем предшественники. Работает по модели клиент/сервер, а не через прямое внедрение ввода.
  • Synergy / Barrier — более старые инструменты, от которых форкнулся Input Leap. До сих пор существуют и поддерживаются, но Input Leap обычно предпочтительнее.
  • KVM-переключатели или USB-хабы — аппаратное решение, без софта. Подходит, если обе машины физически рядом.

Я не пробовал ни один из этих инструментов. Предполагаю, что ни один из них не будет таким бесшовным, как x2x — скольжение курсора, ощущение «просто работает», минимальная настройка. Эти инструменты работают как сервисы, требуют конфигурации и оперируют на другом уровне. Но если вы на Wayland — это то, что есть.

Сообщество Linux работает над стандартизированными протоколами (такими как XDG-foreign) для контролируемого обмена вводом и буфером обмена между композиторами Wayland, но стабильного и широко доступного решения пока нет. Стоит обратить внимание на rkvm — нативный для Wayland инструмент обмена вводом, написанный на Rust.

Смотрите также