Kategorie:Raspbian VDR Streaming Client mittels Streamdev und rpihddevice

Aus VDR Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Einleitung

Diese Step-by-Step-Anleitung beschreibt die Installation und Konfiguration eines VDR Streaming Client Systems mittels Streamdev Plugin und einem Raspberry Pi. Es wird davon ausgegangen, dass es bereits einen VDR mit lauffähigem Streamdev-Server Plugin gibt. Für die Bildausgabe auf den TV kommt das rpihddevice Plugin zum Einsatz.

Modifikationen / Veränderungen

Bitte in folgende Liste Änderunge/Verbesserungen der Installation aufführen, so daß es einfach ist existierende Installationen zu verbessern mit den Deltas.

Dez 2014 - Jan 2015

reufer:

te36:

  • Sektion zum SD Management angefügt: Kopieren, Clonen, Lebensdauer verbessern.
  • Erklärungen verbessert (svdrpdevice, remote.conf für Keyboard, Umschalten von virtuellen Terminals, logging dateien, MPEG2 lizenzen)
  • Turbo mode am RPI aktivieren
  • Sektion für Regionalprogramme == "filters" auf streamdev um NDR etc. korrekt zu empfangen (und damit VDR nicht bei Widergabe "stottert", inklusive neuem patch für streamdev-client module
  • remotetimers menu Installation verbessert: Patches erklärt um den RPI als client zu betreiben, empfohlene Konfiguration
  • suspendoutput module eingebaut

sewn4:

  • Neuen Raspberry aufgebaut und Wiki dabei aktualisiert

fauthd:

  • Sysvinit (optional)
  • "Wake on LAN" zum Wecken des Servers (optional)
  • Vdr unter separatem Nutzer vdr (optional)
  • Editor nano statt vi (optional)
  • Verschiedene Kleinigkeiten

Voraussetzungen

  • Ein vorhandenes VDR System mit lauffähigem Streamdev-Server Plugin (Beispiel VDR System)
  • Einen Raspberry Pi der als Streaming Client fungiert.
    • Die Installationsanleitung bezieht sich auf Modell B/B+ die beide eingebautes Ethernet und 512 MByte RAM haben.
    • Der B+ hat zwei USB Ports mehr als der B und eine bessere Stromversorgung. Evtl. funktioniert bei ihm auch das Overclocking (Turbo-Mode) besser.
    • Achtung: Gehäuse für B und B+ sind verschieden!
    • Achtung: Bei der Stromversorgung für den RPI darauf achten, daß das Netzteil mindestens 1.2 A liefert und das das USB Kabel gute Qualität hat. Lange USB Kabel (3 meter oder länger) haben häufig sehr dünne Stromleitungen und dann läuft der RPI instabil).
  • Einen Receiver/Fernseher mit HDMI Eingang. Der RPI hat auch einen Analog-Videoausgang, es ist aber nicht bekannt ob damit schon jemand die VDR Installation getestet hat (bitte hier eintragen wenn ja!).

SD Karten

Der Raspberry benötigt eine, oder für Backup besser 2 SD Karten mit >= 8 GByte. Bei Installation von vielen Plugins und deren Abhängigkeiten oder Entwicklungsumgebungstools können leicht mehr als 60% einer 8GByte SD Karte gebraucht werden. Es empfiehlt sich auf jeden Fall Micro-SD zu kaufen mit SD Adapter. Der RPI B hat einen SD Karten Slot, der B+ einen Micro-SD Karten Slot.

Um SD Backup direkt am RPI zu machen braucht man noch einen SD/USB reader. Am besten noch ein USB Verlängerungskabel oder einen kleinen Micro-USB-Reader damit keiner der anderen USB Ports am RPI geblockt wird, wenn man da z.b. IR-Empfänger oder WLAN verwenden will.

Optional: MPEG-2 und VC-1 Lizenzen

Die Lizenzen sind nötig damit der Raspberry Pi die MPEG-2 sowie VC-1 Datenstreams per Hardware decodieren kann. Die Lizenzen können im offiziellen Raspberry Pi Onlineshop erworben werden. Die MPEG-2 Lizenz braucht man um die meisten deutschen nicht-HD Sender die von Astra kommen zu dekodieren, da diese mit MPEG-2 übertragen werden. Alle HD-Sender sind H264, dafür ist keine Lizenz notwendig.

  • MPEG-2 sowie VC-1 Lizenzen für den Raspberry Pi.

Die Lizenzen werden per Email bis zu 48 Stunden nach Kauf verschickt, also rechtzeitig bestellen, wenn man MPEG-2/SD anschauen will.

Welche Hardware wird benötigt?

Hardwarebeispiel

Hier die Übersicht über meine Hardware:

VDR System

VDR System

Raspberry Pi

Raspberry Pi:      Raspberry Pi Model B+ original "UK" mit Samsung Speicher 512MB
Gehäuse:           Raspberry Pi B+ Gehäuse - belüftet, Farbe schwarz durchsichtiges Plexiglas
Netzteil:          Steckernetzteil Micro-USB 5V 2000mA für Raspberry Pi
SD-Karte:          SanDisk Class 10 Ultra Micro SDHC 32GB
Kupfer Kühlkörper: Cooltek BGA VGA-RAM Cooler - Maße (LxBxH): ca. 21x16x6.5 mm

Stromverbrauch

  • Muss noch ergänzt werden *

Wie schnell startet das System?

Vom einschalten bis zum TV Bild vergehen 25 Sekunden.

Welche Softwareversionen werden eingesetzt?

Betriebssystem

  • Raspbian Wheezy vom 24.12.2014 (Kernel 3.12.35+ armv6l)

Video Disc Recorder

  • VDR 2.1.6

Video Disk Recorder Plugins

  • rpihddevice Plugin (aus dem GIT vom 30.12.2014) / 0.0.10
  • Streamdev Plugin (aus dem GIT vom 23.12.2014) / 0.6.1-git
  • svdrpservice Plugin 1.0.0
  • epgsync Plugin 1.0.1
  • remotetimers Plugin 1.0.1
  • suspendoutput Plugin 2.0.0

Installation und Konfiguration Raspberry Pi Betriebssystem

Einleitung

Um den Raspberry Pi nutzen zu können ist es nötig ein Betriebssystem (OS) zu installieren. Als Betriebssystem verwende ich Raspbian Wheezy und dieses kann hier kostenfrei heruntergeladen werden. Nach dem herunterladen muss die Datei auf der Festplatte entpackt werden. Die darin enthaltene *.img Datei wird später benötigt. Für die Vorbereitungen verwende ich einen Windows Client. Es können aber auch Mac OS X oder Linux verwendet werden siehe hier.

Betriebssystem vorbereiten

SD-Karte für den Raspberry Pi formatieren

Hinweis: Dieser Schritt ist unnötig da wir ein Image auf die SD-Karte kopieren.

Um das Betriebssystem auf der SD-Karte zu installieren muss diese zuerst formatiert und vorbereitet werden.

  1. SD-Karte in den Computer einlegen
  2. Herunterladen eines Formatierungs-Tools (ich empfehle den SD Formatter)
  3. SD Formatter installieren und starten
  4. Optionen für die Formatierung auswählen
    Format Type -> QUICK
    Format Size Adjustment -> ON
  5. Volume Label überprüfen
    Hier muss sichergestellt sein das die SD-Karte ausgewählt ist. In meinem Beispiel Laufwerk E:
  6. Mit der Schaltfläche "Format" die Formatierung starten
    Achtung! Alle Daten auf dem Laufwerk werden gelöscht.


Nach erfolgreicher Formatierung kann der SD Formatter geschlossen werden.

Betriebssystem auf die SD-Karte übertragen

Das Raspbian Betriebssystem muss auf die SD-Karte übertragen werden.

Windows

  1. SD-Karte in den Computer einlegen
  2. Herunterladen eines Diskimage-Tools (ich empfehle Win32 Disk Imager)
  3. Win32DiskImager installieren und starten
    Betriebssystem Image und passendes Laufwerk (SD-Karte) auswählen und starten:
    Image File: D:/2014-12-24-wheezy-raspbian.img
    Device: E:
    Write
    Nach erfolgreicher Übertragung kann der Win32 Disk Imager geschlossen werden.
  4. SD-Karte in den Raspberry Pi einlegen und starten

Linux (Ubuntu 14.04)

Mit Linux gibt es mehrere Möglichkeiten.

  • dd
  • ddrescue
  • gnome-disks (palimset)

ddrescue:

sudo apt-get install gddrescue
sudo ddrescue image.img /dev/sdX --force

gnome-disks:

Das Plattenverwaltungsprogram von Gnome kann auch Images lesen und schreiben. Dies geht per GUI. Man findet diese Funktion hinter dem Zahnrad.

Konfiguration Raspberry Pi

Nach dem ersten Start des Raspberry Pi wird automatisch das Raspbian Betriebssystem gestartet und das Konfigurationstool raspi-config wird angezeigt. Folgende Konfigurationen habe ich der Reihe nach durchgeführt:

Update Raspberry Configuration Tool

8 Advanced Options -> Select -> A9 Update -> Select

Expand Filesystem

1 Expand Filesystem -> Select -> Ok

Change User Password

2 Change User Password -> Select -> Ok

Enter new Unix password: Euer Passwort

-> Ok

Enable Boot to Desktop/Scratch

3 Enable Boot to Desktop/Scratch -> Select -> Console Text console, requiring login (default) -> Ok

Internationalisation Options

Change Timezone

4 Internationalisation Options -> Select -> I2 Change Timezone -> Return -> Europe -> Return -> Berlin -> Return

Change Keyboard Layout

4 Internationalisation Options -> Select -> I3 Change Keyboard Layout -> Select -> Generic 105-key (Intl) PC -> Select -> Other -> Ok ->
German -> Ok -> German -> Ok -> The default for the keyboard layout -> Ok -> No compose key -> Ok -> No

Change Locale

4 Internationalisation Options -> Select -> I1 Change Locale -> Select ->
Locales to be generated:

Uncheck: en_GB.UTF-8 UTF-8
Check:   de_DE.UTF-8 UTF-8
 
-> OK

Default locale for the system environment:
de_DE.UTF-8

-> OK

Advanced Options

