ubuntuusers.de

TigerVNC

Achtung!

Die Verwendung dieses Howto geschieht auf eigene Gefahr. Bei Problemen mit der Anleitung melde dies bitte in der dazugehörigen Diskussion und wende dich zusätzlich an den Verfasser des Howtos.

Hinweis:

Diese Howto-Anleitung wurde zuletzt von Cordess am 16.02.2022 unter Xubuntu 21.10 erfolgreich getestet.

Hinweis:

Aufgrund eines Bugs funktioniert das Howto nicht unter Gnome.

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

./tigervnc_logo.png

Dieser Artikel behandelt die Installation und Einrichtung von TigerVNC und ist für grafische Remoteverbindungen via VNC gedacht, bei denen der Remote-Nutzer nicht gleichzeitig auf dem Server in die grafische Umgebung auch lokal eingeloggt ist. Für Grundlagen zum Thema VNC dient der Hauptartikel VNC.

TigerVNC 🇬🇧 ist eine Abspaltung von TightVNC, die noch aktiv gepflegt wird. TigerVNC kann direkt aus den Quellen installiert werden.

Installation auf dem Remote-Rechner (Server)

Zuerst loggt man sich per ssh in den Remote-Rechner ein[1]. Der sshd-Server sollte dazu auf dem Remote-Rechner bereits gestartet sein:

ssh nutzername@hostname 

Anschließend installiert man auf dem Remote-Rechner dazu folgendes Paket und seine Abhängigkeiten[2]:

  • tigervnc-standalone-server

Befehl zum Installieren der Pakete:

sudo apt-get install tigervnc-standalone-server 

Oder mit apturl installieren, Link: apt://tigervnc-standalone-server

Konfiguration von TigerVNC auf dem Server

Globale Voreinstellung

Zuerst erstellt man eine globale Konfiguration, die für jeden Nutzer gelten soll.

Dazu editiert man die Datei /etc/tigervnc/vncserver-config-mandatory in einem Editor[3] mit Rootrechten [4]

Darin trägt man dann zur bestehenden voreingestellten Konfiguration folgenden Wert ein

# Beschränkt vnc auf localhost, um vnc dennoch zu erreichen muss man mit ssh einen Tunnel aufbauen.
$localhost = "yes";

Die Option $localhost = "yes"; beschränkt die Erreichbarkeit von vnc auf den localhost des Servers. Dies dient der Sicherheit. Um sich dennoch via VNC mit dem Server zu verbinden, wird mittels ssh ein Tunnel aufgebaut. Dazu aber mehr weiter unten in der Beschreibung zum TigerVNC Client.

Wenn man möchte, kann man noch die Auflösung global für alle Nutzer festlegen. Dies erfolgt mit der Option $geometry = "1888x1184" die man ebenfalls in obige Configdatei einträgt.

Da TigerVNC das Bild in 32*32 Pixel große Kacheln aufteilt und nur die Kacheln überträgt, die sich verändert haben, empfiehlt es sich, eine Auflösung zu wählen, die exakt ein Vielfaches von 32 beträgt. Dies hilft der Performance und vermeidet, unnötig Daten zu komprimieren, verschlüssele und über das Netzwerk zu übertragen. So ergibt die Auflösung 1900x1200 sowohl in der vertikalen, als auch horizontalen Richtung einen Rest, wenn man die x- und y-Komponente mit dem Modulo Operator durch 32 teilt. Ist die x- und y-Komponente dagegen ein Vielfaches von 32, wie bspw. bei 1888x1184, dann passiert dies nicht. Würde man also eine Auflösung wählen, bei der der Rest genau 1 beträgt, dann wäre das der "Worst Case" Fall.

Nutzerspezifische Konfiguration

Für jeden Nutzer, der sich Remote mittels TigerVNC mit dem Server verbinden möchte muss auf dem Server ein Nutzeraccount existieren.

Im Homeverzeichnis des jeweiligen Nutzers wird dann ein Verzeichnis und eine Konfigurationsdatei für TigerVNC angelegt.

mkdir ~/.vnc 

