4

Я хотел бы настроить активацию системного сокета для x11vnc на сервере, но я не получаю надлежащую конфигурацию для удовлетворения моих требований.

Я бы хотел:

  • Откройте новое соединение VNC с сервером через стандартный порт (5900). Активация сокета должна запустить x11vnc на работающем в данный момент X-сервере.
  • Иметь возможность подключить второго клиента к одному и тому же серверу vnc, чтобы они оба могли видеть один и тот же экран.
  • Когда последний клиент отключается, x11vnc должен быть остановлен.
  • Новое клиентское соединение перезапускает x11vnc если оно не запущено.

Systemd находится на 225 и x11vnc на 0.9.13.

Кажется, я не могу использовать простую комбинацию файлов x11vnc.socket+x11vnc.service потому что x11vnc будет сопоставлен со следующим портом TCP (5901), если обнаружит, что стандартный порт (5900) уже используется (сокетом systemd).

Поэтому я использую "прокси" systemd (см. Https://www.freedesktop.org/software/systemd/man/systemd-socket-proxyd.html), чтобы systemd прослушивал 5900 и x11vnc на 5901. Так что я:

proxy-to-x11vnc.socket:

[Socket]
ListenStream=5900
[Install]
WantedBy=sockets.target

proxy-to-x11vnc.service:

[Unit]
Description=x11vnc
Requires=x11vnc.service
After=x11vnc.service
[Service]
User=myuser
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:5901

x11vnc.service:

[Unit]
Description=x11vnc
[Service]
User=myuser
StandardError=syslog
ExecStart=/usr/bin/x11vnc -auth /home/myuser/.Xauthority -shared -display :0 -rfbport 5901 -noipv6

Только proxy-to-x11vnc.socket запускается / включается.

Проблема с этой настройкой:

  • При первом клиентском подключении я вижу, что x11vnc запускается и прослушивает правильный порт, но клиентское соединение просто "зависает". Просматривая логи сервера x11vnc не получает попытку подключения.
  • Уничтожение клиента и повторное подключение успешно показывают удаленный дисплей.
  • Отключение клиента приведет к прекращению работы x11vnc , но я не смогу повторно подключиться к нему. x11vnc.service находится в неактивном (мертвом) состоянии.

Спасибо!

1 ответ1

0

К сожалению, нет полного решения вашей проблемы. Третий пункт невозможен с текущим systemd-socket-proxyd, на GitHub есть запрос функции для решения этой проблемы.

Во-первых, проблема в том, что x11vnc запускается довольно долго и не принимает соединение, пока оно не будет полностью запущено. Решение, предложенное здесь atlassian, заключается в добавлении спящего режима после запуска сервера vnc. Затем systemd-socket-proxyd будет ждать перед пересылкой сообщений.

Во-вторых, для -share опция -share, которая позволяет ему принимать более одного соединения.

Третий пункт, к сожалению, не выполним. Но вы можете вручную остановить сервер vnc с помощью systemctl stop x11vnc .

Даже если вы не можете остановить x11vnc автоматически, четвертая точка будет работать, когда сервер останавливается вручную.

Подводя итог, вот файлы, которые вам нужны:

/etc/systemd/system/x11vnc-proxy.socket

[Socket]
ListenStream=5900

[Install]
WantedBy=sockets.target

/etc/systemd/system/x11vnc-proxy.service

[Unit]
Requires=x11vnc.service
After=x11vnc.service

[Service]
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:15900

/etc/systemd/system/x11vnc.service

[Unit]
Description=VNC Server

[Service]
ExecStart=/usr/bin/x11vnc -forever -shared -rfbport 15900
ExecStartPost=/usr/local/bin/waitport 127.0.0.1 15900

[Install]
WantedBy=graphical.target

Обратите внимание на параметр -forever чтобы сервер vnc работал, когда все клиенты отключены. Это единственный способ восстановить соединение, пока не будет выполнен запрос функции . ExecStartPost - это часть, которая ожидает, пока vnc-сервер не будет запущен и работает, прежде чем прокси-сервер сможет переадресовать соединение.

/ USR / местные / бен / waitport

#!/bin/bash

host=$1
port=$2
tries=15

for i in `seq $tries`; do
    if /usr/bin/nc $host $port > /dev/null ; then
        # Ready
        exit 0
    fi

    /bin/sleep 1
done

# FAIL
exit -1

После установки всех этих сценариев вы можете затем включить x11vnc-proxy.socket с помощью systemctl enable x11vnc-proxy.socket и запустить его systemctl start x11vnc-proxy.socket .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .