Raspberry Pi als Videorekorder

In diesem Projekt wollen wir mit Hilfe von einem Raspberry Pi und einem DVB Stick einen Videorekorder aufbauen. Ich beschreibe die Installation mit einem Terratec Cinergy HTC USB XS HD, der sich heute noch bei Kabel (DVB-C) eignet. Es gibt viele andere DVB USB Sticks, welche sich auch dafür eignen. Eine externe Festplatte mit USB Anschluss dient als Speichermedium.

Als Betriebssystem verwenden ich Raspbian oder Ubuntu Server für den Raspberry Pi.

TVheadend 4.0.8 Raspbian Light
TVheadend 4.2.3 Ubuntu Classic Server 16.04

Nach dem Download sollte das Image entpackt und auf eine SD Karte kopiert werden.
Die SD Karte wird im Raspberry Pi eingesetzt und gestartet. Nach dem Start sollten die aktuellen Updates und Patches installieren werden.

sudo apt update
sudo apt dist-upgrade

Für den Betrieb von dem DVB Stick brauchen wir noch die Firmware und den Kernel 4.4 oder größer.

cd /lib/firmware/
sudo wget https://github.com/OpenELEC/dvb-firmware/raw/master/firmware/dvb-usb-terratec-htc-stick-drxk.fw

Das Update vom Kernel ist schnell gemacht.

sudo apt install rpi-update
sudo rpi-upgrade
sudo reboot
uname -a

Sollte es Probleme geben, dann kann man hiermit die Fehler suchen.

lsusb
dmesg

Unseren Server wollen wir mit eine festen IP Adresse betreiben und nicht per DHCP.

sudo vim /etc/network/interfaces

auto eth0
iface eth0 inet static
  address 192.168.187.100
  netmask 255.255.255.0
  gateway 192.168.187.1
  dns-nameservers 192.168.187.1

Den DHCP Dienst können wir stoppen und deaktivieren.

sudo service dhcpcd stop
sudo systemctl disable dhcpcd

Für den Betrieb als Headless-Server ist SSH notwendig.

sudo apt install openssh-server
sudo systemctl start ssh
sudo systemctl enable ssh
sudo touch /boot/ssh

Weitere Einstellung wie Hostname, Ländereinstellung, Tastatur kann man einfach mit dem Konfig-Tool vornehmen.

sudo raspi-config

Diese Tools helfen uns beim Betrieb weiter.

sudo apt install vim htop iotop iftop

Das Swap-File kann man ausschalten und deinstallieren.

sudo dphys-swapfile swapoff
sudo apt purge dphys-swapfile

Wenn die USB Festplatte mit dem NTFS Dateisystem verwendet wird, dann ist die Installation von extra Tools notwendig.

sudo apt install ntfs-3g

Für die Einbingung ist eine Eintragung in der Konfig „fstab“ notwendig.

sudo vim /etc/fstab

/dev/sda1 /media   ntfs  defaults,uid=hts,umask=0022,nosuid,nodev,noexec   0  0

Jetzt erfolgt die Installation von TVheadend.

curl http://apt.tvheadend.org/repo.gpg.key | sudo apt-key add -
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 379CE192D401AB61

sudo apt-get install apt-transport-https

Bei Rasbian wird diese Einstellung verwendet.

sudo sh -c 'echo "deb https://dl.bintray.com/tvheadend/deb jessie release" > /etc/apt/sources.list.d/tvheadend.list'

Bei Ubuntu Server 16.04 wird diese Einstellung verwendet.

sudo sh -c 'echo "deb https://dl.bintray.com/tvheadend/deb xenial release-4.2" > /etc/apt/sources.list.d/tvheadend.list'

sudo apt update
sudo apt install tvheadend

Das Login und Password ist für den Betrieb notwendig.

http://192.168.178.100:9981/

Der Rest der Einrichtung erfolgt per Web-Interface und ist hier beschrieben.

Der Zugriff auf die Kanalliste vom Live Stream mit VLC erfolgt über die Url.

http://login:passwort@192.168.187.100:9981/playlist/channels

Noch ein Hinweis für die Senderlogos. Leider ist die Einrichtung sehr schlecht beschrieben. Hier meine Konfiguration unter dem Menü „Configuration / General / Base / Picon“.

Channel icon path: picon://%C.png
Picon path: file:///home/pi/logos/

Das User Icon lautet dann zum Beispiel „picon://Das_Erste.png“ und „picon“ wird durch den Path ersetzt zu „file:///home/pi/logos/Das_Erste.png“.

