USB Festplatte in Standby versetzen

Aufgabe ist es die Lebenszeit einer externen Festplatte zu verlängern, indem wir Sie nach einiger Zeit runter fahren.

Dazu brauchen wir das HDParm Tool, mit dem wir die Werte in der Festplatte setzen können. Ist HDParm noch installiert, so machen wir jetzt.

sudo apt install hdparm

Jetzt können wir die Festplatte sofort in Standby setzt.

sudo hdparm -y /dev/sda

Soll die Festplatte automatisch nach 50 Sekunden runter fahren, können wir den Parameterwert -S 10 setzen (10 * 5 Sekunden = 50 Sekunden). Möglich Werte sind von 1 bis 240. Die Einstellung sind nicht statisch und müssen nach einem Neustart wieder gesetzt werden.

sudo hdparm -S 10 /dev/sda

Wir können den Status der Festplatte prüfen.

sudo hdparm -C /dev/sda

Mit einer UDev-Regel können wir die Werte für die USB Festplatte nach dem Anstecken automatisch setzen.

sudo vim /etc/udev/rules.d/50-hdparm.rules

ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", RUN+="/usr/bin/hdparm -B 127 -S 120 /dev/%k"

Der Parameter -B 127 aktiviert das Energiemanagement der Festplatte. Der Parameter -S setzt den Timeout-Wert von 10 Minuten (120*5 Sekunden).

Die UDev-Regeln müssen neu geladen werden.

sudo udevadm control --reload-rules
sudo udevadm trigger

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.

Als Client Anwendung für den Zugriff auf TVheadend gibt es unterschiedliche Plugins.

Ubuntu enthält im Repository den Kodi Mediaplayer und das Plugin für TVheadend.

sudo apt install kodi kodi-pvr-hts

Die Einstellung der IP-Adresse für Tvheadend ist nicht einfach zu finden.

Add-ons > PVR clients | All > Tvheadend HTSP Client > Enable + Configure

Die Sprache, Tastatur und Zeitzone kann man in Kodi auch ändern.

Settings > Interface settings > Regional > Language, Keyboard layouts, Timezone

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