8 Advanced Options -> Select -> A2 Hostname -> Select -> Ok -> pi01 -> Ok
8 Advanced Options -> Select -> A3 Memory Split -> Select-> 128 -> Ok
8 Advanced Options -> Select -> A4 SSH -> Select -> Enable -> Ok

Optional: Overscan deaktivieren

Unter Umständen kann es vorkommen das später das TV Bild oder OSD vom VDR nicht komplett bzw. zu groß angezeigt wird. Dann kann es nötig sein den Overscan zu deaktivieren.

sudo raspi-config

8 Advanced Options -> Select -> A1 Overscan -> Disable -> Ok

Optional: Turbo mode aktivieren

Da im folgenden einiges an Software compiliert wird, bietet es sich an, auf dem RPI den Turbo Mode zu aktivieren, mit dem der RPI ca. 50% schneller wird.

http://www.raspberrypi.org/introducing-turbo-mode-up-to-50-more-performance-for-free/

sudo raspi-config
7 Overclock -> Select -> Turbo 1000Mhz -> Ok

Wenn das nicht stabil läuft, rückgängig machen. Wenn im schlimmsten Fall der RPI nicht stabil bootet, so daß man raspi-config nicht mehr starten kann, dann einfach die (micro-)SD Karte des RPI auf einem anderen Rechner mounten und die Turbo Parameter in config.txt auskommentieren. Das config.txt liegt auf einem FAT16 filesystem, das läßt sich also auf jedem Rechner (Windows/iOS/Android/Linux/..) mounten:

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=1000
#core_freq=500
#sdram_freq=600
#over_voltage=6

Abschließen der Konfiguration

Finish -> Would you like to reboot now? -> Yes

Editor nano einrichten (optional)

Nicht jeder möchte vi als Editor einsetzen. So geht es:

sudo apt-get install nano
sudo ln -s /usr/bin/nano /usr/local/bin/vi

Damit kann man immer noch alle Kommandozeilen dieser Anleitung per cut/paste verwenden, aber nano wird als Editor benutzt.

Netzwerkkonfiguration

Um zukünftig euren Raspbery Pi mit einer feste IP Adresse ansprechen zu können muss diese konfiguriert werden. Die IP Adressdaten müssen an euer Netzwerk angepasst werden.

Logindaten für die Konsole

Benutzername: pi
Passwort:     <euer Passwort>

Feste IP Adresse einrichten (optional)

Der VDR braucht keine feste IP-Adresse, DHCP funktioniert sehr gut. Falls man doch eine feste Adresse will, so geht es:

sudo cp /etc/network/interfaces /etc/network/interfaces_orig
sudo vi /etc/network/interfaces

Ändern von:

iface eth0 inet dhcp

Ändern nach:

iface eth0 inet static
address 192.168.0.11
netmask 255.255.255.0
gateway 192.168.0.254
network 192.168.0.0
broadcast 192.168.0.255

DNS Server einrichten

sudo cp /etc/resolv.conf /etc/resolv.conf_orig
sudo vi /etc/resolv.conf
nameserver 192.168.0.254

Raspberry Pi neustarten

sudo init 6

Remotezugriff per SSH auf die Linux Konsole

Als Remoteclient kommt Putty zum Einsatz. Putty ist Freeware und kann kostenfrei auf der Webseite http://www.putty.org/ heruntergeladen werden. Nach dem starten von Putty kann auf die Linux Konsole zugegriffen werden:

Host name:    192.168.0.11
Benutzername: pi
Passwort:     <euer Passwort>

Optional: MPEG-2 und VC-1 Lizenzen

Die Lizenzen sind nötig damit der Raspberry Pi die MPEG-2 sowie VC-1 Datenstreams per Hardware decodieren kann.

Seriennummer vom Raspberry Pi anzeigen

cat /proc/cpuinfo

Lizenzen einspielen

Eure Lizenzen müssen in der Datei config.txt eintragen werden:

sudo cp /boot/config.txt /boot/config.txt_orig
sudo vi /boot/config.txt
# MPEG-2 and VC-1 license keys
decode_MPG2=<euer Lizenzkey>
decode_WVC1=<euer Lizenzkey>

Das folgende Beispiel zeigt, wie man die Lizenzen für mehrere RPIs eintragen kann, so daß man seine SD-Karte einfach für mehrere RPIs kopieren kann:

# MPEG-2 and VC-1 license keys
decode_MPG2=0x86123436,0xc56789da
decode_WVC1=0x12c1234e,0x15678f09

Raspberry Pi neustarten

sudo init 6

Prüfen der eingespielten Lizenzen

vcgencmd codec_enabled MPG2
MPG2=enabled
vcgencmd codec_enabled WVC1
WVC1=enabled

Firmware auf dem Raspberry Pi aktualisieren

Prüfen der vorhandenen Versionen

uname -a

Linux pi01 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l GNU/Linux
/opt/vc/bin/vcgencmd version

Dec 19 2014 18:44:06
Copyright (c) 2012 Broadcom
version 5abd572e2ed1811283443387af09377b95501c50 (clean) (release)

Firmware Update starten

sudo apt-get install rpi-update
sudo rpi-update
sudo init 6

Prüfen der aktualisierten Versionen

uname -a

Linux pi01 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l GNU/Linux
/opt/vc/bin/vcgencmd version

Dec 29 2014 14:28:52
Copyright (c) 2012 Broadcom
version d3c15a3b57203798ff811c40ea65174834267d48 (clean) (release)

Nicht benötigte Systempakete deinstallieren

sudo apt-get remove wolfram-engine

Raspbian Softwarepakete auf den aktuellen Stand bringen

sudo apt-get update
sudo apt-get upgrade
sudo init 6

Für VDR benötigte Systempakete installieren

Raspbian benötigte Pakete:
sudo apt-get install vim git
VDR benötigte Pakete:
sudo apt-get install gettext g++ libfreetype6-dev libfontconfig1-dev libcap-dev libjpeg-dev libncurses5-dev libncursesw5-dev
Raspberry Pi HD Device Plugin benötigte Pakete:
sudo apt-get install libavcodec-dev libavformat-dev libavutil-dev libavresample-dev libavresample1
Lirc benötigte Pakete:
sudo apt-get install lirc

Datenverzeichnis vorbereiten

In diesem Verzeichnis werden später die Installationspakete etc. abgelegt.

sudo mkdir /data
sudo chown -R pi.pi /data

Bildschirmschoner sowie Standby deaktivieren

sudo cp /etc/kbd/config /etc/kbd/config_orig
sudo vi /etc/kbd/config
# screen blanking timeout.  monitor remains on, but the screen is cleared to
# range: 0-60 min (0==never)  kernels I've looked at default to 10 minutes.
# (see linux/drivers/char/console.c)
#BLANK_TIME=30
BLANK_TIME=0
 
# Powerdown time.  The console will go to DPMS Off mode POWERDOWN_TIME
# minutes _after_ blanking.  (POWERDOWN_TIME + BLANK_TIME after the last input)
#POWERDOWN_TIME=30
POWERDOWN_TIME=0

Optional: Konsoleausgaben umlenken

Bei Linux werden Fehlermeldungen von Systemaktivitaeten und die Logausgaben vom Bootstrap auf /dev/console ausgegeben. Standardmässig ist /dev/console auf dem ersten virtuellen Terminal, was auf dem RPI /dev/tty1 ist. Da es auf den meisten Linux Installationen möglich ist im Betrieb zwischen den virtuellen Terminals umzuschalten, und dann auch das erste virtuelle Terminal im Textmodus zu verwenden (z.b. bei der Fehlerdiagnose), wird häufig empfohlen, /dev/console auf ein anderes virtuelles Terminal umzulenken, so dass die logausgaben dort separat einsehbar sind.

Bei VDR Installation für den RPI ist es andererseits auch sinnvoll, diese Veränderung nicht zu machen: Ohne die folgende Veränderung sieht man beim booten alle Logausgaben: Erst Linux Kernel, dann die Bootscripten - und danach startet der VDR. Mit der Veränderung sieht man die Ausgaben der Bootscripten direkt beim booten nicht mehr weil die schon auf /dev/tty10 gehen, während noch /dev/tty1 angezeigt wird, solange der VDR nicht gestartet wurde.

Die Funktionsweise des VDR selbst ist von dieser Veränderung nicht betroffen: seine Ein/Ausgaben werden durch die Konfiguration von runvdr auf das virtuelle Terminal 9 (/dev/tty9) gelenkt - und im Betrieb angezeit. Es ist also irrelevant, ob die Konsolausgaben auf /dev/tty1 oder /dev/tty10 erfolgen.

sudo cp /boot/cmdline.txt /boot/cmdline.txt_orig
sudo vi /boot/cmdline.txt

Ändern von:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Abändern in:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty10 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Umschalten zwischen den virtuellen Terminals:

Um später die Logausgaben auf der tty10 Konsole sehen zu können kann auf diese mit folgender Tastenkombination gewechselt werden:
STRG + ALT + F10

zur Standardkonsole tty1 kommt Ihr wieder zurück:

STRG + ALT + F1

Leider funktioniert dies wenn der VDR läuft mit rpihddevice (Stand: Version 0.0.10) nicht korrekt: Wenn man mit obigen Tastenkombinationen vom virtuellen Terminal 9 wegschaltet (auf dem der VDR läuft), dann sollte eigentlich das Videobild des VDR abgeschaltet werden. Dies ist anscheinend nicht unterstützt. Es wird also weiterhin das Videobild des VDR angezeigt, obwohl das virtuelle Terminal umgeschaltet wird. Man kann dann also nur "blind" auf einem anderen virtuellen Terminal arbeiten.

Installation VDR

Downloadverzeichnis vorbereiten

mkdir -p /data/installfiles/vdr

Installationsmedien herunterladen

cd /data/installfiles/vdr
wget ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.6.tar.bz2

pi Benutzer in die Gruppe video und audio aufnehmen

sudo adduser pi video
sudo adduser pi audio

VDR entpacken, vorbereiten und installieren

cd /usr/local/src
sudo tar -xjf /data/installfiles/vdr/vdr-2.1.6.tar.bz2 
sudo ln -s vdr-2.1.6/ vdr

Shutdownskript erstellen und ablegen

