Inhaltsverzeichnis

TeamViewer unter Linux

Wir setzen TeamViewer für Kunden-Fernwartungen und für Online-Meetings ein. Die Software ist eine der am besten Funktionierenden, die ich kenne. Um so erstaunlicher, wenn man sich mal das Konstrukt ansieht, wie TeamViewer unter Linux ausgeführt wird. Man schaue mal mit dem Kommando ps ax in die Prozessliste und siehe, welch gruselige Prozesse da ihr Unwesen treiben, wenn TeamViewer läuft:

  PID TTY      STAT   TIME COMMAND
 3693 ?        Sl     0:08 /opt/teamviewer/tv_bin/teamviewerd -d
14905 ?        Ss     0:00 /opt/teamviewer/tv_bin/wine/bin/wineserver
14920 ?        Ssl    0:00 C:\windows\system32\services.exe                                                                                    
14924 ?        Ssl    0:00 C:\windows\system32\explorer.exe /desktop                                                                                    
14928 ?        Sl     0:00 /opt/teamviewer/tv_bin/TVGuiSlave.64 13 1
14931 ?        Sl     0:00 /opt/teamviewer/tv_bin/TVGuiDelegate 13 1
14846 ?        Sl     0:01 c:\TeamViewer\TeamViewer.exe                                

TeamViewer läuft zur Hälfte als native Linux-, zur Hälfte als mit wine emulierte Windows-Anwendung.1) Echt „crazy shit“. Offenbar ist so langsam alles natives Linuxzeug, bis auf – ausgerechnet – die GUI. 8-O Ein hardcore Debian-User kann das nur verachten. Vor allem weil es dabei ja auch noch um properitäre Software geht. Aber ich bin Geschäftsmann, und TeamViewer läuft super. Außerdem stehen die Vermittlungsserver in Deutschland, daher muss man beim Thema Datenschutz den Kopf auch nicht ganz in den Sand stecken. TeamViewer läuft unter allen Betriebssystemen, und auch ein DAU2) schafft es noch, das Ding zu starten. Zumindest fast alle.

Installationsprobleme

Unter Debian lässt sich das 64-bit-Paket teamviewer_10.0.36281_amd64.deb per

# dpkg -i teamviewer_10.0.36281_amd64.deb

nicht immer gleich fehlerfrei installiern, weil die ia32libs nicht mehr verfügbar sind. Um das Problem zu umgehen zunächst

# dpkg --add-architecture i386
# apt-get update

ausführen und dann nochmal die fehlgeschlagene Installation anwerfen:

# apt-get -f install

Weitere Infos dazu unter: http://www.teamviewer.com/de/help/363-How-do-I-install-TeamViewer-on-my-Linux-distribution.aspx

Gut aber nicht perfekt

In TeamViewer 10.0.36281 wine-1.6 unter Debian 7 habe ich das Problem gehabt3), dass meine Webcam nicht lief. Im Einstellungsdialog von TeamViewer und in den Sitzungen blieb das Bild einfach weiß.

# lsusb
...
Bus 002 Device 002: ID 05a9:7670 OmniVision Technologies, Inc. OV7670 Webcam
...

Die TeamViewer GmbH teilte mir dazu mit, dass * Kameras nicht unterstützt werden. Ich finde es ja sowieso erstaunlich, dass man mit so einem Wine-Konstrukt überhaupt Ton+Bild hinkriegt. Aber ich dachte mir, wenn man irgendwelche Webcams unter Linux ansprechen kann, dann meine auch. Muss doch nur die Webcam in ein unterstütztes virtuelles Device umleiten. Und so experimentierte ich mit einigen Tools herum, unter anderem ucanvcam. Das Ende vom Lied war, dass ich folgenden ffmpeg-Befehl und das Kernelmodul v4l2loopback benutzt habe:

ffmpeg -f video4linux2 -i /dev/video0 -vcodec copy -f v4l2 /dev/video1 -vcodec copy -f v4l2 /dev/video2

Keine Ahnung, gab ne Fehlermeldung, weiß nicht warum. Aber nachdem dieser Befehl ausgeführt wurde, läuft (bis zum Neustart) die Webcam in TeamViewer! Habe TeamViewer auch mitgeteilt, dass sie (gegen Entgelt) von mir einen heißen Tipp dazu kriegen.

Ich habe entsprechend das TeamViewerD-Startskript angepasst, da ist der Befehl gut aufgehoben:

Mein gehacktes TVStart-Skript

Und siehe da: Wie erwartet wird nun bei jedem teamviewerd-Start, also z.B. beim Neustart des Rechners, dieser Befehl ausgeführt.

Hier das komplette Skript /etc/init.d/teamviewerd zum Austauschen, wenn benötigt (bzw. zum Einfügen ab Zeile 57). Man muss ggf. vorher noch sicherstellen, dass das Kernelmodul v4l2loopback ladbar/vorhanden ist.

teamviewerd
#!/bin/bash
#
# /etc/init.d/teamviewerd
#
# chkconfig: 2345 95 05
# description: daemon for TeamViewer
#
# processname: teamviewerd
# config: /etc/teamviewer/global.conf
# pidfile: /var/run/teamviewerd.pid
 
### BEGIN INIT INFO
# Provides:          teamviewerd
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Required-Start:    $all
# Required-Stop:     $local_fs $network $named
# Short-Description: TeamViewer remote control daemon
# Description:       TeamViewer remote control daemon
### END INIT INFO
 
