Setup VNC server on Ubuntu 20.04/ Настройка VNC сервера на Ubuntu 20.04

Есть два способа использовать VNC — подключаться к уже существующему сеансу пользователя (тот, что отображается на мониторе ПК), либо для каждого пользователя системы запускать свою сессию, но есть нюанс — TCP порт для каждой сессии будет отдельный.

Вариант первый. Подключение к текущей сессии пользователя.

Установка x11vnc

user@ubuntu$ sudo apt install x11vnc

Создание пароля для подключения к сессии, опционально

user@ubuntu$ sudo x11vnc -storepasswd /etc/x11vnc.passwd

далее устанавливаем файлу с паролем права.

user@ubuntu$ sudo chmod 0400 /etc/x11vnc.passwd

чтобы нам не приходилось вручную запускать каждый раз VNC, создадим службу

user@ubuntu$ sudo nano /etc/systemd/system/x11vnc.service

вставьте следующий текст в файл /etc/systemd/system/x11vnc.service

если вы не используете пароль, удалите это: -rfbauth /etc/x11vnc.passwd

[Unit]
Description=Start x11vnc
After=multi-user.target display-manager.service

[Service]
Type=simple

ExecStart=/bin/sh -c '/usr/bin/x11vnc -display :0 -forever  -rfbport 5900 -xkb -noxrecord -noxfixes -noxdamage -nomodtweak -repeat -shared -norc -auth /var/run/sddm/* -rfbauth /etc/x11vnc.passwd'

# For KDE ONLY, include the "Restart" and "RestartSec" commands, otherwise you could just use "-loop" but that is busted since at least kubuntu 18.04
# This was added because logging out killed the x11vnc session even though "-loop -forever" was enabled.
# NOTE: In order to use this, make sure "-loop" switch is not used above!!
# NOTE: While vnc client will disconnect, at least the vncserver will restart itself to client can connect again.
Restart=always
RestartSec=1

ExecStop=/usr/bin/killall x11vnc

[Install]
WantedBy=multi-user.target

Тут надо быть внимательным к параметру -auth в переменной ExecStart, так как мой вариант предназначен для SDDM, если у вас установлен, например менеджер LightDM, надо указывать другую строку, которую можно подсмотреть здесь:

user@ubuntu$ ps wwwaux | grep auth
/usr/lib/xorg/Xorg -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch

копируем параметр auth и берем в скрипт запуска службы выше, тогда все заработает как надо.

Теперь перезагрузите systemd, чтобы он прочитал конфигурацию нового сервиса:

user@ubuntu$ sudo systemctl daemon-reload

теперь можно попробовать запустить новую службу и проверить, что все стартовало удачно:

user@ubuntu$ sudo systemctl start x11vnc
user@ubuntu$ sudo systemctl status x11vnc

Если все в порядке, разрешим запуск службы при старте системы:

user@ubuntu$ sudo systemctl enable x11vnc

Вариант второй. Сессия для каждого пользователя.

В этом случае используем tigervnc-standalone-server:

user@ubuntu$ sudo apt install tigervnc-standalone-server

после установки под каждым пользователем (su - username) нужно запустить команду vncpasswd

user@ubuntu$ vncpasswd

а также нужно создать или редактировать файл ~/.vnc/xstartup

[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession

Теперь пробуем запустить vncserver:

user@ubuntu$ vncserver

на этом этапе дебажим все неполадки, и если все нормально, можем выключать VNC сессию:

user@ubuntu$ vncserver -kill :1

посмотреть, что запущено можно так:

user@ubuntu$ vncserver -list

Теперь нам нужно сделать так, чтобы для каждого пользователя запускался свой экземпляр VNC сервера на отдельном TCP порту.

Для этого создаем файл /etc/vncserver/server.sh

#!/bin/bash

unset VNCSERVERARGS
VNCSERVERS=""
[ -f /etc/vncserver/vncservers.conf ] && . /etc/vncserver/vncservers.conf
prog=$"VNC server"

start() {
        . /lib/lsb/init-functions
        REQ_USER=$2
        echo -n $"Starting $prog: "
        ulimit -S -c 0 >/dev/null 2>&1
        RETVAL=0
        for display in ${VNCSERVERS}
        do
                export USER="${display##*:}"
                if test -z "${REQ_USER}" -o "${REQ_USER}" == ${USER} ; then
                        echo -n "${display} "
                        unset BASH_ENV ENV
                        DISP="${display%%:*}"
                        export VNCUSERARGS="${VNCSERVERARGS[${DISP}]}"
                        su ${USER} -c "cd ~${USER} && [ -f .vnc/passwd ] && vncserver :${DISP} ${VNCUSERARGS}"
                fi
        done
}

stop() {
        . /lib/lsb/init-functions
        REQ_USER=$2
        echo -n $"Shutting down VNCServer: "
        for display in ${VNCSERVERS}
        do
                export USER="${display##*:}"
                if test -z "${REQ_USER}" -o "${REQ_USER}" == ${USER} ; then
                        echo -n "${display} "
                        unset BASH_ENV ENV
                        export USER="${display##*:}"
                        su ${USER} -c "vncserver -kill :${display%%:*}" >/dev/null 2>&1
                fi
        done
        echo -e "\n"
        echo "VNCServer Stopped"
}

case "$1" in
start)
start $@
;;
stop)
stop $@
;;
restart|reload)
stop $@
sleep 3
start $@
;;
condrestart)
if [ -f /var/lock/subsys/vncserver ]; then
stop $@
sleep 3
start $@
fi
;;
status)
status Xvnc
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
exit 1
esac

и не забудем сделать файл исполняемым

user@ubuntu$ sudo chmod +x /etc/vncserver/server.sh

это наш основной скрипт, запускающий VNC экземпляры согласно файлу конфигурации /etc/vncserver/vncservers.conf, где перечислены пользователи и аргументы запуска для каждого

VNCSERVERS="2:user2 1:user1"
VNCSERVERARGS[1]="-geometry 1280x1024 -localhost no "
VNCSERVERARGS[2]="-geometry 1280x1024 -localhost no "

Теперь можем создать службу в systemd /etc/systemd/system/vncserver.service

[Unit]
Description=Start VNC server sessions

[Service]
Type=forking
ExecStart=/bin/bash /etc/vncserver/server.sh start
ExecStop=/bin/bash /etc/vncserver/server.sh stop
RemainAfterExit=True

[Install]
WantedBy=multi-user.target

перезагрузите systemd, чтобы он прочитал конфигурацию нового сервиса:

user@ubuntu$ sudo systemctl daemon-reload

теперь остается запустить службу и убедиться, что все подключается как должно

user@ubuntu$ sudo systemctl start vncserver
user@ubuntu$ sudo systemctl status vncserver

Каждый пользователь будет под портом 590X, где X это номер в файле /etc/vncserver/vncservers.conf

Оставьте комментарий