sudo vi /usr/local/bin/vdrpoweroff.sh
#!/bin/bash
sudo /sbin/poweroff

und anschließend das Skript ausführbar machen:

sudo chmod +x /usr/local/bin/vdrpoweroff.sh

Skripte/Module mit Root-Rechten und ohne Passwortaufforderung ausführen

Damit der Benutzer pi die benötigten Skripte/Module mit Root-Rechten und ohne Passwortaufforderung ausführen kann muss dies mittels visudo konfiguriert werden. Achtung! Die Einträge müssen untereinander und am Ende der Datei eingefügt werden.

sudo visudo
pi ALL=(ALL) NOPASSWD: /usr/local/bin/vdrpoweroff.sh,/sbin/poweroff

Installation starten

cd /usr/local/src/vdr
sudo make REMOTE=LIRC && sudo make install

VDR mittels runvdr starten

Das Skript runvdr wird benötigt um den VDR zu starten.

runvdr vorbereiten

sudo cp /usr/local/src/vdr/runvdr.template /usr/local/bin/runvdr

runvdr anpassen

Achtung! Die erste Zeile im Skript muss von #!/bin/sh nach #!/bin/bash angepasst werden. In der Originaldatei fehlen auch zwei Zeilen mit "return 0" (Äußert sich als Syntaxfehler, unerwartetes Wort '}').

sudo vi /usr/local/bin/runvdr
#!/bin/bash

# runvdr: Loads the DVB driver and runs VDR
#
# If VDR exits abnormally, the driver will be reloaded
# and VDR restarted.
#
# In order to actually use this script you need to implement
# the functions DriverLoaded(), LoadDriver() and UnloadDriver()
# and maybe adjust the VDRPRG and VDRCMD to your particular
# requirements.
#
# Since this script loads the DVB driver, it must be started
# as user 'root'. Add the option "-u username" to run VDR
# under the given user name.
#
# Any command line parameters will be passed on to the
# actual 'vdr' program.
#
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
# $Id: runvdr.template 3.0 2011/04/17 12:34:30 kls Exp $

export LANG=de_DE.utf8
export LC_COLLATE=de_DE.utf8
export VDR_CHARSET_OVERRIDE=ISO-8859-9

setterm -clear -cursor off > /dev/tty9; chvt 9;
VDRKONSOLE="< /dev/tty9"

VDRPRG="/usr/local/bin/vdr"

VDROPTIONS="-w 60 -u pi -c /var/lib/vdr -s /usr/local/bin/vdrpoweroff.sh"
# For other options see manpage vdr.1

VDRPLUGINS="-P rpihddevice -P streamdev-client"
# You will need to select your output device plugin if you want
# to use VDR to watch video. For instance, for a "Full Featured"
# SD DVB card that would be
# VDRPLUGINS="-P dvbsddevice"
# For a "Full Featured" HD DVB card you could use
# VDRPLUGINS="-P dvbhddevice"
# There are also other output device plugins available, see
# http://www.vdr-wiki.de/wiki/index.php/Plugins.

VDRCMD="$VDRPRG $VDRKONSOLE $VDROPTIONS $VDRPLUGINS $*"

KILL="/usr/bin/killall -q -TERM"

# Detect whether the DVB driver is already loaded
# and return 0 if it *is* loaded, 1 if not:
function DriverLoaded()
{
  return 1
}

# Load all DVB driver modules needed for your hardware:
function LoadDriver()
{
  return 0
}

# Unload all DVB driver modules loaded in LoadDriver():
function UnloadDriver()
{
  return 0
}

# Load driver if it hasn't been loaded already:
if ! DriverLoaded; then
   LoadDriver
   fi

while (true) do
      eval "$VDRCMD"
      if test $? -eq 0 -o $? -eq 2; then exit; fi
      echo "`date` reloading DVB driver"
      $KILL $VDRPRG
      sleep 10
      UnloadDriver
      LoadDriver
      echo "`date` restarting VDR"
      done

runvdr Skript ausführbar machen

sudo chmod +x /usr/local/bin/runvdr

Skripte/Module mit Root-Rechten und ohne Passwortaufforderung ausführen

Damit der Benutzer pi die benötigten Skripte/Module mit Root-Rechten und ohne Passwortaufforderung ausführen kann muss dies mittels visudo konfiguriert werden. Achtung! Die Einträge müssen untereinander und am Ende der Datei eingefügt werden.

sudo visudo
pi ALL=(ALL) NOPASSWD: /usr/local/bin/runvdr,/usr/local/bin/vdr,/usr/bin/killall

Optional: remote.conf erstellen

Die Konfiguration für alle "Fernbedienungen" die VDR verwendet stehen in /var/lib/vdr/remote.conf. Die Fernbedienungen die VDR verwendet, sind abhängig davon, wie VDR gestartet wird. Ohne die --no-kbd Option wird die Tastatur ("KBD") als Fernbedienung freigegeben. Mit --lirc wird LIRC ("LIRC") als Fernbedienung freigegeben. Weitere Fernbedienungen können von Plugins kommen.

Wenn VDR für eine freigegebene Fernbedienung im remote.conf nicht zumindestens die beiden Befehle "Up/Down" findet, dann bietet er am Anfang die Anlernfunktion für diese Fernbedienung an. Man muß also remote.conf nicht manuell erzeugen, sondern kann KBD und LIRC über die Oberfläche des VDR anlernen.

Es sieht so aus als ob der VDR beim Anlernen der Tasten zwei unterschiedliche Codes für jede Taste erzeugen.

Wenn man remote.conf manuell erzeugen will sollte man darauf achten, dass die Datei den Benutzer 'pi' gehört, so daß VDR die Datei beim möglichen späteren Anlernen weiterer Fernbedienungen die Datei schreiben kann. Wenn man nicht durch die Anlernfunktion vom VDR gehen will kann remote.conf für die Tastatur als Fernbedienung von der folgenden Konfiguration erzeugen. Die Menü-Taste für die nachfolgende remote.conf ist die "M" Taste der Tastatur.

Achtung!: Die folgende remote.conf hat Kommentare, die dürfen aber NICHT übernommen werden, sonst funktioniert die remote.conf im VDR nicht. Die Kommentare dienen hier nur zur Hilfe daß man weiß welche Taste welcher Funktion zugehordnet ist. VDR hat in der remote.conf noch nie Kommentare erlaubt. Entfernen, z.b. in vi:  :%s/ #.*$//

KBD.Up         00000000001B5B41 # Pfeiltaste nach oben
KBD.Down       00000000001B5B42 # Pfeiltaste nach unten
KBD.Menu       000000000000006D # Taste M
KBD.Ok         000000000000000D # Taste Return
KBD.Back       000000000000007F # Taste Backspace
KBD.Left       00000000001B5B44 # Pfeiltaste nach links
KBD.Right      00000000001B5B43 # Pfeiltaste nach rechts
KBD.Red        0000000000000072 # Taste R
KBD.Green      0000000000000067 # Taste G
KBD.Yellow     0000000000000079 # Taste Y
KBD.Blue       0000000000000062 # Taste B
KBD.0          0000000000000030 # Taste 0
KBD.1          0000000000000031 # Taste 1
KBD.2          0000000000000032 # Taste 2
KBD.3          0000000000000033 # Taste 3
KBD.4          0000000000000034 # Taste 4
KBD.5          0000000000000035 # Taste 5
KBD.6          0000000000000036 # Taste 6
KBD.7          0000000000000037 # Taste 7
KBD.8          0000000000000038 # Taste 8
KBD.9          0000000000000039 # Taste 9
KBD.Info       0000000000000069 # Taste I
KBD.Power      0000001B5B32347E # Taste F12
KBD.Channel+   000000001B5B357E # Taste Bild nach oben
KBD.Channel-   000000001B5B367E # Taste Bild nach unten
KBD.Volume+    000000000000002B # Taste + auf dem Ziffernblock
KBD.Volume-    000000000000002D # Taste - auf dem Ziffernblock
KBD.Mute       0000000000000073 # Taste S

svdrphosts.conf anpassen

sudo vi /var/lib/vdr/svdrphosts.conf
# svdrphosts    This file describes a number of host addresses that
#               are allowed to connect to the SVDRP port of the Video
#               Disk Recorder (VDR) running on this system.
# Syntax:
#
# IP-Address[/Netmask]
#

127.0.0.1             # always accept localhost
#192.168.100.0/24     # any host on the local net
#204.152.189.113      # a specific host
#0.0.0.0/0            # any host on any net (USE THIS WITH CARE!)
192.168.0.0/24        # Euer Netzwerk

VDR auf non-root vdruser umstellen

Diese Anleitung geht davon aus, dass der vdr unter dem Nutzer pi läuft. Einige Verzeichnisse müssen natürlich pi als Besitzer haben.

sudo chown -R pi.pi /var/lib/vdr /var/cache/vdr /srv/vdr/video

Optional: vdr unter dem Nutzer vdr verwenden

Dies kann Vorteile haben im Zusammenhang mit dem Server vdr. Im folgenden sind die Details kompatibel zu einer yaVdr-Installation.

sudo adduser --disabled-login --uid 666 --home /var/lib/vdr vdr
sudo adduser vdr video
sudo adduser vdr audio
sudo adduser vdr sudo

sudo mkdir -p /srv/vdr/video
sudo chown -R vdr.vdr /srv/vdr

sudo mkdir -p /var/cache/vdr
sudo chown -R vdr.vdr /var/cache/vdr

An verschiedenen anderen Stellen wie z.b. runvdr oder /etc/default/vdr muss der Nutzer auf vdr umgestellt werden.

-u pi in -u vdr

oder

USER=vdr

VDR in den Autostart

Hier wird die einfachste Methode für Autostart beschrieben.

sudo vi /etc/rc.local
sudo /usr/local/bin/runvdr
exit 0

Man kann auch System-V-Init oder Upstart verwenden. Dies hat gewisse Vorteile wenn man den VDR stoppen will. Upstart scheint auf dem PI noch nicht korrekt zu funktionieren (Jan 2015). Manuelles starten/stoppen mit "sudo service vdr start" hat zwar funktioniert, aber nicht während des bootens.

System-V-Init script

VDR auf Lauffähigkeit überprüfen

