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. 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.
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
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:
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.
#!/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
:
#!/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:
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.
Diesen Schritt (Deaktivierung des Dienstes) muss man allerdings nach jedem Update neu vornehmen! Das entsprechende Installationsskript aktiviert ja logischerweise den Dienst.