Die Senderlogos findet man im Internet.

Laufzeit von Zertifikaten mit Check_MK prüfen

Mit diesem BASH Script kann man SSL Zertifikate im PEM Format mit Hilfe von Check_MK Monitoring überprüfen. Dazu erstellen Sie das Script im Verzeichnis /usr/lib/check_mk_agent/local/. Der Check prüft die Laufzeit der Letsencrypt Zertifikate.

vim /usr/lib/check_mk_agent/local/check_certificates.sh

#!/bin/bash
# Plugin Return Codes
# = 0   OK
# = 1   Warning
# = 2   Critical
# = 3   Unknown
#
DIR=/etc/letsencrypt/live/*/
FILTER=$DIR/cert.pem
 
function output {
 NAME=$(basename $1)
 DATE=$(date --date="$2" --iso-8601)
 SUBJECT=$3
 
 TODAY=$(date +%s)
 DATE_I=$(date -d ${DATE} +%s)
 EXPIRATION=$((15 * 24 * 60 * 60)) # 15 days
 
 if [[ -z $SUBJECT ]] ; then
  STATUS=3
  STATUS_TEXT="UNKNOWN"
  TEXT="Empty subject value"
 elif [ ${TODAY} -gt ${DATE_I} ] ; then
  STATUS=2
  STATUS_TEXT="CRITICAL"
  TEXT="Certificate has expired since ${DATE}"
 elif [[ $(expr $TODAY + $EXPIRATION) -gt ${DATE_I} ]] ; then
  STATUS=1
  STATUS_TEXT="WARNING"
  TEXT="Certificate will expire on ${DATE}"
 else
  STATUS=0
  STATUS_TEXT="OK"
  TEXT="Certificate will expire on ${DATE}"
 fi
 
 echo "${STATUS:-1} Certificate_${SUBJECT} Date=${DATE}; Check(${STATUS_TEXT}) - ${TEXT} - ${SUBJECT}"
}
 
function check {
 FILE=$1
 DATE=$(cat ${FILE} |openssl x509 -noout -enddate|cut -d= -f2-)
 SUBJECT=$(cat ${FILE} |openssl x509 -noout -subject|cut -d= -f3-)
 output "$FILE" "$DATE" "$SUBJECT"
}
 
for FILE in $FILTER;
do
  # take action on each certificate file.
  check "$FILE"
done

Zertifikatsdateien umwandeln

Es gibt unterschiedliche Dateiformate für ein Server-Zertifikat. Hier eine List von möglichen Umwandlungen.

Konvertiert eine DER Datei (.crt .cer .der) in PEM

openssl x509 -inform der -in certificate.cer -out certificate.pem

Konvertiert eine PEM Datei in DER

openssl x509 -outform der -in certificate.pem -out certificate.der

Konvertiert eine PKCS#12 Datei (.pfx .p12) in PEM

openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes

PKCS#12 enthält den privaten Schlüssel und das Zertifikat. Sie können mit dem Parameter -nocerts nur den privaten Schlüssel oder mit Parameter -nokeys nur das Zertifikat speichern.

Konvertiert ein PEM Datei und den privaten Schlüssel zu PKCS#12 (.pfx .p12)

openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

Laufzeit von einem Zertifikat prüfen

Wer einen Server mit TLS/SSL Verschlüsslung betreibt, der muss dafür ein Zertifikat mit einer begrenzten Laufzeit erstellen. Das Zertifikat muss vor dem Ende der Laufzeit ersetzt werden, sonst gibt es Fehlermeldungen im Browser. Hier möchte ich einige Beispiel zeigen, wie man die Laufzeit überprüfen kann.

Hiermit können wir uns die Lautzeit ausgeben lassen.

echo Q | openssl s_client -connect www.google.com:443 2>/dev/null | openssl x509 -noout -dates

Hier geben wir uns nur das Laufzeitende vom Zertifikat aus.

date --date="$(echo Q | openssl s_client -connect www.google.com:443 2>/dev/null | openssl x509 -noout -enddate |cut -d= -f 2)" --iso-8601

Wir können auch alle Zertifikate speichern.

echo Q | openssl s_client -connect www.google.com:443 -showcerts > chain.pem

Auch hier kann man sich das Datum ausgeben lassen.

gawk 'BEGIN { pipe="openssl x509 -noout -subject -dates -serial "} \
  /^-+BEGIN CERT/,/^-+END CERT/ { print | pipe }
  /^-+END CERT/                 { close(pipe); printf("\n")}  ' chain.pem

Wir wollen jetzt nur das Server Zertifikat extrahieren und noch einmal prüfen, ob es wirklich zu der CA valide ist.

sed -n '/-BEGIN/,/-END/p;/-END/q' chain.pem > site.pem
openssl verify -verbose -CAfile chain.pem site.pem
cat site.pem |openssl x509 -noout -enddate

Befindet man sich hinter einem Proxy Server, braucht das Programm „proxytunnel“.

proxytunnel -p yourproxy:8080 -d www.google.com:443 -a 7000
openssl s_client -connect localhost:7000 -showcerts

WebDav mount im Dateisystem

Unter Linux kann man ein WebDav im Dateisystem einbinden und damit direkt Datei speichern. Einige Cloud Speicheranbieter bieten die Möglichkeit von WebDav an.

sudo apt install dav2fs

Nach der Installation sollten wir noch einige Parameter ändern. Zuerst die Mount Einstellungen.

sudo vim /etc/fstab

https://webdav.hidrive.strato.com/ /mnt/hidrive/ davfs noauto,user,rw 0 0
https://webdav.mediencenter.t-online.de/ /mnt/t-online/ davfs noauto,user,rw 0 0

Dann die Zugangsdaten für WebDav bei Beispeil von HiDrive und T-Online Mediencenter.

sudo vim /etc/davfs2/secrets

/mnt/hidrive/ benutzer passwort
/mnt/t-online/ benutzer@t-online.de passwort

Hier noch einige Einstellung für Dav2fs.

sudo vim /etc/davfs2/davfs2.conf

use_locks 0
cache_size 1
table_size 4096
gui_optimize 1
trust_server_cert /etc/davfs2/certs/hidrive.pem

Kommt es zu einem Fehler, so muss das Zertifikat hinterlegt werden.

/sbin/mount.davfs: wir trauen dem Zertifikat nicht
/sbin/mount.davfs: das Einhängen schlug fehl;
Server certificate verification failed: issuer is not trusted

echo|openssl s_client -connect webdav.hidrive.strato.com:443 |openssl x509 -out /etc/davfs2/certs/hidrive.pem

USB Kamera Streamer

Wir wollen eine USB Webcam oder die RaspberryPi Kamera welche unter /dev/video0 bereit steht, im Netzwerk als Stream bereitstellen.

sudo apt-get update
sudo apt-get install build-essential libjpeg-dev imagemagick subversion libv4l-dev checkinstall

Quellcode herunterladen und kompilieren

svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
cd mjpg-streamer/mjpg-streamer
make USE_LIBV4L2=true
VERSION=$( sed -n '/SOURCE_VERSION/s/^.*"\(.*\)".*$/\1/gp' < mjpg_streamer.h )
REVISION=$( svnversion -cn | sed "s/.*://" )
sudo checkinstall --pkgname=mjpg-streamer --pkgversion="$VERSION+$REVISION~checkinstall" --default

MJPG-Streamer kann nun auf der Kommandozeile gestartet werden.

export LD_LIBRARY_PATH=/usr/local/lib
mjpg_streamer -i "/usr/local/lib/input_uvc.so -d /dev/video0 -f 15 -r 640x480" -o "/usr/local/lib/output_http.so -p 8090 -w /usr/local/www -c benutzername:passwort"

MJPG-Streamer

Raspberry Pi Zeitraffer Aufnahmen

Dieser kurze Beitrag beschreibt nicht die Installation der Kamera, sondern nur die Zeitraffer-Aufnahmen.

Mit dem Befehl lassen sich über einen definierten Zeitraum in bestimmten Zeitabständen Bilder aufnehmen:

raspistill -o img_%04d.jpg -tl 5000 -t 36000

Das Kommando ist aus mehreren Befehlen zusammengesetzt

Der Parameter -o definiert den Speicherort und den Dateinamen des Bildes. Es benennt die aufgenommenen Bilder mit einer fortlaufenden 4-stelligen Zahl.

Der Parameter -tl 5000 definiert die Zeitabstände zum Aufnehmen der Fotos, alle 5 Sekunden wird ein Bild erstellt.

Der Parameter -t 36000 definiert die Zeitdauer, wie lange das Programm laufen soll.

Die Zeitraffer-Aufnahmen stellen eine Vielzahl an einzelnen Bildern dar, die auch in ein Video zusammengeführt werden können. Dafür verwendet ihr den Befehl, um den Film video.mp4 zu erstellen.

ffmpeg -qscale 5 -r 4 -b 9600 -i img_%04d.jpg video.mp4

Raspberry Pi Kamera als Stream Server

Bei diesem Projekt verwende ich eine Raspberry Pi Kamera als Stream Server. Das Betriebssystem ist Rasbian Jessy Lite.

Mit Raspberry Konfig haben wir das Kamera Modul aktiviert.

sudo raspi-config

Ein erster Snapschuss sollte schon jetzt möglich sein.

raspistill -o /tmp/snapshot.jpg

Jetzt können wir die Installation starten.

Zuerst die PublicKey für Apt-Get hinzufügen.

curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -

Die Installationsquellen für Apt-Get hinzufügen.

sudo sh -c 'echo "deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ jessie main" > /etc/apt/sources.list.d/uv4l.list'

Jetzt kann die Installaion starten.

sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam uv4l-raspicam-extras

Der Dienst sollte jetzt laufen.

sudo service uv4l_raspicam status

oder man kann das Device /dev/video0 mit dem Programm uv4l erstellen.

uv4l --driver raspicam --auto-video_nr --width 640 --height 480 --encoding jpeg

Jetzt erstellen wir ein Foto in /tmp/snapshot.jpg.

dd if=/dev/video0 of=/tmp/snapshot.jpg bs=11M count=1

Jetzt kann man Motion oder einen anderen StreamServer verwenden.

Wir verwenden einen WebRTC StreamServer.

sudo apt-get install uv4l-webrtc

Mit VLC oder dem Firefox kann man sich den Stream ansehen.

vlc http://raspberrypi:8080/stream/video.mjpeg

Motion bietet sehr viel mehr, wie eine Bewegungserkennung und Alarm.

sudo apt install motion

Es gibt auch eine Beispielkonfiguration.

wget http://linux-projects.org/downloads/examples/motion.conf

Jetzt können wir Motion starten.

LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion -c /home/pi/motion/motion.conf

Im Webbrowser kann unter der Adresse http://raspberrypi:8081/stream.mjpg die Kamera aufzurufen.

Die LED an der Kamera lässt sich deaktivieren, indem der Eintrag disable_camera_led in der Konfig Datei gesetzt wird.

sudo sh -c 'echo "disable_camera_led=1" >> /boot/config.txt'

Weitere Informationen zur UV4L Installation.

Swap Partition mit Kompression

Wird in Linux nicht ausreichend RAM bereit gestellt, so besteht die Möglichkeit diesen mit eine Swap Partion zu erweitern. Zusärtlich kann man die Daten in dem Swap komprimieren.

Dazu instellieren wir zRAM-config.

sudo apt-get install zram-config

Der Dienst braucht ein Kernelmodul „zram“ und „lz4_compress“

sudo modprobe zram

Jetzt sollte das Modul geladen sein.

lsmod |grep zram

zram                   28672  4
lz4_compress           16384  1 zram

Sollte es nicht geladen werden können, weil das Kernel Modul nicht installiert ist, dann müssen noch die Extras installiert werden.

sudo apt-get install linux-image-extra-`uname -r`

Nach einem Neustart sollte der Dienst ohne Fehler laufen.

sudo service zram-config status

Die Anzeige vom Swap sieht jetzt so aus.

sudo swapon --show

NAME       TYPE      SIZE USED PRIO
/dev/sda5  partition 510M   0B   -1
/dev/zram0 partition 124M 976K    5
/dev/zram1 partition 124M 972K    5
/dev/zram2 partition 124M 968K    5
/dev/zram3 partition 124M 972K    5

Entfernen aller Pakete, die von dpkg mit rc markiert sind

Es gibt einen signifikanten Unterschied zwischen Apt remove oder purge. Apt (dpkg) remove entfernt nur die Paket-Binärdateien. Die Konfigurationsdateien des Pakets werden nicht gelöscht. Solche Pakete haben normalerweise den Zustand rc.

Mit dpkg können Sie den Status aller Pakete anzeigen.

dpkg --list |grep "^rc"

Was bedeutet „rc“? Dieser Zustand bedeutet, dass die Konfigurationsdateien noch nicht entfernt wurden, sondern nur die Binärdateien.

Rc entspricht…

R: Die Binärdateien wurde zur Entfernung markiert.
C: Die Konfigurationsdateien sind weiterhin vorhanden.

Lassen Sie uns die Pakete extrahieren, welche mit „rc“ markiert sind.

dpkg --list |grep "^rc" | cut -d " " -f 3

Nun entfernen wir alle Pakete, die als rc markiert sind.

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs sudo dpkg --purge