Achtung! Bisher kann noch kein TV Bild angezeigt werden da noch kein Ausgabedevice Plugin eingerichtet ist. Die ERROR Meldungen sind hier vorerst normal. Am besten Ihr öffnet zwei SSH Sessions, wie folgt, auf eurem Pi.

SSH Session 1

Hier wird das syslog geöffnet um die VDR Meldungen beim starten zu sehen:

tail -f /var/log/syslog

Im syslog werden bei einer raspian Standardinstallation nicht alle log Meldungen vom VDR angezeigt, stattdessen in user.log:

tail -f /var/log/user.log

SSH Session 2

Hier wird der VDR manuell gestartet:

sudo /usr/local/bin/runvdr

VDR Logausgabe

Jetzt könnt Ihr auf der "SSH Session 1" genau mitverfolgen was der VDR macht. Wenn der VDR, vorerst ohne TV Bild, ordnungsgemäß läuft sollte es so aussehen:

Aug 18 18:55:20 pi01 vdr: [10825] VDR version 2.1.6 started
Aug 18 18:55:20 pi01 vdr: [10825] switched to user 'pi'
Aug 18 18:55:20 pi01 vdr: [10825] codeset is 'UTF-8' - known
Aug 18 18:55:20 pi01 vdr: [10825] found 28 locales in /usr/local/share/locale
Aug 18 18:55:20 pi01 vdr: [10825] creating directory /var/lib/vdr/themes
Aug 18 18:55:20 pi01 vdr: [10825] loading /var/lib/vdr/sources.conf
Aug 18 18:55:20 pi01 vdr: [10825] loading /var/lib/vdr/diseqc.conf
Aug 18 18:55:20 pi01 vdr: [10825] loading /var/lib/vdr/scr.conf
Aug 18 18:55:20 pi01 vdr: [10825] loading /var/lib/vdr/channels.conf
Aug 18 18:55:20 pi01 vdr: [10825] loading /var/lib/vdr/svdrphosts.conf
Aug 18 18:55:20 pi01 vdr: [10825] loading /var/lib/vdr/keymacros.conf
Aug 18 18:55:20 pi01 vdr: [10825] registered source parameters for 'A - ATSC'
Aug 18 18:55:20 pi01 vdr: [10825] registered source parameters for 'C - DVB-C'
Aug 18 18:55:20 pi01 vdr: [10825] registered source parameters for 'S - DVB-S'
Aug 18 18:55:20 pi01 vdr: [10825] registered source parameters for 'T - DVB-T'
Aug 18 18:55:20 pi01 vdr: [10825] no DVB device found
Aug 18 18:55:20 pi01 vdr: [10825] ERROR: invalid primary device number: 1
Aug 18 18:55:20 pi01 vdr: [10828] epg data reader thread started (pid=10825, tid=10828, prio=high)
Aug 18 18:55:20 pi01 vdr: [10828] epg data reader thread ended (pid=10825, tid=10828)
Aug 18 18:55:20 pi01 vdr: [10827] video directory scanner thread started (pid=10825, tid=10827, prio=high)
Aug 18 18:55:20 pi01 vdr: [10827] video directory scanner thread ended (pid=10825, tid=10827)
Aug 18 18:55:20 pi01 vdr: [10825] ERROR: no primary device found - using first device!
Aug 18 18:55:20 pi01 vdr: [10825] ERROR: invalid primary device number: 1
Aug 18 18:55:20 pi01 vdr: [10826] video directory scanner thread started (pid=10825, tid=10826, prio=high)
Aug 18 18:55:20 pi01 vdr: [10826] video directory scanner thread ended (pid=10825, tid=10826)
Aug 18 18:55:20 pi01 vdr: [10825] max. latency time 0 seconds
Aug 18 18:55:20 pi01 vdr: [10825] exiting, exit code 2

Optional: Aufnahmeverzeichnis auf NFS Server

Standardmäßig wird als VDR Aufnahmeverzeichnis das lokale Dateisystem verwendet. Da ich in meinem Raspberry Pi eine SD Karte für das Betriebssystem verwende habe ich mich dazu entschieden das Dateisystem von meinem VDR System zu verwenden. Somit landen alle Aufnahmen automatisch auf meinem VDR System und der Raspberry Pi greift darauf über das Netzwerk zu. Hierfür ist es nötig auf dem VDR System einen NFS Server zu konfigurieren und der Raspberry Pi wird als NFS Client eingebunden.

NFS Server - VDR System

Installation

sudo apt-get install nfs-kernel-server

lokale Verzeichnisse vorbereiten

sudo mkdir -p /srv/nfsv4/vdrrecords
sudo mount --bind /data/vdrrecords /srv/nfsv4/vdrrecords
sudo vi /etc/fstab

/data/vdrrecords	/srv/nfsv4/vdrrecords		none	bind	0	0

Kerberos Sicherheit deaktivieren

sudo vi /etc/default/nfs-kernel-server
# Do you want to start the svcgssd daemon? It is only required for Kerberos
# exports. Valid alternatives are "yes" and "no"; the default is "no".
NEED_SVCGSSD="no"

Benutzer Zuordnung

sudo vi /etc/idmapd.conf
[General]

Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if id differs from FQDN minus hostname
# Domain = localdomain

[Mapping]

Nobody-User = nobody
Nobody-Group = nogroup

NFS Freigaben konfigurieren

Der Raspberry Pi läuft im Standard mit dem vom Betriebssystem angelegten Benutzer pi. Da auf einem VDR System meist ein anderer Benutzer verwendet wird muss sichergestellt werden das beide Systeme mit dem gleichen Benutzer auf das Verzeichnis zugreifen. Auf meinem VDR System verwende ich den Benutzer vdruser. Bei der NFS Freigabe kann dieser Benutzer über seine ID angegeben werden. Im Normalfall hat der erste angelegte Benutzer auf einem Linuxsystem die ID 1000.

sudo cat /etc/passwd

vdruser:x:1000:1000:vdruser,,,:/home/user01:/bin/bash
sudo vi /etc/exports

/srv/nfsv4              192.168.0.0/24(rw,fsid=0,secure,no_subtree_check,sync)
/srv/nfsv4/vdrrecords   192.168.0.0/24(rw,secure,no_subtree_check,sync,all_squash,anonuid=1000,anongid=1000)

Jeder berechtigte NFS Lese- oder Schreibzugriff wird jetzt automatisch auf die Benutzer ID 1000 (vdruser) gemappt, unabhängig mit welchem Benutzeraccount auf die Freigabe zugegriffen wird.

Hosts Zugrifflisten erstellen

sudo vi /etc/hosts.deny

rpcbind mountd nfsd statd lockd rquotad : ALL
sudo vi /etc/hosts.allow

rpcbind mountd nfsd statd lockd rquotad : 127.0.0.1 192.168.0.11

Neustart VDR System

sudo init 6

NFS Client - Raspberry Pi

Installation

sudo apt-get install nfs-common

Hosts Zugrifflisten erstellen

sudo vi /etc/hosts.deny

rpcbind : ALL
sudo vi /etc/hosts.allow

rpcbind : 127.0.0.1 192.168.0.10

Benutzer Zuordnung

sudo vi /etc/idmapd.conf
[General]

Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if id differs from FQDN minus hostname
# Domain = localdomain

[Mapping]

Nobody-User = nobody
Nobody-Group = nogroup

NFS Freigaben auflisten

showmount -e 192.168.0.10

fstab anpassen

Hier wird der Pfad zu eurem VDR Aufnahmeverzeichnis angegeben sowie der lokale Dateisystempfad wo die Aufnahmen auf eurem Raspbery Pi landen sollen.

sudo vi /etc/fstab
192.168.0.10:/srv/nfsv4/vdrrecords     /srv/vdr/video     nfs     auto    0       0

Neustart Pi System

sudo init 6

Testen der NFS Verbindung

Nach einem Neustart vom System sollte auf eurem Raspberry Pi das Aufnahmeverzechnis vom VDR System per NFS eingehängt sein.

ls -l /srv/vdr/video

Optional: Server VDR per wake on LAN starten

Tool installieren.

sudo apt-get install wakeonlan

Dann in /etc/rc.local einfügen.

# wake VDR
wakeonlan <MAC-Addresse des VDR servers>

Die MAC-Addresse kann mit dem tool arp gefunden werden.

arp
Address                 HWtype  HWaddress           Flags Mask            Iface
vdr                     ether   xx:xx:xx:xx:xx:xx   C                    eth0

VDR Plugins

Downloadverzeichnis für Plugins vorbereiten

mkdir /data/installfiles/vdrplugins

rpihddevice Plugin

Download

cd /data/installfiles/vdrplugins
git clone git://projects.vdr-developer.org/vdr-plugin-rpihddevice.git
tar -czf vdr-plugin-rpihddevice-git-30122014.tar.gz vdr-plugin-rpihddevice

Was hat sich geändert?

Auf der folgenden Webseite können die aktuellen Änderungen des Plugins eingesehen werden:

http://projects.vdr-developer.org/git/vdr-plugin-rpihddevice.git/

Installation

cd /usr/local/src/vdr/PLUGINS/src
sudo cp -a /data/installfiles/vdrplugins/vdr-plugin-rpihddevice .
sudo ln -s vdr-plugin-rpihddevice rpihddevice
cd /usr/local/src/vdr/
sudo make plugins && sudo make install
sudo chown -R pi.pi /var/lib/vdr /var/cache/vdr

runvdr anpassen

Die Plugins werden in das bestehende runvdr Skript hintereinander eingefügt:

Zum Beispiel:

VDRPLUGINS="-P Plugin1 -P Plugin2 -P Plugin3"

Hier der Eintrag für das dvbhddevice Plugin:

sudo vi /usr/local/bin/runvdr
VDRPLUGINS="-P rpihddevice"

Streamdev Plugin

Download

cd /data/installfiles/vdrplugins
git clone git://projects.vdr-developer.org/vdr-plugin-streamdev.git vdr-plugin-streamdev
tar -czf vdr-plugin-streamdev-23122014.tar.gz vdr-plugin-streamdev/

Was hat sich geändert?

Auf der folgenden Webseite können die aktuellen Änderungen des Plugins eingesehen werden:

