VNC-Server für den Raspberry Pi einrichten

Erfahrene Linux-Anwender arbeiten viel und oft sogar gerne in Terminalfenstern, sei es direkt auf dem betroffenen Rechner oder via SSH. Wenn Sie aber den Komfort und das optische Feedback einer grafischen Benutzeroberfläche vorziehen und über eine Netzwerkverbindung arbeiten möchten, dann ist VNC die richtige Lösung.

Virtual Network Computing (VNC) ist eine Software, um den gesamten Bildschirminhalt über ein lokales Netzwerk zu übertragen und von einem anderen Rechner aus zu steuern. VNC wird von Linux und OS X standardmäßig unterstützt. Für Windows gibt es kostenlose VNC-Clients. Also geht es nur noch darum, den Raspberry Pi als VNC-Server zu konfigurieren.

VNC-Server manuell starten

Um das Konzept eines VNC-Servers rasch und unkompliziert auszuprobieren, installieren Sie das Paket tightvncserver und starten das Programm auf dem Raspberry Pi in einem Terminalfenster. Dabei müssen Sie zuerst zweimal ein Passwort angeben, das später auch beim Verbindungsaufbau anzugeben ist.

sudo apt-get install tightvncserver
vncserver
  Password: ******
  Verify:   ******
  Would you like to enter a view-only password? n
  New 'X' desktop is raspberrypi:1

Wichtig ist hier die letzte Zeile: Der VNC-Server stellt seine Dienste am Display :1 zur Verfügung. Da für VNC Portnummern ab 5900 vorgesehen sind, entspricht :1 der Portnummer 5901. Ports sind, vereinfacht ausgedrückt, Kennzahlen, die Netzwerkpakete bestimmten Diensten zuordnen.

Der VNC-Server läuft nun als Hintergrundprozess, bis dieser explizit beendet wird. Dazu führen Sie vncserver -kill aus und geben mit :n die Display-Nummer an:

vncserver -kill :1

Das beim ersten Start angegebene VNC-Passwort wird in der Datei .vnc/passwd in verschlüsselter Form gespeichert. Bei weiteren Starts ist deswegen keine neuerliche Passwortangabe erforderlich. Um das Passwort später zu ändern, führen Sie vncpasswd aus.

VNC-Viewer für Windows, Linux oder OS X

Jetzt versuchen Sie von Ihrem Arbeitsrechner aus, die Verbindung zum VNC-Server herzustellen. Unter Windows installieren Sie zuerst das Programm TightVNC, das Sie hier kostenlos herunterladen können:

http://www.tightvnc.com/download.php

Unter Linux ist in der Regel bereits ein VNC-Viewer installiert — allerdings hängt es von der Distribution ab, welcher. Mögliche Programmnamen sind unter anderem vinagre, vncviewer, krdc oder remmina. Unter Ubuntu steht standardmäßig remmina zur Verfügung. Verbindung/Neu führt in einen sehr komplexen Einstellungsdialog. Am besten ist es, dem Verbindungsprofil
einen Namen zu geben und es anschließend zu speichern. Damit ersparen Sie sich die Neueingabe der Parameter bei jeder Verbindung.

Unter OS X ist zwar standardmäßig ein VNC-Client installiert, dieser funktioniert aber mehr schlecht als recht. Deswegen ist es zweckmäßig, kostenlose Programm Chicken herunterzuladen und zu installieren:

http://sourceforge.net/projects/chicken

Verbindungsaufbau

Im Dialog zum Verbindungsaufbau müssen Sie den Hostnamen und die Portnummer angeben. In unserem Beispiel wäre das raspberrypi:5901. Falls auf Ihrem Arbeits-PC der Hostname des Raspberry Pi unbekannt ist, müssen Sie stattdessen die IP-Nummer angeben, also z.B. 10.0.0.8:5901. Die IP-Nummer können Sie auf dem Raspberry Pi mit dem Kommando ip addr | grep inet ermitteln. Schließlich müssen Sie noch das Passwort angeben, das Sie beim Start von vncserver auf dem Raspberry Pi verwendet haben. Nun erscheint das VNC-Viewer-Fenster mit dem Raspberry-Pi-Desktop.

Das VNC-Programm Chicken läuft unter OS X und zeigt den Desktop des Raspberry Pi an
Das VNC-Programm Chicken läuft unter OS X und zeigt den Desktop des Raspberry Pi an

Recht unübersichtlich ist der Verbindungsdialog, wenn Sie mit Remmina (Ubuntu) arbeiten. Entscheidend sind aber auch hier nur drei Einstellungen: Sie geben als Protokoll VNC –
Virtual Network Computing
, als Server hostname:portnr sowie das erforderliche Passwort an. Für eine optimale Darstellungsqualität stellen Sie außerdem Farbtiefe = Echtfarben und Qualität = Beste ein.

VNC-Verbindungsdialog unter Ubuntu (Programm Remmina)
VNC-Verbindungsdialog unter Ubuntu (Programm Remmina)

