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

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

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

UPD (2026-10-21): в разделе Wayland: готовой замены нет (пока) ниже написано, что аналога x2x для Wayland нет. С тех пор я нашёл рабочий вариант: lan-mouse — программный KVM на Rust. Я запускаю его на ноутбуке с Wayland (niri), и он передаёт клавиатуру и мышь на X11-машину (Archcraft на телевизоре) — то же ощущение «уводишь курсор за край экрана», что и в x2x, но с Wayland-десктопа на X11-сервер.

Коротко о настройке:

  1. Поставьте lan-mouse на обе машины, причём одной и той же версии / коммита. Релиз 0.11.0 с crates.io и git main говорят на разных ревизиях протокола — у меня всё падало с invalid event id, пока обе стороны не совпали.

  2. На X11-машине запустите lan-mouse daemon (он выберет X11-бэкенд эмуляции). Я запускаю его как пользовательский systemd-сервис с DISPLAY=:0 и XAUTHORITY=%h/.Xauthority, чтобы он стартовал при загрузке.

  3. На Wayland-машине добавьте X11-машину в ~/.config/lan-mouse/config.toml:

    [[clients]]
    position = "right"
    hostname = "tv-box"
    activate_on_startup = true
  4. Свяжите их: каждая сторона должна авторизовать сертификат другой командой lan-mouse cli authorize-key <имя> <sha256-отпечаток>, затем lan-mouse cli save-config. Отпечаток берётся так: openssl x509 -in ~/.config/lan-mouse/lan-mouse.pem -noout -fingerprint -sha256. Записывайте его строчными буквами — заглавные у меня не сработали.

  5. Откройте UDP-порт 4242 между машинами.

Как вернуться: когда курсор уехал на X11-машину, просто увести его обратно влево у меня работает не всегда. Надёжный способ — release bind lan-mouse: нажмите вместе Ctrl + Shift + Super + Alt, и курсор вернётся на исходный экран.

Что делает 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.

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