http://projects.vdr-developer.org/repositories/show/plg-streamdev

Installation

cd /usr/local/src/vdr/PLUGINS/src
sudo cp -a /data/installfiles/vdrplugins/vdr-plugin-streamdev .
sudo ln -s vdr-plugin-streamdev/ streamdev
cd /usr/local/src/vdr/
sudo make plugins && sudo make install
sudo chown -R pi.pi /var/lib/vdr /var/cache/vdr

runvdr anpassen

sudo vi /usr/local/bin/runvdr
-P streamdev-client

System neustarten

sudo init 6

Streamdev-Client zum Streamdev-Server verbinden

Nach dem Neustart sollte das VDR OSD am TV angezeigt werden. Hierüber kann dann der Streamdev-Client konfiguriert werden.

  • VDR Menü -> Einstellungen -> Plugins -> streamdev-client ->
Gleichzeitig genutzte DVB-Karten: 1
IP der Gegenseite:                192.168.0.10
Port der Gegenseite:              2004
Filter-Daten streamen:            nein

Danach auf einen Kanal umschalten dann sollte das TV Bild sichtbar sein.

Optional: Regionalprogramme korrekt empfangen

Einige Programme verwenden dynamisch ändernde Kanalinformation (PIDs). Ein Beispiel sind die Regionalfenster des NDR. Mit der obigen Einstellung kann man diese Programme nicht korrekt empfangen - man sieht dann beim NDR zum Beispiel während der Regionalfenster nur Niedersachsen.

  • VDR Menü -> Einstellungen -> DVB ->
...
Kanäle aktualisieren:            nur PIDs
  • VDR Menü -> Einstellungen -> Plugins -> streamdev-clients ->
...
Filter-Daten streamen:           ja

Bei der Aktivierung von "Filter-Daten streamen" kann es zu Pufferproblemen kommen, die im syslog wie folgt aussehen:

Jan  9 20:39:18 raspberrypi vdr: [2115] cStreamdevFilter::PutSection socket overflow, Pid   18 Tid  64

Wenn es daraufhin zu stockender live-TV Widergabe kommt dann die folgenden Filter Pufferpatches fuer den streamdev-client ausprobieren:

http://projects.vdr-developer.org/issues/2045

http://projects.vdr-developer.org/attachments/1844/vdr-plugin-streamdev-filter-patch.diff http://projects.vdr-developer.org/attachments/1853/vdr-plugin-streamdev-filter-patch2.diff

Nach compilieren des streamdev-clients mit diesen Patches gibt es im Setup Menu eine weiter Option:

  • VDR Menü -> Einstellungen -> Plugins -> streamdev-clients ->
...
Filter-Daten streamen:           ja
Filter Socket Puffergröße:       0

Der Patch sollte bereits ohne Einstellung einer Puffergröße helfen, daß die Widergabe nicht stockt. Wenn nicht, dann eine Puffergröße einstellen die ausrechend ist, alle Filterdaten zu puffern.

/usr/local/bin/runvdr anpassen:

# Permit larger socket buffer sizes:
sysctl net.core.wmem_max=3072000
  • VDR Menü -> Einstellungen -> Plugins -> streamdev-clients ->
...
Filter-Daten streamen:           ja
Filter Socket Puffergröße:       3072000

svdrpservice Plugin

Das svdrpservice Plugin bietet selbst keinen Benutzerdienst an. Es ist vielmehr ein notwendiger Dienst für die Plugins epgsync und remotetimers. Im svdrpservice Plugin wird die SVDRP Verbindung zum VDR server eingestellt, die dann automatisch von den anderen Plugins verwendet wird.

Download

cd /data/installfiles/vdrplugins
wget http://vdr.schmirler.de/svdrpservice/vdr-svdrpservice-1.0.0.tgz

Was hat sich geändert?

Auf der folgenden Webseite können die aktuellen Änderungen des Plugins eingesehen werden:

http://vdr.schmirler.de/svdrpservice/HISTORY

Installation

cd /usr/local/src/vdr/PLUGINS/src
sudo tar -xzf /data/installfiles/vdrplugins/vdr-svdrpservice-1.0.0.tgz
sudo ln -s svdrpservice-1.0.0 svdrpservice
cd /usr/local/src/vdr/
sudo make plugins && sudo make install
sudo chown -R pi.pi /var/lib/vdr /var/cache/vdr

runvdr anpassen

sudo vi /usr/local/bin/runvdr
-P'svdrpservice 192.168.0.10:6419'

Hier wird die IP Adresse sowie Port von eurem VDR System angegeben.

epgsync Plugin

Download

cd /data/installfiles/vdrplugins
wget http://vdr.schmirler.de/epgsync/vdr-epgsync-1.0.1.tgz

Was hat sich geändert?

Auf der folgenden Webseite können die aktuellen Änderungen des Plugins eingesehen werden:

http://vdr.schmirler.de/epgsync/HISTORY

Installation

cd /usr/local/src/vdr/PLUGINS/src
sudo tar -xzf /data/installfiles/vdrplugins/vdr-epgsync-1.0.1.tgz
sudo ln -s epgsync-1.0.1 epgsync
cd /usr/local/src/vdr/
sudo make plugins && sudo make install
sudo chown -R pi.pi /var/lib/vdr /var/cache/vdr

runvdr anpassen

sudo vi /usr/local/bin/runvdr
-P epgsync

epgsync Plugin konfigurieren

Nach dem Neustart sollte das VDR OSD am TV angezeigt werden. Hierüber kann dann das epgsync Plugin konfiguriert werden.

  • VDR Menü -> Einstellungen -> Plugins -> epgsync ->
Server IP:                        192.168.0.10
Server Port:                      aus svdrpservice
Kanalweise synchronisieren:       ja
EPG sync beim Starten:            ja
Zeit bis zum EPG sync (h):        1
Kanäle zuordnen nach:             Name, ID
Ziel-Kanäle:                      alle

remotetimers Plugin

Das remotetimers Plugin erlaubt es auf vom RPI Client aus Aufnahmen auf dem VDR-Server aufzusetzen, anzuschauen und zu editieren. Wenn man es einfach ohne Patches aufsetzt, dann erzeugt es ein Untermenü "Server Timer", in dem die Einträge "Programm", "Timer" und "Aufzeichnungen" auf den Server zugreifen statt lokal.

Download

cd /data/installfiles/vdrplugins
wget http://vdr.schmirler.de/remotetimers/vdr-remotetimers-1.0.1.tgz
wget https://raw.githubusercontent.com/VDR4Arch/vdr4arch/master/plugins/vdr-remotetimers/remotetimers-vdr2.1.2compat.diff

Was hat sich geändert?

Auf der folgenden Webseite können die aktuellen Änderungen des Plugins eingesehen werden:

http://vdr.schmirler.de/remotetimers/HISTORY

Installation

cd /usr/local/src/vdr/PLUGINS/src
sudo tar -xzf /data/installfiles/vdrplugins/vdr-remotetimers-1.0.1.tgz
sudo ln -s remotetimers-1.0.1 remotetimers
cd remotetimers
sudo patch -p1 -i /data/installfiles/vdrplugins/remotetimers-vdr2.1.2compat.diff

Um den RPI möglichst einfach bedienbar zu machen, empfiehlt es sich die folgenden Patches vom remotetimers Plugin einzuspielen. Diese erlauben es dann durch Konfiguration im OSD dieses so aufzusetzen, daß die Hauptmenueinträge "Programm", "Timer" und "Aufzeichnungen" durch die des Plugins ersetzt werden. Dadurch wird es unmöglich gemacht, (aus Versehen) lokal auf dem SD des RPI Aufzeichnungen aufzusetzen, und der RPI VDR bedient sich fast komplett so wie ein VDR mit lokaler Aufnahme.

Zur kontrollierten Anwendung der Patches empfiehlt es sich, patch erst einmal mit dem zusätzlichen Argument "--dry-run" zu starten, die Patches anzusehen, und bei Fehlern zu schauen, wo die VDR-Quellen manuell gepatched werden müssen.

Note: HUNK1 vom MainMenuHooks patch failed gegen VDR 2.1.6 (kleine Änderungen gegenüber der VDR Version für die der Patch gemacht wurde) und muss händisch eingebaut werden.

cd /usr/local/src/vdr/
patch -p1 < PLUGINS/src/remotetimers/patches/MainMenuHooks-v1_0_2.diff
patch -p0 --dry-run < PLUGINS/src/remotetimers/patches/vdr-1.7.28-remote_instant_recordings.patch
patch -p0  < PLUGINS/src/remotetimers/patches/vdr-1.7.29-skinlcars.patch

Compilieren:

cd /usr/local/src/vdr/
sudo make plugins && sudo make install
sudo chown -R pi.pi /var/lib/vdr /var/cache/vdr

runvdr anpassen

sudo vi /usr/local/bin/runvdr
-P remotetimers

Konfigurieren

Mit eingespielten Patches und nach Neustart des VDR empfehlen sich Einstellungen des Plugins wie folgt: Server IP: <= Muss nur im svdrpservice plugin gesetzt sein Server Port: aus svdrpservice Kanäle zuordnen anhand: Kanal-ID Hauptmenüeintrag verstecken: ja <= Wird nicht benötigt, da Hauptmenüeinträge bereits durch plugin ersetzt sind Voreinstellung für neue Timer Aufnahmeort: Server Direktaufzeichnung: Server Live-Signal anhalten: Server Benutzer-ID: 0 Einstellungen für das Menü "Programm" Hauptmenü ersetzen: ja Darstellung der Liste: Oberfläche Fortschrittsanzeige: ja .. Einstellungen für das Menü "Timer" Hauptmenü ersetzen: ja Darstellung der Liste: Oberfläche Benutzer Filter: 0 Einstellungen für das Menü "Aufzeichnungen" Hauptmenü ersetzen: ja Darstellung der Liste: Oberfläche Benutzer Filter: 0 Darstellung der Liste: Oberfläche Benutzer Filter: 0 Max Bandbreite beim Verschieben: unbegrenzt Server Aufzeichnungen: Update-Datei beobachten: ja

suspendoutput Plugin