Im Verzeichnis ~/.vnc wird dann mit einem Editor eine Textdatei Namens vnc.conf mit folgendem Inhalt erstellt:

# Auflösung:
$geometry = "1664x960";

# Beschränkt vnc auf localhost, um vnc dennoch zu erreichen muss man mit ssh einen Tunnel aufbauen.
$localhost = "yes";

# Optional das zu nutzende Desktop Environment (mehr dazu weiter unten im Artikel)
#$session = LXDE

Die Auflösung kann in dieser Konfigurationsdatei hinter dem Wert $geometry angegeben werden. Für die Auflösung kann eine beliebige Auflösung angegeben werden, es empfiehlt sich aber, wie oben bereits erwähnt, ein Vielfaches von 32 zu verwenden und sie nicht größer zu machen, als der Bildschirm auf dem Clientgerät anzeigen kann. Da auf dem Clientgerät aber sicherlich noch eine eigene Desktopumgebung mit Panel läuft und die Anzeige des Remote-Desktops in einem Fenster dargestellt wird, bietet es sich an, die Höhe des Panels auf dem Clientgerät zu berücksichtigen und eine kleinere Auflösung zu wählen.

Zu beachten ist hierbei, dass Nutzerspezifische Auflösungseinstellungen ignoriert werden, wenn in der globalen /etc/tigervnc/vncserver-config-mandatory-Datei eine Auflösung gesetzt wurde. Will man das nicht, dann muss man dort die $geometry = "XxY";-Option wieder entfernen oder auskommentieren.

Angabe eines Desktop Environments und die session-Variable

Für den Fall, dass man nach dem Login in einen Desktop ohne Panel endet, kann man mit der Option $session = in der obigen Konfigurationsdatei ~/.vnc/vnc.conf noch ein Desktop Environment bzw. ein Window Manager angeben, das dann alternativ gestartet werden soll. Die §session-Variable muss dazu noch auskommentiert werden, damit sie gesetzt wird, d.h. das führende #-Zeichen muss entfernt werden.

Zu beachten ist hierbei nämlich auch, dass die Anzeige der normalen Desktop-Oberfläche scheitern kann, wenn der Nutzer auf dem Serverrechner bereits lokal eingeloggt ist. Dies passiert bspw. auch, wenn dort das Einloggen automatisch erfolgt und keine Abfrage per Loginscreen erfolgt. Manche Desktop Environments, z.b. KDE plasma, haben damit nämlich Schwierigkeiten, wenn der gleiche Nutzer zweimal die grafische Oberfläche nutzen will.

Die Desktop Environments, die man zu Verfügung hat, kann man im Ordner /usr/share/xsessions nachschlagen.

ls /usr/share/xsessions/ 

Jede dort gelistete Datei steht für eine Auswahlmöglichkeit. Diese kann man ohne Angabe der Dateinamenserweiterung .desktop an die $session =-Variable übergeben.

Beispiel für LXDE:

$session = LXDE

Es ist ebenso möglich, weitere Desktop Environments und Windowsmanager nachzuinstallieren, so dass man auch andere zur Verfügung hat.

Es empfiehlt sich für VNC ein leichtgewichtiges Desktop Environment mit einem Theme ohne große Farbverläufe, also einfarbigen Flächen und Effekten oder einen einfachen Window Manager zu benutzen. Dies hält die Datenmenge, die übertragen werden muss, gering.

Hinweis:

Für die Versionen kleiner oder gleich 1.11.x von TigerVNC gibt es im Bezug auf Gnome und systemd noch einen Bug 🇬🇧 der dazu führt, dass ein Remoteverbindungsversuch mit Gnome als ausgewählter Remotedesktop zu einer fehlerhaften Gnomesession führt. Dieser Bug ist erst ab TigerVNC Version 1.12.x behoben. In Ubuntu 21.10 ist die verwendete TigerVNC-Version noch Version 1.11.x, weswegen es daher ratsam ist, für den Remotebenutzer vorübergehend eine andere Desktopumgebung für die Remoteverbindung auf dem Server zu nutzen. Auf dem Clientgerät ist es hingegen egal, welche Desktopumgebung der Nutzer verwendet.

Setzen des VNC Passworts