VNC nutzen

Der VNC-Server hat seinen eigenen Desktop! Möglicherweise irritiert es Sie, dass der Bildschirminhalt im VNC-Fenster nicht mit dem Monitorbild des Raspberry Pi übereinstimmt. Das liegt daran, dass für den VNC-Server ein eigener Desktop gestartet wird, der vom echten Desktop des Raspberry Pi unabhängig ist! Der VNC-Server agiert also nicht wie eine Fernwartungs-Software, die den vorhandenen Bildschirminhalt dupliziert.

Update 22.2.2015: Wenn Sie aus einer VNC-Sitzung heraus Programme mit grafischer Benutzeroberfläche mit root-Rechten starten möchten (also sudo programm), tritt der Fehler cannot open display auf. Im folgenden Beispiel gehe ich davon aus, dass Sie VNC nutzen und die Kommandos in einem Terminal ausführen:

sudo idle
  Client is not authorized to connect to ServerTraceback (...)
  ...
  _tkinter.TclError: couldn't connect to display ":1.0"
sudo lxterminal
  Client is not authorized to connect to Server
  (lxterminal:nnn): Gtk-Warnung **: cannot open display: :1.0

Der Grund für die Fehlermeldungen besteht darin, dass X aus Sicherheitsgründen verbietet, dass fremde Benutzer Programme starten können. Abhilfe: Führen Sie vorher im Terminal xhost +localhost aus, um diese Sicherheitsregel zu deaktivieren:

xhost +localhost
  localhost being added to access control list
sudo idle
sudo lxterminal

Start des VNC-Servers automatisieren

Hinweis: Dieser Abschnitt gilt für das alte Raspbian Wheezy. Für die neue Raspbian-Version »Jessie« gehen Sie besser nach der folgenden Anleitung vor.

Nachdem Sie sich davon überzeugt haben, dass VNC prinzipiell funktioniert, geht es nun darum, einen automatischen Start des VNC-Servers sicherzustellen. Alle weiteren Konfigurationsarbeiten sind also wieder auf dem Raspberry Pi durchzuführen.

Der erste Schritt besteht darin, das folgende Listing in der Datei /etc/init.d/vncserver zu speichern. Dazu müssen Sie einen Editor mit root-Rechten ausführen, also z.B. sudo leafpad. Im folgenden Script passen Sie die gewünschte Auflösung des VNC-Desktops in der Variablen GEOMETRY an. Da das Script den vncserver im Account pi startet (USER-Variable), gilt das VNC-Passwort in /home/pi/.vnc/passwd. Dieses Passwort können Sie gegebenenfalls mit vncpasswd ändern.

#!/bin/sh -e
# Datei /etc/init.d/vncserver
### BEGIN INIT INFO
# Provides:          vncserver
# Required-Start:    networking
# Required-Stop:    
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

# der Benutzer, für den der VNC-Server gestartet wird
export USER="pi"
export HOME="/home/pi"
# die Display-Nummer
DISPLAY="1"
# die Farbtiefe (8, 16 oder 24) und die Auflösung
DEPTH="16"
GEOMETRY="1300x800"
# der Name des VNC-Desktops
NAME="pi-VNC"
OPTIONS="-name ${NAME} -depth ${DEPTH} 
         -geometry ${GEOMETRY} :${DISPLAY}"

case "$1" in
start)
  su ${USER} -c "/usr/bin/vncserver ${OPTIONS}"
  ;;
stop)
  su ${USER} -c "/usr/bin/vncserver -kill :${DISPLAY}"
  ;;
restart)
  $0 stop
  $0 start
  ;;
esac
exit 0

Update 3.3.2015: Das Script wurde aktualisiert. Zum einen wurde die Zeile export HOME="/home/pi" hinzufügt (erforderlich, damit sich Scratch starten lässt), zum anderen wurden die Zeilen . /lib/lsb/init-functions (einmal) sowie log_action ... (zweimal) entfernt.

Damit dieses Script ausgeführt werden kann, müssen Sie mit chmod a+x die execute-Bits setzen:

sudo chmod a+x /etc/init.d/vncserver

Mit den folgenden Kommandos können Sie den VNC-Server nur manuell starten und stoppen:

sudo service vncserver start
sudo service vncserver stop

Der eigentliche Sinn dieses Scripts besteht aber darin, dass der VNC-Server in Zukunft bei jedem Bootprozess automatisch gestartet werden soll. Diesen Auto-Start aktivieren Sie wie folgt (er gilt ab dem nächsten Neustart):

sudo insserv vncserver

Falls Sie zu einem späteren Zeitpunkt bemerken, dass Sie den VNC-Server nicht mehr oder nur ganz selten benötigen, sollten Sie den Auto-Start wieder deaktivieren. Der Betrieb eines Parallel-Desktops für den VNC-Server erfordert nämlich erheblichen Speicherplatz und verlängert den Bootprozess spürbar.

sudo insserv -r vncserver