Wenn man den RPI via streamdev zu einem zentralen VDR server verbindet, kann man schnell mehr aktive clients haben als verfügbare Tuner: Lokaler VDR auf dem Server + Aufnahmen + clients (RPI oder andere).

Wird der Fernseher des RPI nur mit dem RPI verwendet (hat also keine lokalen Tuner oder andere Medienabspieler, die alternativ verwendet werden) und hat der Fernseher auch noch 2 USB Eingänge, dann ist es ausreichend, den RPI mit einem Y-Kabel über die USB-Ports des Fernsehers mit Strom zu versorgen. Der RPI läuft dann nur wenn er benötigt wird. Diese Art der Stromversorgung kann immer sinnvoll sein (wenn möglich), aber wenn am Fernseher noch andere Quellen neben dem RPI angeschaut werden können, dann empfängt der RPI immer noch via streamdev Daten wenn er garnicht gebraucht wird und belegt unnötig einen Tuner am Server-VDR.

In diesem Fall bietet sich das suspendoutput plugin an, das bei Inaktivität den VDR suspendiert: Es wird ein Pause-Bild angezeigt und auf der streamdev-Verbindung werden keine Daten angefordert, so daß kein Tuner auf dem VDR Server belegt wird.

http://www.vdr-wiki.de/wiki/index.php/Suspendoutput-plugin

Download

Neueste Version im repository suchen. Im folgenden wird angenommen 2.0.0 ist die neueste Version (12/2014).

http://phivdr.dyndns.org/vdr/vdr-suspendoutput/?C=M;O=D
cd /data/installfiles/vdrplugins
wget http://phivdr.dyndns.org/vdr/vdr-suspendoutput/vdr-suspendoutput-2.0.0.tgz

Installation vorbereiten

cd /usr/local/src/vdr/PLUGINS/src
sudo tar -xzf /data/installfiles/vdrplugins/vdr-suspendoutput-2.0.0.tgz
sudo ln -s suspendoutput-2.0.0 suspendoutput
wget https://raw.githubusercontent.com/VDR4Arch/vdr4arch/master/plugins/vdr-suspendoutput/suspendoutput-vdr2.1.2compat.diff
patch -p1 < suspendoutput-vdr2.1.2compat.diff
wget -O vdr-plugin-suspendoutput-fix1.diff  'http://www.vdr-portal.de/index.php?page=Attachment&attachmentID=37169&h=213b7e6f8c2114d41bf41afe09764b95d523c048'
patch -p1 < vdr-plugin-suspendoutput-fix1.diff

In Versionen <= 2.0.0 sind die im suspendoutput plugin enthaltenen MPEG Standbilddateien nicht konform mit den VDR API Standards und können das rpihddevice und damit den VDR zum Absturz bringen. Die Dateien dann patchen:

ffmpeg wird benötigt:

sudo apt-get install ffmpeg
cd suspendoutput
sudo ffmpeg -i vdrlogo_720x576.mpg -f mpegts vdrlogo_720x576.pes
sudo ffmpeg -i black_720x576.mpg   -f mpegts black_720x576.pes
sudo mv vdrlogo_720x576.pes vdrlogo_720x576.mpg
sudo mv black_720x576.pes   black_720x576.mpg

Installieren

cd /usr/local/src/vdr/
sudo make plugins && sudo make install
sudo chown -R pi.pi /var/lib/vdr /var/cache/vdr

runvdr anpassen

sudo vi /usr/local/bin/runvdr
-P suspendoutput

Optional: live plugin

Das Live-plugin bietet eine Weboberfläche an von der sich aus viele Funktionen des VDR steuern lassen. Da der Raspberry als client aufgesetzt ist, sind diese Funktionen unterschiedlich sinnvoll. Der Teil der Funktionen die auf dem RPI Client nicht sinnvoll sind sollten einfach über das Live plugin auf dem VDR Server gemacht werden.

Die Fernbedienung eignet sich sehr gut als Troubleshooting Tool und zur Ferndiagnose wenn ein Benutzer Schwierigkeiten hat. "Zeig doch mal, was Du da am VDR bedienst, ich kann Dir hier aus der Ferne zuschauen".

Das Programm und Zeitleiste sind sehr praktisch um durch die TV Programme zu browsen (ohne dafür den Bildschirm mit dem OSD des VDR zu belegen), und das Umschalten der Programme ist ebenso praktisch von der Live Webpage aus.

Das programmieren von Aufnahmen ist auf dem RPI client nicht so sinnvoll, weil diese Aufnahmen alle auf dem RPI landen und nicht auf dem Server. Ebenso sieht man in den Timer(n) nur diese lokal programmierten Aufnahmen.

Download

cd /data/installfiles/vdrplugins
git clone git://projects.vdr-developer.org/vdr-plugin-live.git
wget http://projects.vdr-developer.org/attachments/download/1854/vdr-plugin-live-patch.2.1.6.diff

Was hat sich geändert

http://live.vdr-developer.org
http://projects.vdr-developer.org/issues/2056

Installieren

sudo apt-get install libtntnet-dev libcxxtools-dev libpcre3-dev
cd /usr/local/src/vdr/PLUGINS/src
sudo cp -a /data/installfiles/vdrplugins/vdr-plugin-live .
sudo ln -s vdr-plugin-live live
cd live
sudo patch -p1 < /data/installfiles/vdrplugins/vdr-plugin-live-patch.2.1.6.diff
cd /usr/local/src/vdr/
sudo make plugins && sudo make install
cd /usr/local/src/vdr/PLUGINS/src/live
mkdir -p /usr/local/share/vdr/plugins
cp -a live /usr/local/share/vdr/plugins
sudo chown -R pi.pi /var/lib/vdr /var/cache/vdr /usr/local/share/vdr

runvdr anpassen

sudo vi /usr/local/bin/runvdr
-P live

Dann VDR restarten. In der Plugin Konfiguration kann man dann den maximal im live plugin angezeiten Kanal enstellen, und welche username/password beim Zugriff auf das Live plugin über das Web erlaubt sind. Alles andere wird über die Weboberfläche gesteuert.

=Verwenden

Um das Live plugin zu verwenden, einfach von einem Browser aus:

 http://<RPI-ip-address>:8008/

Default username ist "admin", password "live".

Optional: Lirc - Raspberry Pi mit der Fernbedienung steuern

Der Raspberry Pi bringt bereits am GPIO-Header Anschlussmöglichkeiten für einen IR-Empfänger mit. Mit etwas Bastelgeschick lässt sich ein passender IR-Empfänger für kleines Geld selber bauen. Wie ich das gemacht habe beschreibe ich hier.

Materialliste für den IR-Empfänger

IR-Empfänger:         TSOP4836 axial bedrahtet 36 kHz 950 nm oder TSOP4838 axial bedrahtet 38 kHz 950 nm oder TSOP 31236 (Reichelt)
Verbindungskabel:     RB-CB3-25 Bunt oder RB-CB3-50 Bunt (25cm Länge oder 50cm Länge)
Schrumpfschlauch:     Dünnwandiger Schrumpfschlauch Ø vor/nach Schrumpfung: 9 mm/3 mm Schrumpfrate 3:1 Schwarz
Schrumpfschlauch-Set: Nachfüllbeutel für Schrumpfschlauch-Set 2 : 1 40 mm Bunt 125 St.

Fernbedienung

Da ich noch eine alte TechnoTrend Fernbedienung habe verwende ich vorerst diese. Eine Alternative ist im Bereich Fernbedienungen zu finden. Z.B.

Raspberry Pi Schaltbild

Das gezeigte Schaltbild ist von einem Raspberry Pi Modell B. Die PIN Belegung von einem Raspberry PI B+ ist identisch zu dem Vorgängermodell.

RaspberryPI Schaltbild.png

IR-Empfänger zusammenbauen

Ich habe drei Verbindungskabel für meinen IR-Empfänger verwendet (Rot, Schwarz und Lila). Auf einer Seite der Verbindungskabel habe ich die Stecker abgeschnitten und diese, wie auf dem obigen Schaltbild, am TSOP angelötet.

VS:  rotes Kabel
GND: schwarzes Kabel
Out: lila Kabel

Über die einzelnen Lötstellen habe ich Schrumpfschläuche gezogen und diese mit einem Heißluftfön verschmolzen (Feuerzeug geht auch). Wer nicht die einzelnen Verbindungskabel sehen möchte kann nochmals einen Schrumpfschlauch über die gesammten Verbindungskabel ziehen. Zum Schluss werden die Verbindungskabel wie auf dem obigen Schaltbild auf den Raspberry Pi aufgesteckt.

Lirc Konfiguration

Module laden

sudo modprobe lirc_rpi

Module in den Autostart

Damit die Module nach einem System start automatisch geladen werden müssen diese in die modules eingetragen werden.

sudo cp /etc/modules /etc/modules_orig
sudo vi /etc/modules
lirc_rpi

Lirc device ermitteln

ls -l /dev/lir*
crw-rw---T 1 root video 247, 0 Jan  4 12:23 /dev/lirc0

Hardware konfiguration

sudo cp /etc/lirc/hardware.conf /etc/lirc/hardware.conf_orig
sudo vi /etc/lirc/hardware.conf
# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"

# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

Neustarten des Lirc Daemon

sudo /etc/init.d/lirc restart

Erster Test vom IR-Empfänger

Kernelmodul laden

sudo modprobe lirc_rpi
dmesg |grep lirc

lirc_dev: IR Remote Control driver registered, major 248
lirc_rpi: module is from the staging directory, the quality is unknown, you have been warned.
lirc_rpi: auto-detected active low receiver on GPIO pin 18
lirc_rpi lirc_rpi.0: lirc_dev: driver lirc_rpi registered at minor = 0
lirc_rpi: driver registered!

Hier ist zu sehen das der IR-Empfänger am GPIO Pin 18 erkannt wird.

Prüfen ob Signale der Fernbedienung ankommen

sudo /etc/init.d/lirc stop
mode2 -d /dev/lirc0

Danach ein paar Tasten auf der Fernbedienung drücken, wenn alles funktionoiert sollte es so aussehen:

space 3260954
pulse 876
space 805
pulse 1718
space 1636
pulse 1722
space 1630
pulse 1724
space 1632
pulse 1714
space 820
pulse 864
space 795
pulse 882
space 793
pulse 886
space 799
pulse 874
space 1638
pulse 882