Anschließend legt man für den jeweiligen Benutzer, für den man eine VNC-Verbindung ermöglichen will, ein VNC-Passwort an. user ist hierbei durch den Benutzernamen des Benutzers zu ersetzen:

su - user -c tigervncpasswd 

Anschließend gibt man, nachdem man sich als Nutzer authentifiziert hat, ein selbstgewähltes Passwort ein und schließt die Konfiguration mit Enter ab. Bei der Frage:

Would you like to enter a view-only password (y/n)?

verneint man diese mit (n)ein. Wenn alles geklappt hat, sollte sich im Verzeichnis ~/.vnc/ eine Datei mit Namen passwd befinden.

Manuelles Starten und Beenden von TigerVNC auf dem Server

Um die Konfiguration überhaupt einmal testen zu können, gilt dieser Abschnitt für das manuelle Starten und Beenden von TigerVNC.

Der Abschnitt, wie man TigerVNC mithilfe von systemd startet und beendet, erfolgt weiter unten.

Manuelles Starten von TigerVNC auf dem Server

Um TigerVNC auf dem Server zu starten loggt man sich via ssh zuerst auf dem Server ein:

ssh user@hostname 

Anschließend startet man tigervncserver mit folgendem Befehl.

tigervncserver 

Wenn alles erfolgreich verlaufen ist, quittiert tigervncserver die Ausführung mit einer Konsolenmeldung, die folgendermaßen aussehen könnte:

New 'raspberrypi:1 (pi)' desktop at :1 on machine raspberrypi

Starting applications specified in /etc/X11/Xvnc-session
Log file is /home/pi/.vnc/raspberrypi:1.log

Use xtigervncviewer -SecurityTypes VncAuth -passwd /home/pi/.vnc/passwd :1 to connect to the VNC server.

Problembehebung

Falls das Starten nicht wie geplant verläuft, können die Log-Dateien sehr aufschlussreich sein: TigerVNC legt hierzu Logdateien im Homeverzeichnis des Benutzers unter ~/.vnc mit den Dateinamensschema HOSTNAME:DISPLAYNUMMER.log an.

Eine Liste kann man sich mit folgendem Befehl anzeigen lassen