RETVAL=0
prog="teamviewerd"
prog_dir="/opt/teamviewer/tv_bin"
prog_path="$prog_dir/$prog"
prog_args="-d"
pidfile="/var/run/teamviewerd.pid"
 
lockdir='/var/lock/subsys'
[ -d $lockdir ] || lockdir='/var/lock'
lockfile=$lockdir/$prog
 
function Main()
{
 
  case "$1" in
    start)	start	;;
    stop)	stop	;;
    restart)	restart	;;
    reload)	restart	;;
    status)	status	;;
    *)		helpmsg	;;
  esac
 
  exit $RETVAL
}
 
function start()
{
  echo -n $"Starting $prog..."
 
  [ -S /var/run/dbus/system_bus_socket ] && \
  [ -e /usr/share/dbus-1/system-services/org.freedesktop.ConsoleKit.service ] && \
     $prog_dir/script/wait-console-kit.sh
 
  $prog_path $prog_args
 
# Hack by rkCSD for WebCam usage with TeamViewer
echo -n $"rkCSD-AddOn: Hacking TeamViewer webcam support..."
modprobe v4l2loopback devices=2
ffmpeg -f video4linux2 -i /dev/video0 -vcodec copy -f v4l2 /dev/video1 -vcodec copy -f v4l2 /dev/video2
 
  RETVAL=$?
  [ "$RETVAL" = 0 ] && touch $lockfile
  echo
}
 
function stop()
{
  echo -n $"Stopping $prog... "
 
  killDaemon
  RETVAL=$?
  [ "$RETVAL" = 0 ] && rm -f $lockfile
  echo
}
 
function restart()
{
  stop
  [ "$RETVAL" = 0 ] || return
  start
}
 
function status()
{
  RETVAL=0
 
  isRunning && echo "$prog start/running" && return
 
  echo "$prog stop/waiting"
}
 
function helpmsg()
{
  echo $"Usage: $0 {start|stop|restart|status}"
  RETVAL=1
}
 
function isRunning()
{
  local pid=$(getPID)
  [ -n "$pid" ] || return
 
  readlink /proc/$pid/exe | grep -q $prog
}
 
function getPID()
{
  cat $pidfile 2> /dev/null
}
 
function killDaemon()
{
  cmdExists killproc && killproc $prog_path && return
 
  isRunning || echo not running
  isRunning || return 0
 
  local repeat=30
  local pid=$(getPID)
  [ -n "$pid" ] || return
 
  kill -TERM $pid 2> /dev/null
 
  until [ $repeat = 0 ]; do
    isRunning || break
    echo -n '. '
    sleep 0.33
    let repeat-=1
  done
 
  isRunning || return 0
  kill -KILL $pid 2> /dev/null
}
 
function cmdExists()
{
  command -v "$1" >/dev/null 2>&1
}
 
Main "$@"

Falls Sie ein System mit systemd statt initd verwenden (z.B. Debian 8 „jessie“), kopieren Sie folgendes Skript in die Datei /opt/teamviewer/tv_bin/rkCSD-TeamViewerD_Start.sh:

rkCSD-TeamViewerD_Start.sh
#!/bin/sh
# Hack by rkCSD for WebCam usage with TeamViewer
echo -n $"rkCSD-AddOn: Hacking TeamViewer webcam support..."
modprobe v4l2loopback devices=2
timeout 1 ffmpeg -f video4linux2 -i /dev/video0 -vcodec copy -f v4l2 /dev/video1 -vcodec copy -f v4l2 /dev/video2
 
/opt/teamviewer/tv_bin/teamviewerd -d

Editieren Sie die Datei /etc/systemd/system/teamviewerd.service und tauschen Sie den Inhalt des Parameters ExecStart durch den Pfad der obigen Datei.

Bei allen in diesem Artikel beschriebenen Änderungen wird TeamViewer nicht manipuliert oder verändert, sondern die Rahmenbedingungen des Systems so umkonfiguriert, dass die Wine-Umgebung von TeamViewer damit zurechtkommt!

So ist das Webcambild nun nicht mehr weiß, sondern es funktioniert:

Es funktioniert! Hallo!

Teamviewerd abschalten

Der Sinn und Zweck des teamviewerd, also des Systemdienstes von TeamViewer, erschließt sich mir nicht in Gänze. TeamViewer, oder ein Teil davon, läuft somit, mit Rootrechten!, die ganze Zeit im Hintergrund. Die Wine-Gui wird somit „ermächtigt“, was teilweise sicher gut und sinnvoll ist. Aber wer weiß, was damit alles für ein Unfug auf dem System gemacht werden kann, wenn das andauernd läuft. Auf normalen Desktop-Systemen empfehle ich daher, den Dienst abzuschalten.

# update-rc.d teamviewerd remove

Im Falle von systemd (z.B. Debian 8 „jessie“) lautet der Befehl

# systemctl disable teamviewerd

Bevor man TeamViewer verwenden will, muss man dann halt per

# service teamviewerd start

den Dienst starten, denn sonst läuft TeamViewer unter Linux nicht.

Teamviewerd läuft nicht

Diesen Schritt (Deaktivierung des Dienstes) muss man allerdings nach jedem Update neu vornehmen! Das entsprechende Installationsskript aktiviert ja logischerweise den Dienst.

2) „Dümmster anzunehmender User“
3) In der darauf folgend installierten Version, dem Update zu Version 10.0.37742 wine-1.6, schien das Problem zunächst behoben worden zu sein, später tauchte es aber wieder auf.