Anlernen der Fernbedienung

Datei mit gültigen Lirc Namespaces erstellen

sudo irrecord --list-namespace | grep KEY &> ~/lirc_strings.txt

Aus dieser Datei holt Ihr euch dann die passenden Namen für eure Tasten. Anzeigen der Datei:

sudo cat ~/lirc_strings.txt

Anlernmodus starten

sudo /etc/init.d/lirc stop
sudo irrecord -d /dev/lirc0 ~/lircd.conf

Nach starten dem Dialog auf der Konsole folgen.

irrecord -  application for recording IR-codes for usage with lirc

Copyright (C) 1998,1999 Christoph Bartelmus(lirc@bartelmus.de)

This program will record the signals from your remote control
and create a config file for lircd.

A proper config file for lircd is maybe the most vital part of this
package, so you should invest some time to create a working config
file. Although I put a good deal of effort in this program it is often
not possible to automatically recognize all features of a remote
control. Often short-comings of the receiver hardware make it nearly
impossible. If you have problems to create a config file READ THE
DOCUMENTATION of this package, especially section "Adding new remote
controls" for how to get help.

If there already is a remote control of the same brand available at
http://www.lirc.org/remotes/ you might also want to try using such a
remote as a template. The config files already contain all
parameters of the protocol used by remotes of a certain brand and
knowing these parameters makes the job of this program much
easier. There are also template files for the most common protocols
available in the remotes/generic/ directory of the source
distribution of this package. You can use a template files by
providing the path of the file as command line parameter.

Please send the finished config files to <lirc@bartelmus.de> so that I
can make them available to others. Don't forget to put all information
that you can get about the remote control in the header of the file.

Press RETURN to continue. 
Now start pressing buttons on your remote control.

It is very important that you press many different buttons and hold them
down for approximately one second. Each button should generate at least one
dot but in no case more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have been
generated. 

Press RETURN now to start recording.
................................................................................
Found const length: 107332
Please keep on pressing buttons like described above.
................................................................................
RC-5 remote control found.
Found possible header: 876 828
No repeat code found.
Signals are biphase encoded.
Removed header.
Signal length is 13
Now enter the names for the buttons.

Please enter the name for the next button (press <ENTER> to finish recording)
KEY_POWER

Now hold down button "KEY_POWER".

Please enter the name for the next button (press <ENTER> to finish recording)
KEY_MUTE

Now hold down button "KEY_MUTE".

Please enter the name for the next button (press <ENTER> to finish recording)
...
...
...

Lirc Konfiguration einspielen

sudo cp /etc/lirc/lircd.conf /etc/lirc/lircd.conf_orig
sudo cp ~/lircd.conf /etc/lirc/lircd.conf
sudo /etc/init.d/lirc start

Neustart vom System

sudo init 6

Nach einem Neustart vom VDR wird automatisch das Anlernmenü für die Fernbedienung gestartet.

Optional: VDR und Lirc Konfigurationen

Die beiden untigen Konfigurationen werden durch den Anlernprozess von VDR und Lirc erstellt. Falls Ihr die gleiche Hardware verwendet könnt Ihr die Konfigurationen verwenden und somit den Anlernprozess umgehen.

remote.conf

Ihr könnt euch die remote.conf mittels VDR über das OSD-Anlernprogramm erstellen. Wenn Ihr euch die remote.conf manuell erstellen möchtet müssen die VDR-LIRC Kommandos mit den Tasten aus der obigen IRTrans Konfigurationsdatei zugeordnet werden. Achtung! Die Namen sind Case Sensitive.

sudo vi /var/lib/vdr/remote.conf
LIRC.Up          KEY_UP
LIRC.Down        KEY_DOWN
LIRC.Menu        KEY_MENU
LIRC.Ok          KEY_OK
LIRC.Back        KEY_BACK
LIRC.Left        KEY_LEFT
LIRC.Right       KEY_RIGHT
LIRC.Red         KEY_RED
LIRC.Green       KEY_GREEN
LIRC.Yellow      KEY_YELLOW
LIRC.Blue        KEY_BLUE
LIRC.0           KEY_0
LIRC.1           KEY_1
LIRC.2           KEY_2
LIRC.3           KEY_3
LIRC.4           KEY_4
LIRC.5           KEY_5
LIRC.6           KEY_6
LIRC.7           KEY_7
LIRC.8           KEY_8
LIRC.9           KEY_9
LIRC.Play        KEY_PLAY
LIRC.Pause       KEY_PAUSE
LIRC.Stop        KEY_STOP
LIRC.Record      KEY_RECORD
LIRC.FastFwd     KEY_FASTFORWARD
LIRC.FastRew     KEY_REWIND
LIRC.Power       KEY_POWER
LIRC.Channel+    KEY_CHANNELUP
LIRC.Channel-    KEY_CHANNELDOWN
LIRC.Volume+     KEY_VOLUMEUP
LIRC.Volume-     KEY_VOLUMEDOWN
LIRC.Mute        KEY_MUTE
LIRC.Schedule    KEY_EPG
LIRC.Info        KEY_INFO

lircd.conf

sudo vi /etc/lirc/lircd.conf
# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.9.0-pre1(default) on Sun Aug 24 12:08:49 2014
#
# contributed by
#
# brand:                       /home/pi/lircd.conf
# model no. of remote control:
# devices being controlled by this remote:
# 

begin remote

  name  /home/pi/lircd.conf
  bits           13
  flags RC5|CONST_LENGTH
  eps            30
  aeps          100

  one           867   810
  zero          867   810
  plead         884
  gap          107337
  toggle_bit_mask 0x800

      begin codes
          KEY_UP                   0x154D
          KEY_DOWN                 0x1551
          KEY_MENU                 0x1559
          KEY_OK                   0x154F
          KEY_BACK                 0x1553
          KEY_LEFT                 0x154E
          KEY_RIGHT                0x1550
          KEY_RED                  0x1554
          KEY_GREEN                0x1555
          KEY_YELLOW               0x1556
          KEY_BLUE                 0x1557
          KEY_0                    0x154C
          KEY_1                    0x1543
          KEY_2                    0x1544
          KEY_3                    0x1545
          KEY_4                    0x1546
          KEY_5                    0x1547
          KEY_6                    0x1548
          KEY_7                    0x1549
          KEY_8                    0x154A
          KEY_9                    0x154B
          KEY_PLAY                 0x157B
          KEY_PAUSE                0x157E
          KEY_STOP                 0x157C
          KEY_RECORD               0x157A
          KEY_FASTFORWARD          0x157F
          KEY_REWIND               0x157D
          KEY_POWER                0x1541
          KEY_CHANNELUP            0x1563
          KEY_CHANNELDOWN          0x1564
          KEY_VOLUMEUP             0x1565
          KEY_VOLUMEDOWN           0x1566
          KEY_MUTE                 0x1558
          KEY_EPG                  0x1562
          KEY_INFO                 0x1552
      end codes

end remote

SD Management

Backup mit rpi-clone

Alle Linux Installationen auf dem RPI haben zumindestens eine DOS Partition und eine Linux Partition. Die DOS Partition wird vom Bootloader des RPI verwendet und enthält auch die MPEG2/VC1 Lizenzinformation.

Man sollte nicht einfach 'dd' verwenden um die komplette RPI SD zu kopieren: Selbst 'gleich-große' SD desselben Herstellers/Typs müssen nicht immer exakt dieselbe Anzahl von Sektoren haben. Außerdem kann es vorkommen, daß SD/USB Adapter weniger Sektoren zur Verfügung stellen als der MMC Adapter. Die raspian Installation nutzt aber die SD Karte bis auf den letzten Sektor. Wenn man solch eine Installation auf eine SD Karte mit nur einem Sektor weniger mit dd kopiert kann man davon nicht mehr booten.

Man kann mit einigem Aufwand die Linux Partition auf dem RPI etwas kleiner machen (ca. 95%) als die SD-Karte um einfach mit 'dd' zu kopieren, aber einfacher ist es, mit rpi-clone zu kopieren.

Information

https://github.com/billw2/rpi-clone

Download

cd /data/installfiles
wget https://github.com/billw2/rpi-clone/archive/master.zip
unzip -x master.zip
rm master.zip
cd rpi-clone-master

Damit man rpi-clone bei laufenden VDR client funktioniert, muß man sicherstellen, das in den RSYNC_OPTIONS "x" enthalten ist, ansonsten kopiert rpi-clone die NFS gemounteten Verzeichnisse des VDR servers:

Rpi-clone mit Editor der Wahl modifizieren:

RSYNC_OPTIONS="--force -rxltWDEgopt"
                         ^

Installieren

sudo cp rp-clone /usr/local/sbin

Benutzen

Zweite, ausreichend große SD Karte via USB Adapter an den RPI anschließen. Kontrollieren, daß die Karte erkannt wird:

ls /dev/sd*
/dev/sda  /dev/sda1 

Wenn die Karte noch keine Kopie der VDR installation enthält:

sudo rpi-clone -f sda

Wenn man eine existierende Kopie aktualisieren will:

sudo rpi-clone sda

Dies geht schneller, weil nur inkrementell kopiert wird. Es wird aber nicht mehr die DOS-Partition kopiert. Wenn man dort Änderungen vorgenommen hat, dann muß man die leider händisch übertragen.

Leider braucht es in der jetzigen Version noch zwei fixes.

sudo mkdir /mnt/sda2
sudo mount /dev/sda2 /mnt/sda2
sudo chown pi /mnt/sda2/srv/vdr/video
sudo rm /mnt/sda2/var/swap
sudo umount /mnt/sda2

Nach dem kopieren RPI herunterfahren, Kopie in den SD Slot einlegen und verifizieren, daß die Kopie funktioniert.

Clonen

Wenn man ene Kopie der VDR Clientinstallation auf einem weiteren RPI laufen lassen will, dann muß man nach dem kopieren alle Parameter anpassen, die auf dem neuen RPI anders sein sollen wie auf dem ersten.

