Zum Inhalt

Kategorie: Linux

Raspberry Pi Distro Update

Mein etwas in Jahre gekommener Raspberry Pi hat seit einiger Zeit keine Updates mehr bekommen. Auch wenn auf dem System nur noch FHEM und ein Pi-hole (in Docker) laufen, sind (Sicherheits-) Updates nicht unwichtig. Ein Blick auf die Infoseite zu Debian LTS bestätigte dann, mein raspbian auf Basis von Jessie (8) bekommt keinen Support mehr. Leider ist ein direktes Update von Jessie (8) auf Buster (10) nicht möglich bzw. nicht sinnvoll. Daher ist ein Zwischenschritt auf Stretch (9) notwendig. Im Endeffekt dauert es nur alles etwas länger, die Schritte für die Updates sind identisch. Vorab hab ich ein Backup der SD Karte mit Win32DiskImager gemacht; für alle Fälle.

Update Jessie auf Stretch:

sudo sed -i /deb/s/jessie/stretch/g /etc/apt/sources.list
sudo sed -i /deb/s/jessie/stretch/g /etc/apt/sources.list.d/*.list
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get autoremove
sudo apt-get autoclean
sudo reboot

Das hat sogar komplett problemlos geklappt. Bei Update von Stretch auf Buster kam dann aber ein kleines Problem dazwischen:

sudo sed -i /deb/s/stretch/buster/g /etc/apt/sources.list
sudo sed -i /deb/s/stretch/buster/g /etc/apt/sources.list.d/*.list
sudo apt-get update

sudo apt-get upgrade
# Hier funktionierte nun apt-listchanges nicht mehr, wegen einem fehlenden Python Paket: debconf
sudo apt-get remove apt-listchanges
sudo apt-get upgrade # neuer Versuch
sudo apt-get dist-upgrade

# debconf wieder manuell installieren
wget http://ftp.de.debian.org/debian/pool/main/d/debconf/debconf_1.5.61_all.deb
sudo dpkg -i debconf_1.5.61_all.deb

sudo apt-get autoremove
sudo apt-get autoclean
sudo reboot

Das zweite Update hat deutlich länger gedauert, aber letztendlich auch funktioniert. Hier das Ergebnis:

pi@raspberrypi:~ » cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

Pi-hole mit docker-compose

Auf einem Raspberry Pi oder einem anderen System mit einem Docker Daemon lässt sich Pi-hole sehr leicht betreiben. Hier das dazugehörige docker-compose.yml:

version: "3"
services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "8000:80/tcp"
      - "8443:443/tcp"
      - "5353:53/tcp" 
      - "5353:53/udp" 
      - "192.168.1.130:53:53/tcp"
      - "192.168.1.130:53:53/udp"
    environment:
      TZ: Europe/Berlin
      WEBPASSWORD: hierEinPasswortEintragen
      DNS1: 46.182.19.48
      DNS2: 80.241.218.68
      ServerIP: 192.168.1.130
      VIRTUAL_HOST: pihole.fritz.box
    volumes:
       - './etc-pihole/:/etc/pihole/'
       - './etc-dnsmasq.d/:/etc/dnsmasq.d/'
    dns:
      - 127.0.0.1
      - 46.182.19.48
    cap_add:
      - NET_ADMIN
    restart: unless-stopped

Angepasst werden müssen die IP Adresse (hier 192.168.1.130), VIRTUAL_HOST und am besten auch WEBPASSWORD. Die beiden hinterlegten DNS Server gehören zu dismail.de bzw. digitalcourage.de. Über Port 8000 ist dann die Weboberfläche erreichbar. Die IP Adresse des Docker Hosts stellt dann via Port 53 Pi-hole für DNS Anfragen bereit.

Via Telegram über SSH Logins informieren

Über die Telegram API kann man sich bequem benachrichtigen lassen, wenn sich ein Benutzer per SSH auf einem System eingeloggt hat. Dazu folgende Zeilen in die Datei /etc/ssh/sshrc einfügen.

IP=`echo $SSH_CONNECTION | cut -d " " -f 1`
HOSTNAME=`hostname`
MESSAGE="SSH Login on $HOSTNAME as $USER from $IP"
curl --output /dev/null -s -X POST -H 'Content-Type: application/json' -d "{\"chat_id\": \"-123456789\", \"text\": \"$MESSAGE\", \"disable_notification\": true}" https://api.telegram.org/bot123456789:hgDW0mvUcio_AF4Za1nh-aY7PX/sendMessage

Wie an die Chat ID und das Token für den Bot zu kommen ist, ist z.B. hier beschrieben.

Aktuelle Go Version in der Ubuntu Bash (WSL) installieren

Eigentlich ganz einfach: Runterladen, entpacken und in /usr/local verschieben.

# download current version (1.13.3)
mkdir golang-update
cd golang-update
wget https://dl.google.com/go/go1.13.3.linux-amd64.tar.gz
tar xvzf go1.13.3.linux-amd64.tar.gz

# remove old version
sudo rm -rf /usr/local/go

# move new version in place
sudo mv go /usr/local

# set GOPATH and add folders to PATH
export GOPATH=$HOME/go
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin

# run go version
go version

# result: go version go1.13.3 linux/amd64

PDF Dateien verkleinern mit Ghostscript

Es gibt haufenweise kommerzielle Produkte, die PDF Dateien verkleinern. Es geht aber auch kostenlos sehr einfach. Nur auf eine schicke GUI muss man verzichten. Unter Linux (in meinem Fall Ubuntu 18.04 LTS unter Windows 10) geht das sehr, sehr einfach.

  1. Installation von Ghostscript und wget:
    sudo apt-get install ghostscript wget
  2. Download von Shrinkpdf:
    wget http://www.alfredklomp.com/programming/shrinkpdf/shrinkpdf.sh
  3. Und jetzt lassen sich bequem PDF Dateien verkleinern:
    ./shrinkpdf.sh my_large_file.pdf my_small_file.pdf 200
    

    Hinweis: An der Qualität (hier 200) lässt sich drehen, um die gewünschte Größe oder Qualität zu erreichen.

  4. Wenn jetzt noch mehrere PDFs zusammengefügt werden sollen, hilft wieder Ghostscript:
    gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=single.pdf -dBATCH first.pdf second.pdf

ffmpeg unter Raspbian 8 Jessie installieren

Ob wirklich Raspbian 8 (Jessie) benutzt wird, kann so überprüft werden:

cat /etc/os-release

Die folgenden Befehle fügen das Jessie Backports Repository hinzu und installieren anschließend ffmpeg:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B48AD6246925553
echo 'deb http://httpredir.debian.org/debian jessie-backports main contrib non-free' | sudo tee -a /etc/apt/sources.list.d/jessie-backports.list
sudo apt-get update
sudo apt-get install ffmpeg

Fertig. 🙂

SD Karte vom Raspberry Pi auf kleinere SD Karte klonen

Folgende Situation: Die 16GB SD Karte in meinem Raspberry Pi zickt in letzter Zeit regelmäßig wegen defekten Sektoren rum. Diverse Programme starten z.B. nicht mehr und mussten erneut installiert werden. Ärgerlich. Da ich zusätzlich noch einen 32GB USB Stick angeschlossen haben und auch ein NAS im Netzwerk zur Verfügung steht, dachte ich mir, ersetze ich die alte 16GB SD Karte einfach durch eine neue. Leider ist die neue SD Karte ein paar wenige MB kleiner als die alte, daher war eine einfache Prozedur à la Image erstellen (entweder mit Win32 Disk Imager unter Windows oder dd unter Linux) und zurückspielen keine Möglichkeit, selbst wenn die 16GB Speicherplatz auf der SD Karte alles andere als ausgenutzt wurden.

Folgende Prozedur hat nun scheinbar Erfolg gebracht. Alle Schritte habe ich auf einem Notebook mit SD Kartenleser durchgeführt.

Schritt 1: Partitionen verkleinern

  1. Die root Partition auf der alten SD Karte verkleinern, in meinem Fall großzügig um 1GB.
  2. Auch die erweiterte Partition um 1GB verkleinern. Dieser Schritt ist wichtig!

Schritt 2: Image mit dd erstellen

  1. sudo dd if=/dev/mmcblk1 of=~/raspi.img
    Hierbei wird die komplette SD Karte als Image gespeichert, d.h die Datei ist anschließend ca. 16GB groß.

Schritt 3: Image verkleinert auf die neue SD Karte schreiben

  1. Mit sudo fdisk -l ~/raspi.img die Größe der Partitionen anzeigen lassen:
    dennis@MSI-GE60:~$ sudo fdisk -l ~/raspi.img
    Medium raspi.img: 14,5 GiB, 15523119104 Bytes, 30318592 Sektoren
    Einheiten: sectors von 1 * 512 = 512 Bytes
    Sektorengröße (logisch/physisch): 512 Bytes / 512 Bytes
    I/O Größe (minimal/optimal): 512 Bytes / 512 Bytes
    Typ der Medienbezeichnung: dos
    Medienkennung: 0x000b2b81
    
    Gerät Boot Start Ende Sektoren Größe Id Typ
    raspi.img1 8192 2289062 2280871 1,1G e W95 FAT16 (LBA)
    raspi.img2 2289063 28221439 25932377 12,4G 5 Erweiterte
    raspi.img5 2293760 2359293 65534 32M 83 Linux
    raspi.img6 2359296 2488319 129024 63M c W95 FAT32 (LBA)
    raspi.img7 2490368 28221439 25731072 12,3G 83 Linux
  2. Hier sind raspi.img2 und raspi.img7 relevant: Die erweiterte und die root Partition:
    Beide haben als Ende 28221439. Ohne die Verkleinerungen aus dem ersten Schritt waren es in meinem Fall 30318591.
  3. Und so landet das erstelle Image auf der neuen SD Karte:
    sudo dd if=~/raspi.img of=/dev/mmcblk1 bs=1024 count=28221439
  4. Der Vorgang dauert sehr lange und es kommt am Ende eine Fehlermeldung, die neue SD Karte sei zu klein. Das ist korrekt und kann ignoriert werden, da dieser Bereich außerhalb der Partitionen liegt und damit keine Daten betroffen sind.
  5. (optional) Die Partionen können mit gparted wieder auf maximale Größe erweitert werden.
  6. Von der neuen SD Karte kann der Raspberry Pi nun booten.

Ach ja, der ganze Spaß hat 5 oder 6 Anläufe an mehreren Abenden benötigt. Adhoc hat das leider nicht funktioniert.

Datenbanken auf dem Raspberry Pi 3?

Ist es eine gute Idee, Datenbanken auf dem Raspberry Pi 3 zu betreiben? Nach meinen Erfahrungen der letzten Wochen, rate ich davon ab. Jedenfalls von größeren Datenbanken. Auf meinem Raspberry Pi 3 läuft eine PostgreSQL, die für kleine Datenmengen ausreichend ist, z.B. für Gogs (Git Repository). Zusätzlich liefen für ca. 1,5 Jahre Messdaten via FHEM in die Datenbank, was zu ca. 2,5 Millionen Datensätzen geführt hat. Und damit ist der Raspberry Pi 3 definitiv überfordert. Davor lagen diese Messdaten in einer SQLite Datenbank, die eine noch schlechtere Performance bot. Eine Java Applikation, die ebenfalls auf dem Raspberry Pi 3 läuft, hat für das Laden und Aufbereiten der Daten ca. 30 Minuten gebraucht. Die (momentane) Lösung ist, dass ich die Messdaten nun in einer MySQL Datenbank speichere, die auf einem vServer bei Host Europe läuft. Die Tabellen haben eine etwas andere Struktur, da ich direkt nach dem INSERT von neuen FHEM Messdaten diese via Trigger aufbereitet in eine andere Tabelle ablege. Der Start der Java Applikation hat sich auf ca. 30 Sekunden (nicht mehr Minuten!) reduziert. Der Zugriff auf die MySQL Datenbank erfolgt via SSH Tunnel, um die MySQL Datenbank auf dem vServer nicht direkt im Internet verfügbar zu machen.