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 есть в большинстве дистрибутивов:
# Arch Linux / AURyay -S x2x
# Debian / Ubuntusudo apt install x2x
# Fedorasudo dnf install x2x
# Gentoosudo emerge x11-misc/x2xИли собрать из исходников:
git clone https://github.com/dottedmag/x2x && cd x2x./bootstrap.sh./configuremake && sudo make installСпособ 1: через SSH (проще и безопаснее)
Самый простой путь — подключиться по SSH с пробросом X11 и запустить x2x на удалённой машине:
ssh -XC homeserver x2x -east -to :0.0-Xвключает проброс X11 через SSH-Cвключает сжатие-eastозначает, что дисплей хомсервера справа (на восток) от ноутбука-to :0.0указывает на дефолтный дисплей удалённой машины
Если ноутбук справа, а сервер слева — используйте -west.
Полный адрес дисплея тоже работает:
ssh -XC homeserver x2x -west -to homeserver:0.0Когда отключаетесь от SSH, x2x останавливается автоматически. Никаких зависших процессов.
На практике команда, которую я реально запускаю с ноутбука, выглядит так:
ssh -YC archcraft-lan "/usr/bin/x2x -east -to :0"Полный путь до x2x важен: когда вы передаёте команду через SSH, логин-профиль не загружается и PATH может не содержать эту программу. -YC включает проброс с сжатием, archcraft-lan — хостнейм в моей локальной сети, -to :0 указывает на дефолтный дисплей хомсервера.
Способ 2: прямое подключение через xauth
Если нужен буфер обмена между дисплеями или хочется обойтись без SSH, можно запустить x2x локально и подключиться к удалённому X-серверу напрямую.
Сначала скопируйте куки аутентификации X11 с хомсервера на ноутбук.
На хомсервере:
# Проверяем текущий дисплейecho $DISPLAY# :0.0
# Извлекаем куки аутентификацииxauth nextract - :0.0# Вывод: MIT-MAGIC-COOKIE-1 0412deadbeefcafe1234567890abcdefНа ноутбуке добавьте эту куки:
xauth nmerge - <вставьте куки сюда>Теперь запускайте x2x напрямую:
x2x -from :0 -to homeserver:0.0 -eastГде :0 — дисплей ноутбука, а homeserver:0.0 — удалённый дисплей.
Проверить наличие куки можно командой:
xauth nlistТакже нужно, чтобы TCP-порт X11 был открыт на обеих машинах (порт 6000 + номер дисплея). Проверьте /etc/X11/xorg.conf или настройки вашего дисплей-менеджера.
Способ 3: через xhost (только для локальной сети, быстро, но небезопасно)
Для домашней локалки можно обойтись совсем без куки. На хомсервере разрешите подключение ноутбука:
xhost +<ip-адрес-ноутбука>Затем на ноутбуке:
x2x -from :0 -to homeserver:0.0 -eastЭто наименее безопасный вариант. Любой в сети может подключиться к вашему X-серверу. Нормально для домашней локалки, которой вы доверяете, но не для чего-то доступного извне.
Полезные опции
# Направление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 # На хомсервере убить зависший x2xpkill 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.
Смотрите также
- Домашний сервер в гостиной за $300 на старом ThinkPad T460s — полная история про ThinkPad, которым управляет x2x: сервисы, хранилище, Telegram-боты и решение перейти на NixOS.
- Сеть-меш за CGNAT и DPI — как хомсервер остаётся доступным из любой точки через приватную mesh-сеть, туннель через CGNAT и VPN для обхода DPI.