sudo mkdir /mnt/sda1 /mnt/sda2
sudo mount /dev/sda1 /mnt/sda1
sudo mount /dev/sda2 /mnt/sda2
  • Hostname
    • Editieren in /mnt/sda2/etc/hostname
  • IP-adresse (wenn statisch vergeben)
    • Editieren in /mnt/sda2/etc/network/interfaces
  • MPEG/VC1 Lizenzen
  • Editieren in /mnt/sda1/config.txt, aber wahrscheinlich einfacher nachdem man den neuen RPI gebootet hat, damit man einfach die Seriennummer auslesen kann.

Anschließend die Kopie unmounten:

 umount /mnt/sda1 /mnt/sda2

Und im zweiten RPI ausprobieren.

Lebensdauer der SD verbessern

Die Lebensdauer von SD-Karten ist vor allem durch die Anzahl an Schreibzyklen geprägt. Angeblich haben ältere 'gen mlc' flash 10k Schreibzyklen, neuere 'tlc' flash 1k Schreibzyklen pro Speicherstelle [1]. Es wird aber beim mehrfachen Beschreiben eines 'sektors' auf einer guten SD Karte nicht immer derselbe physikalische Speicherbereich auf der SD beschrieben, stattdessen versucht die "wear level management" software auf der SD Karte, die rechner-sichtbaren Sektoradressen dynamisch bei Schreibvorgängen so auf die physikalischen Adressen der SD abzubilden, daß alle Sektoren möglichst gleichmäßig und wenig beschrieben werden [2].

Dazu muß diese SD software wissen, welche Sektoren 'unbenutzt' sind, so daß diese Sektoren neu zugeordnet werden können. Ext4 und andere neuere filesystem (nicht ext2, ext3) erlauben dem Speichermedium via "TRIM" Befehle mitzuteilen, welche Sektoren unbenutzt sind.

Geht nicht ? Hdparm

Leider ist nicht klar, ob dies mit dem SD karten treiber im RPI wirklich funktioniert und etwas bewirkt: Das Standardprogramm um festzustellen welche Features das Speichermedium unterstützt ist hdparm:

# Auf einer echten SSD:
sudo hdparm -I 
hdparm -I /dev/sda | grep TRIM
          *    Data Set Management TRIM supported (limit 8 blocks)
          *    Deterministic read data after TRIM

Auf dem RPI SD MMC treiber (/dev/mmcblk0) scheint der Befehl nicht unterstützt zu sein und und wenn man eine SD via USB Adapter mounted, wurden bisher keine erfolgreiche Bestimmung von TRIM support gemeldet (bitte hier ändern, wenn doch).

Geht nicht ? Smartmontools

Für SSD und "normalen" Festplatten gibt es die "smartmontools" mit denen man Statusinformationen von Festplatten auslesen kann ("smartctl -a <device>"). Leider scheint dies auf SD nicht zu funktionieren, und auch sonst sind auch keine Möglichkeiten bekannt um effektiv die verbleibende "Lebensdauer" einer SD-Karte zu bestimmen. [ Bitte dieses Wiki anpassen, wenn welche bekannt sind]. Deswegen sind die folgenden Optimierungen potentiell unnötig weil die SD Karte vielleicht auch ohne diese Verbesserungen länger lebt als der RPI oder es einfacher ist, einfach die SD-Karte alle paar Jahre gegen eine neue auszutauschen.

Schreibzyklen durch Filesystemzugriffe minimieren

Durch Editieren von /etc/fstab wie folgt:

# /etc/fstab
...
/dev/mmcblk0p2  /    ext4 defaults,noatime,nodiratime,discard,errors=remount-ro  0       1

Noatime bewirkt, dass man lesenden zugriff auf Dateien die "acces time" im Dateissytem nicht aktualisiert wird. Dies spart viele Schreibzugriffe auf die Metadaten im Dateisystem. Nodiratime bewirkt dasselbe für Lesezugriffe auf Verzeichnisorder. Discard bewirkt, dass das ext4 Dateisystem versucht dem Speichergerät über TRIM Befehle mitzuteilen, welche Sektoren frei sind. Errors=remount-ro bewirkt daß im Fehlerfall keine weiteren Schreibzugriffe auf das Dateisystem passieren.

Nach diesen Änderungen rebooten.

Das Kommando mount zeigt an, mit welchen Optionen die Dateisysteme gemounted sind um die Resultate zu kontrollieren:

# mount
/dev/root on / type ext4 (rw,noatime,nodiratime,discard,data=ordered)

Explizites trimming

Um explizit TRIM Befehle an das Dateissytem abzusetzen kann fstrim verwendet werden.

# sudo fstrim -v /
/: 12345678 bytes were trimmed

Dabei wird angezeigt, wieviele Sektoren dem Speichermedium als frei gemeldet werden. Wenn die option 'discard' beim mounten gesetzt ist, dann werden anscheinend beim ersten mal fstrim alle beim booten freien Sektoren gemeldet, aber bei weiteren Aufrufen von fstrim keine weiteren, weil das Ext4 filesystem wegen der discard Option freiwerdende Sektoren immer automatisch meldet. Statt discard in /etc/fstab zu verwenden könnte man also auch periodisch fstrim über einen cron Befehl absetzen. Dies wird bei größeren SSDs auf Serversystem häufig als die performantere Lösung empfohlen, ist wahrscheinlich aber bei einem client-VDR eine unnötig komplexe und vernachlässigbare Optimierung gegenüber discard.

Ermitteln der tatsächlichen Schreibzugriffe

Um die tatsächliche Anzahl an Schreibzugriffen auf der SD zu ermitteln:

iostat

Linux 3.12.35+ (raspi)     07.01.2015      _armv6l_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          3,28    2,93   14,16    0,54    0,00   79,10

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
mmcblk0           3,15        72,78      1897,40      83297    2171588

Die angezeigte Zahl sind die Schreibzugriffe seit Reboot. Angenommen auf einer 8GByte SD sind noch 2.5GByte frei und werden effektiv für einfaches dynamic wear-level management verwendet, dann sind bei 2.2GByte (2200000 KByte) pro Tag nach 3 Jahren 1000 Schreibzyklen pro Zelle erreicht.

2.5GByte * 1000 / 3 / 365 = 2.2 GByte/tag

Ermitteln der Dateien

Um zu ermitteln, welche Dateien aktiv beschrieben wurden am besten 48 Stunden nur normalen Betrieb fahren (also kein Debugging, installation, etc..):

find / -xdev -ctime 1 -print

Dies zeigt alle Dateien die in den letzten 24 Stunden verändert wurden.

Den größten Teil der Schreibzugriffe im client-VDR sind wahrscheinlich die log dateien in /var/log und die VDR EPG Datei /var/cache/vdr/epg.data.

Um die Menge der Schreibzugriffe durch syslog zu reduzieren gibt es eine Reihe von Möglichkeiten, die hier nur angedeutet werden:

Alle Syslog Ausgagen auf eine datei leiten, alle anderen Ausgaben unterdrücken. Damit wird jede Logmeldung nur einmal, statt in der dfaultkonfiguration mehrfach geschrieben. In /etc/rsyslogd.conf:

*.*        /var/log/syslog
# ... alle anderen Dateien auskommentieren

Syslog auf den VDR Server umleiten.

Syslog auf ein tmpfs lenken.

Swap

In der Standardinstallation des RPI wird eine Datei als swap angelegt, /var/swap. Wenn diese verwendet wird, dann erzeugt diese Schreibzyklen. Dies sollte aber im VDR Clientbetrieb nie der Fall sein. Deswegen sollte es sich nicht lohnen, diese swap-Datei zu entfernen, da der Swapspace bei Installation/Entwicklung/Debugging evtl. gebraucht wird. Um zu kontrollieren ob der Swapspace nicht verwendet wird:

# swapon -s
Filename                                Type            Size    Used
Priority
/var/swap                               file            102396   0    -1

Der used Wert muß 0 sein, wenn seit Reboot nur normaler VDR Betrieb stattgefunden hat.

TODO: Beschreibung wie die Swapdatei entfernt wird (hoffentlich nicht notwendig).

Journal

Eine zweite Option zur weiteren Optimierung der Schreibzugriffe ist das 'journal' des Ext4 Dateisystems. Dieses journal sorgt dafür, daß das Dateissytem auch nach Absturz korrekt ist, und beim Rebooten kein langer Filesystemcheck durchgeführt werden muß. Gerade wenn man den RPI evtl. durch den Benutzer unkontrolliert ausschalten lassen will sollte man das Journal nicht entfernen. Selbst wenn man weiß daß der RPI immer kontrolliert rebooted wird, werden nicht viele Schreibzyklen gespart: In der Standardinstallation (data=ordered für das Dateissytem) werden nur die Metadaten bei Schreibzugriffen doppelt, also durch das Journal geschrieben, nicht aber die eigentlichen Dateiinhalte, und diese stellen im VDR Clientbetrieb den überwiegenden Teil der Schreibzugriffe dar.

Wenn man das Journal vom Root-Dateissytem entfernen will muß man die SD als zusätzliche SD (eg: via USB) anschließen, da sich das Journal nur bei ungemounteten/ro-gemounteten Dateissytem entfernen läßt, und beides ist für das Root-Dateissytem nicht möglich. Beispiel:

# Mounte Ziel-SSD per USB, dann entferne journal
sudo tune2fs -O ^has_journal /dev/sda2
fsck /dev/sda2

Links

  1. [1]
  2. [2]

Danksagungen

Hiermit möchte ich mich bei allen Bedanken die mir bei meinem Problemen, Fragen etc. weitergeholfen haben. Insbesondere bedanke ich mich bei:

  1. VDR-Portal
  2. kls
  3. johns
  4. fnu
  5. copperhead
  6. seahawk1986
  7. mini73
  8. TheChief
  9. UFO
  10. CKone
  11. utility
  12. louis
  13. reufer
  14. gda
  15. decembersoul
  16. tehlers
  17. vectra130
  18. argus

Linksammlung

  1. Webseite Raspberry Pi
  2. Raspberry Pi Forum
  3. Video Disk Recorder
  4. VDR FTP-Server
  5. VDR Portal
  6. Plugins and Patches for VDR-to-VDR streaming
  7. Putty
  8. Rpihddevice-plugin
  9. Streamdev Plugin
  10. Svdrpservice-plugin
  11. Remotetimers-plugin
  12. Epgsync-plugin

Kategrorien