Como iniciar corretamente o x11vnc através da ativação do soquete systemd?

4

Eu gostaria de configurar a ativação do soquete do sistema para x11vnc em um servidor, mas não estou obtendo a configuração adequada para atingir meus requisitos.

Eu gostaria de:

  • Abra uma nova conexão VNC para o servidor na porta padrão (5900). A ativação do soquete deve iniciar x11vnc no servidor X atualmente em execução.
  • Conecte um segundo cliente ao mesmo servidor vnc para que eles possam ver a mesma tela.
  • Quando o último cliente se desconectar, x11vnc deve ser interrompido.
  • Uma nova conexão do cliente reativa x11vnc , se não estiver em execução.

O Systemd está em 225 e x11vnc em 0.9.13.

Parece que não posso usar uma combinação simples de arquivos x11vnc.socket + x11vnc.service porque x11vnc mapeará para a próxima porta TCP (5901) se detectar que a porta padrão (5900) já está sendo usada (pelo soquete systemd).

Então eu uso um "proxy" systemd (veja link ) que systemd ouvir 5900 e x11vnc em 5901. Então eu tenho:

proxy-para-x11vnc.socket :

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

proxy-para-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

Somente o proxy-to-x11vnc.socket é iniciado / ativado.

O problema com esta configuração é:

  • Na primeira conexão do cliente, vejo x11vnc sendo iniciado e escutando na porta correta, mas a conexão do cliente simplesmente "trava". Observando os logs do servidor x11vnc não recebe a tentativa de conexão.
  • Matando o cliente e reconectando com sucesso, mostre a exibição remota.
  • Desconectar o cliente permitirá que x11vnc termine, mas eu não posso me reconectar a ele. x11vnc.service está no estado inativo (morto) .

Obrigado!

    
por big_gie 29.09.2016 / 19:03

1 resposta

0

Infelizmente, não há uma solução completa para o seu problema. Seu terceiro ponto não é possível com o systemd-socket-proxyd atual, há uma solicitação de recurso no GitHub para abordar esta questão.

Para o seu primeiro ponto, o problema é que o x11vnc leva muito tempo para iniciar e não aceita conexão até que seja completamente iniciado. A solução, como proposto pelo atlasiano aqui , é adicionar um sono após o início o servidor vnc. O systemd-socket-proxyd esperará antes de encaminhar as comunicações.

Para o segundo ponto, há a opção -share para x11vnc para permitir que ele aceite mais de uma conexão.

O terceiro ponto infelizmente não é factível. Mas você pode parar o servidor vnc manualmente com systemctl stop x11vnc .

Mesmo que você não consiga interromper o x11vnc automaticamente, o quarto ponto funcionará quando o servidor for parado manualmente.

Para resumir, aqui estão os arquivos de que você precisa:

/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

Por favor, note a opção -forever para manter o servidor vnc em execução quando todos os clientes estiverem desconectados. É a única maneira que encontrei de poder reconectar até que a solicitação de recursos seja concluída. O ExecStartPost é a parte que espera até que o servidor vnc esteja ativo e em execução antes de permitir que o proxy encaminhe a conexão.

/ usr / local / bin / 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

Com toda essa configuração de scripts, você pode ativar o x11vnc-proxy.socket com systemctl enable x11vnc-proxy.socket e iniciá-lo systemctl start x11vnc-proxy.socket .

    
por 04.10.2017 / 15:15

Tags