ls ~/.vnc/*.log 

Den Inhalt der Log-Dateien kann man dann mit less anzeigen.

less HOSTNAME:DISPLAYNUMMER.LOG 

HOSTNAME und DISPLAYNUMMER sind dabei mit den entsprechenden Werten zu ersetzen.

Ebenso kann ein Blick in die /var/log/syslog Datei nicht schaden. Hierfür benötigt man root Rechte:

sudo less +G /var/log/syslog 

Anzeigen von laufenden TigerVNC-Sitzungen

Eine Liste laufender TigerVNC-Sitzungen kann man sich mit folgendem Befehl anzeigen lassen:

tigervncserver -list 

Beispielausgabe:

TigerVNC server sessions:

X DISPLAY #     RFB PORT #      PROCESS ID
:1              5901            4177

Im Beispiel sieht man, dass eine Instanz von TigerVNC auf dem X Display :1 mit der Process ID 4177 läuft und auf dem Netzwerkport 5901 auf eingehende Verbindungen von VNC Clients wartet.

Ebenso ist eine laufende Instanz auch daran zu erkennen, dass dafür eine entsprechende HOSTNAME:DISPLAYNUMMER.pid-Datei im Verzeichnis ~/.vnc/ des Benutzers existiert.

ls ~/vnc/*.pid 

Manuelles Beenden von TigerVNC auf dem Server

Um die Konfiguration überhaupt einmal testen zu können, gilt dieser Abschnitt für das manuelle Beenden von TigerVNC eines manuell gestarteten TigerVNC Prozesses. Der Abschnitt, wie man TigerVNC mithilfe von systemd beendet, erfolgt weiter unten.

Eine laufende Instanz kann man unter Angabe der entsprechenden DISPLAYNUMMER beenden:

tigervncserver -kill :DISPLAYNUMMER 

Beispielausgabe:

tigervncserver -kill :1
Killing Xtigervnc process ID 1225... success!

Will man zusätzlich auch die Logdatei im Verzeichnis des entsprechenden Benutzers löschen, kann man auch folgenden Befehl verwenden:

tigervncserver -clean -kill :DISPLAYNUMMER 

Ein Beenden aller Instanzen von TigerVNC geht mit einem * für die Displaynummer. Ein Löschen der Logdateien im Zusammenhang mit dem Parameter -clean funktioniert hier aber nicht:

tigervncserver -kill :* 

Starten und Beenden von TigerVNC auf dem Server mithilfe von systemd

Starten von TigerVNC mit systemd

Um TigerVNC dauerhaft via systemd starten zu lassen muss man folgende Konfiguration vornehmen:

Zuerst loggt man sich mit ssh auf dem Server ein:

ssh user@hostname 

Dann editiert man die Datei /etc/tigervnc/vncserver.users in einem Editor und fügt ihr diejenigen Nutzer hinzu, die sich mit TigerVNC verbinden können sollen.

In folgendem Beispiel wurde der Nutzer pi hinzugefügt, die :1 Nummer steht für den Displaynamen. Diese Zahl sollte mit der im Skript für den Client, das weiter unten erwähnt wird, übereinstimmen.

# TigerVNC User assignment
#
# This file assigns users to specific VNC display numbers.
# The syntax is <display>=<username>. E.g.:
#
# :2=andrew
# :3=lisa
:1=pi

Wenn das getan ist, muss man den tigervncserver unter Angabe der gleichen Displaynummer mit dem systemd Befehl systemctl nur noch starten. Dazu führt man folgende zwei Befehle aus und passt die 1 der entsprechenden Displaynummer an:

sudo systemctl enable tigervncserver@:1.service
sudo systemctl start tigervncserver@:1.service 

Will man für weitere Nutzer eine Verbindung via tigervncserver ermöglichen, so muss man diesen Schritt wiederholen und eine andere Displaynummer verwenden.

Damit ist die Konfiguration von TigerNVC für systemd fertig. Falls der Rechner neu gestartet wird, werden die entsprechenden tigervncserver von systemd automatisch gestartet.

Beenden von TigerVNC mit systemd

Um den TigerVNC-Dienst mithilfe von systemd für alle verwendeten Displaynummern zu beenden, muss man unter Angabe der entsprechenden Displaynummer folgende zwei Befehle eingeben:

sudo systemctl stop tigervncserver@:1.service
sudo systemctl disable tigervncserver@:1.service 

Installation auf dem Client Rechner des Nutzers

Auf dem Client Rechner wird das Paket tigervnc-viewer benötigt. Dies installiert man mit folgendem Befehl:

  • tigervnc-viewer

Befehl zum Installieren der Pakete:

sudo apt-get install tigervnc-viewer 

Oder mit apturl installieren, Link: apt://tigervnc-viewer

Verbindung vom Client mit dem VNC-Server mittels ssh

Da man tigervncserver auf dem Server aus Sicherheitsgründen so eingerichtet hat, dass nur Verbindungen von localhost des Servers möglich sind, muss man mittels ssh zuerst einen Tunnel aufbauen um dann sich dort mit der VNC-Sitzung zu verbinden.

Einmalige Vorbereitung

Bevor man dies aber tun kann, braucht man auf dem Client des Nutzer zuerst einmal die zu dem Nutzer zugehörige VNC-Passwortdatei auf dessen Nutzeraccount auf dem Servers.

Daher erstellt man auf dem Client zuerst ein Verzeichnis Namens ~/.vnc und wechseln in dieses.

mkdir ~/.vnc 

Anschließend loggt man sich mit sftp auf den Server ein und lädt die passwd-Datei runter:

sftp USER@HOSTNAME 

Wenn das sftp-Prompt erscheint:

sftp>

gibt man folgenden Befehl ein:

get .vnc/passwd .vnc/passwd

Dies kopiert die Datei passwd vom Nutzeraccount auf dem Server im Verzeichnis ~/.vnc/ in das Verzeichnis ~/.vnc/ auf dem Clientgerät. Anschließend beendet man die sftp-Sitzung mit der Eingabe von

exit

Experten-Info:

Wenn die passwd-Datei auf dem Client oder Server fehlt und der Befehl zum Aufbau der Verbindung mit dem -passwd- arameter, wie oben angegeben, verwendet wurde, dann bricht der Verbindungsaufbau zum VNC-Server mit der Meldung "Öffnen der Passwortdatei fehlgeschlagen." ab. Sie sollte also sowohl für den etwaigen Nutzer auf dem Server, als auch auf dem Client erhalten und das VNC-Passwort gesetzt sein.

Will man das nicht, dann muss der Verbindungsaufbau ohne den Parameter -passwd durchgeführt werden. In diesem Fall wird man dann beim Vebindungsaufbau nach dem VNC-Passwort gefragt und eine manuelle Eingabe des Passworts ist nötig.

Regulärer Befehl zum Verbinden

Nun verbindet man sich via ssh mit der laufenden VNC-Instanz auf dem Server. Diese sollte dafür schon laufen, siehe dazu oben der Abschnitt Starten von TigerVNC auf dem Server.

Die Verbindung erfolgt mit folgendem Befehl:

ssh -fL 6001:localhost:5901 USERSERVER@HOSTNAME sleep 10; xtigervncviewer -SecurityTypes VncAuth -passwd /home/USERCLIENT/.vnc/passwd localhost:6001 

USERSERVER ist hierbei mit dem Namen des Nutzeraccounts auf dem Server zu ersetzen, USERCLIENT mit dem Namen des Nutzeraccounts auf dem Client und HOSTNAME mit dem Hostname des Server.

Alternativ dazu kann man auch folgendes Skript verwenden, es als Datei speichern und diese mit chmod ausführbar machen:

1
2
3
4
5
6
7
8
#!/bin/sh
hostname=raspberrypi
username=pi
displayname=1

# Ab hier sind in der Regel keine Anpassungen mehr nötig:
echo "ssh -C -fL 6001:localhost:590$displayname "$username"@"$hostname" sleep 10; xtigervncviewer -SecurityTypes VncAuth -passwd ~/.vnc/passwd localhost:6001"
ssh -v -C -f -L 6001:localhost:590$displayname $username@$hostname sleep 10; xtigervncviewer -SecurityTypes VncAuth -passwd ~/.vnc/passwd localhost:6001

Die Variablen hostname, username und displayname sollten entsprechend mit der richtigen Initalisierung angepasst werden. Die Zahl in displayname sollte der entsprechen, die man für den entsprechenden Nutzer auf dem Server in der Datei /etc/tigervnc/vncserver.users eingestellt hat.

Anschließend wird man nach dem SSH-Passwort gefragt. Nach korrekter Eingabe sollte sich ein grafisches Fenster mit der VNC-Sitzung öffnen. Das Terminal mit der ssh-Verbindung sollte im Hintergrund offen gehalten werden.

Experten-Info:

Die Portnummer 5901 ist vom tigervncserver auf dem Server vorgegeben. Für weitere VNC Instanzen wird diese Portnummer einfach hochgezählt und ist daher anzupassen, wenn man mehrere Verbindungen zu verschiedenen VNC-Instanzen aufbauen möchte.

Da diese Portnummer wegen der obigen localhost-Einstellung nur vom Server aus erreichbar ist, muss man mittels SSH einen Tunnel aufbauen. Der Tunnel erfolgt über den Parameter -L gefolgt von 6001:localhost:5901 und bedeutet, dass auf dem Clientgerät ein Port 6001 für VNC-Clienten aufgebaut wird und diese dann durch die ssh-Verbindung nach 5901 auf dem Server umgeleitet wird. Der Parameter -f schickt ssh in den Hintergrund, die Verbindung bleibt solange erhalten, bis der xtigervncviewer geschlossen wird, dann wird die ssh Verbindung automatisch beendet. Die Option sleep 10 stellt die notwendige Wartezeit, bis xtigervncviewer bereit ist.

Intern

  • VNC - Grundartikel zu VNC des Wiki

Extern

Diese Revision wurde am 23. März 2022 15:40 von ubot erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Howto, Grafik, Netzwerk, Desktop, Server