Erfahrungen mit einem Raspberry Pi 4 B (Raspi) und Debian 12 Bookworm

Die ersten Erfahrungen mit einem Raspi durfte ich dank einem Geschenk machen.

Informationen zur Installation eines Raspis sind auf einer separaten Seite vorhanden.

Unten beschreibe ich die bisherigen Erfahrungen damit sowie mit der Installation von Debian 12 Bookworm auf PCs; Probleme und deren Lösungen inklusive.

Inhalt:
- cgi-Scripte funktionieren unter Raspbian nicht
- Login mit SSH ohne Passwort
- Login mit SSH ohne Passwort will einfach nicht funktionieren!
- Programm convert gibt Fehlermeldung
- ssh spezielle.domain.ch gibt Fehlermeldung wegen /etc/resolv.conf
- Betrachten von PNG-Bildern
- Vergrössern von Graphiken
- /etc/resolv.conf ist plötzlich leer
- Updating and upgrading the Linux-systemUpdating and upgrading the Linux-system
- Octave kann qt toolkit via cron-job nicht laden
- vi-Editor mit farbigem Syntax-Check
- RAM-Disk auf Raspi einrichten zur Schonung der SD-Karte
- Umlaute in HTML-Seiten einfach verwenden
- SCP via einen jump host auf Rechner mit gesperrtem SSH
- Sprungziele in HTML-Seiten anbringen

cgi-Scripte funktionieren unter Raspbian nicht
Nach der Installation von apache2
sudo apt-get install apache2
funktionierten die unter /usr/lib/cgi-bin abgelegten cgi-Scrips nicht: Error 404 Not Found :-(
Ein Test mittels "curl localhost/cgi-bin/temperature.cgi" ergab denselben Fehler.
Die Lösung war:
- 1. Wegen dem Aufruf /usr/bin/vcgencmd measure_temp musste der Benutzer www-data im File /etc/group in die Gruppe video eingefügt werden
- 2. Unter root Eingabe von: "a2enmod cgid" gefolgt von "systemctl restart apache2"
--> nun funktionieren die CGI-Scripte. :-)

Login mit SSH ohne Passwort
Normalerweise kann das passwortlose Login via SSH zwischen zwei Rechnern A und B recht einfach hergestellt werden:

Auf Rechner A:
   cd .ssh
   ssh-keygen -t rsa   --> generiert die beiden Files id_rsa und id_rsa.pub
   scp -p id_rsa.pub B:.ssh/id_rsa.pub_A
Auf Rechner B:
   cd .ssh
   cat id_rsa.pub_A >> authorized_keys
   ssh-keygen -t rsa   --> generiert die beiden Files id_rsa und id_rsa.pub
   scp -p id_rsa.pub A:.ssh/id_rsa.pub_B
Auf Rechner A:
   cd .ssh
   cat id_rsa.pub_B >> authorized_keys
Da wir mittlerweile auf beiden Rechnern via SSH eingeloggt waren, wird die "Vertrauensfrage" nicht mehr gestellt und die beiden Hosts sind gegenseitig in den Files ~/.ssh/known_hosts eingetragen. FERTIG! :-)

Login mit SSH ohne Passwort will einfach nicht funktionieren!
Bei mir klappte trotz oben beschriebenen Verfahrens die Sache in einem Fall einfach nicht. Rechner A hat "Debian Jessie" installiert und Rechner B "Raspberry Pi OS Bookworm"; was für ein lästiges Problem: Stets wurde beim SSH-Login nach dem Passwort gefragt. Schliesslich versuchte ich vom Rechner A aus ein Login wie folgt:

ssh -vvv B
und analysierte die ausführlichen Meldungen. Mittels Google-Recherche stiess ich auf die Seite https://www.deployhq.com/support/projects/uploading-a-custom-key-pair und fand folgende Lösung:
Auf Rechner A:
   cd .ssh
   ssh-keygen -t ed25519 -m PEM   -->  generiert die beiden Files id_ed25519 und id_ed25519.pub
   scp -p id_ed25519.pub B:.ssh/id_ed25519.pub_A
Auf Rechner B:
   cd .ssh
   cat id_ed25519.pub_A >> authorized_keys
   ssh-keygen -t ed25519 -m PEM   --> generiert die beiden Files id_ed25519 und id_ed25519.pub
   scp -p id_ed25519.pub A:.ssh/id_ed25519.pub_B
Auf Rechner A:
   cd .ssh
   cat id_ed25519.pub_B >> authorized_keys
Damit funktionierte das gegenseitige Einloggen auf beiden Rechnern mittels SSH ohne Passwortabfrage einwandfrei - puhhh - endlich!

Programm convert gibt Fehlermeldung
Für die Umwandlung von Graphik-Files (z.B. PostScript in png) benutze ich sehr oft das Programm convert. Obwohl das Paket ImageMagick installiert war, kam beim Aufruf von convert eine Fehlermeldung von wegen Sicherheitsproblemen.
Im File /etc/ImageMagick-6/policy.xml wurde die Zeile
  <!-- <policy domain="coder" rights="none" pattern="PS" /> -->
auskommentiert und wie folgt ersetzt:
  <policy domain="coder" rights="read|write" pattern="PS" />
Seither funktioniert convert wie gewünscht!

Ende Februar 2024 funktioniert (nach einem upgrade) das Programm 'convert' wiederum nicht. Abhilfe: Erneute Instatallation mittels
apt-get install imagemagick
- Im File /etc/ImageMagick-6/policy.xml die sechs Zeilen ab
policy domain="coder" rights="none" pattern="PS"
ersetzt durch
policy domain="coder" rights="read|write" pattern="PS"
und dann funktioniert 'convert' wieder!

ssh spezielle.domain.ch gibt Fehlermeldung wegen /etc/resolv.conf
Um Code einzusparen, habe ich in etlichen Shell-Scripts den Befehl
scp -p file rechner.spezielle.domain.ch abgekürzt durch
scp -p file rechner .
Aus diesem Grund wurde im File /etc/resolv.conf folgende Änderung in der Zeile mit 'search' vorgenommen:
  # search home
  search spezielle.domain
  nameserver 192.168.0.1
Nach jedem Reboot (und vermutlich gelegentlich auch zwischendurch) wurde diese Modifikation wieder rückgängig gemacht. Es gäbe hier einige 'Abwehrmassnahmen', die im Internet zu finden sind. Da dieser Raspi stets im denselben Netzwerk betrieben wird, wurde folgende simple Massnahme getroffen:
  chmod u-w /etc/resolv.conf
Damit kann dieses File von niemandem mehr modifiziert werden:
  ls -l /etc/resolv.conf
  -r--r--r-- 1 root root 81 Jan 21 09:24 /etc/resolv.conf
Sollte dies wider erwarten nicht funktionieren, werde ich hier weiter darüber berichten.
Update vom 26.1.2024: Dies hat leider *nicht* funktioniert: Mitten im Editieren eine Files war die Verbindung plötzlich unterbrochen - nach einer Weile konnte dann mit dem Editieren trotzdem weitergemacht werden, doch der raspi war zwischendurch nicht erreichbar. Das File /etc/resolv.conf war danach modifiziert und für root wieder beschreibbar... unglaublich!
LÖSUNG: Im File /etc/hosts wurde nun eine neue Zeile eingefügt:
IP-Nummer rechner # ohne ".spezielle.domain.ch"
Nun kann   ssh rechner   eingegeben werden und es funktioniert! :-)

Betrachten von PNG-Bildern
In den letzten Jahren benutzte ich für das Betrachten von Bildern und Graphiken im Format *.png meistens das Programm 'feh'. Dieses ist in Debian GNU/Linux 12 (bookworm) nicht mehr vorhanden und daher benutze ich nun das Programm 'gpicview'.
Nachtrag: 'feh' kann seit ca. Oktober 2024 installiert werden und funktioniert.

Vergrössern von Graphiken
Eine Möglichkeit, eine Graphik zu vergrössern ist:
convert -scale 200% rain_temp.ps rain_temp.png
doch die Qualität ist nicht eben gut.
--> atp-get install psutils
--> psresize ... Mhh, in meinem Fall hat das nicht gut geklappt; vorerst!

Automatische Bewässerung des Gartens
Dieses laufende Projekt wird hier beschrieben. Ein Raspi mit Shellys eignet sich hierzu bestens!

Redundanz bzw. Hochverfügbarkeit der Haussteuerung
Seit dem 21. Februar 2024 experimentiere ich mit einem Hochverfügbarkeits-System, bei dem zwei Raspis sicherheitshalber die Steuerung der Hausautomatik (Storen, Gartenbewässerung, etc.) übernehmen, um gegen mögliche Ausfälle gewappnet zu ein.

/etc/resolv.conf ist plötzlich leer
In den frühen Morgenstunden des 23. Feb. 2024 war das File /etc/resolv.conf plötzlich leer und daher fehlte dort auch der Eintrag mit dem Nameserver - sehr ärgerlich!! Als Abhilfe wurden in einem Script, das die Hochverfügbarkeit alle zwei Minuten testet, folgende Zeilen eingefügt:

grep -q 192.168.0.1 /etc/resolv.conf
if test $? -ne 0 ; then
    echo "`uname -n`: /etc/resolv.conf ist 'leer' - Neustart! `date +%d.%m.%Y_%H:%M`"
    sudo shutdown -r 0
fi
Nach dem Neustart des Systems ist das File /etc/resolv.conf wieder wie im Originalzustand!

kex_exchange_identification: Connection closed by remote host
Seit einiger Zeit erhalte ich Fehlermeldungen beim Kopieren von Files via 'scp' auf einen externen Webserver:

kex_exchange_identification: Connection closed by remote host
Connection closed by XXX.YYY.ZZZ.AAA port 22
scp: Connection closed
Mittels 'ls -l' erhalte ich Datum und Zeit des Error-Logfiles, allerdings nur auf die Minute genau. Um diese Zeit mit dem Logfile /var/log/auth.log auf dem Web-Server vergleichen zu können, benötige ich eine genauere Zeit; siehe unten.
Nun (25.3.24) versuche ich den kex_exchange_identification-Fehler mittels 'retry' wie folgt zu vermeiden:
retry -d 1 -t 2 scp -p -o ConnectTimeout=5 file.to_send webserver:/path
Leider hat dies nicht funktioniert. Irgendwo las ich, das System wie folgt zu überprüfen:
lsof -n | grep ssh | grep DEL
worauf ich mehr als 30 Eintäge erhielt. Als provisorische Lösung habe ich den Server neu gestartet mit
sudo shutdown -r 0
und werde die Situation weiter beobachten...

File-Datum und -Zeit genauer als eine Minute
Mittels dem Befehl ls --full-time file.name erhält man die exakte Zeit (inkl. Sekundenbruchteile) des Entstehen des Files (file creation time).

Updating and upgrading the Linux-system
Regelmässig sollte das System mit der neusten Software aufgefrischt werden. Dies geschieht am einfachsten mit folgenden Eingaben:

sudo apt-get update
sudo apt-get upgrade
Sollte eine Meldung vom Typ "The following packages have been kept back" - gefolgt von einem oder mehreren Paketnamen - kommen, verfahre ich immer wie folgt, um diese Pakete separat zu installieren:
sudo apt-get install Paketname1
sudo apt-get install Paketname2
Gelegentlich erscheint eine Meldung
The following package was automatically installed and is no longer required: paketname
Use 'sudo apt autoremove' to remove it.
In einem solchen Fall sollte der empfohlene sudo-Befehl eingegeben werden.

Octave kann qt toolkit via cron-job nicht laden
Stundenlang kämpfte ich mit dem Problem, dass Shell-Scripts, die über einen cron-job ein Octave-Script starteten, das Graphics-Tool-Kit "qt" nicht laden konnten. Beim interaktiven Start von Octave erschien mit dem Befehl available_graphics_toolkits zwar "qt", beim Start via cron jedoch immer nur "gnuplot". Eine Übergabe von PATH-Werten und selbst das Login mittels SSH über cron via
17 0 * * * /usr/bin/ssh -y username@localhost $HOME/crontest/crontest.sh >> $HOME/crontest/crontest.log 2>>$HOME/crontest/crontest.errlog
hat nicht zum Erfolg geführt - und dies nach wirklich extensiven Google-Recherchen in deutscher und englischer Sprache!
Immer erschien die Fehlermeldung "octave: X11 DISPLAY environment variable not set" und "octave: disabling GUI features" sowie "warning: using the gnuplot graphics toolkit is discouraged".
Einige Anfragen mit Schilderungen des Problems bei ChatGPT brachten dann die Lösung!
Erstens muss (trotz cron-Job) die DISPLAY-Variable gesetzt werden. Nach dem Definieren der DISPLAY-Variablen erschien im Cron-Betrieb noch die Fehlermeldung "QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-username'" und "error: XDG_RUNTIME_DIR is invalid or not set in the environment". Daher wurde auch diese Variable definiert vor dem Aufruf des Octave-Scripts und der ganze Script-Teil sieht nun wie folgt aus:

#!/bin/bash
# Script-Ausschnitt, welches das Octave-Script startet
#
XDG_RUNTIME_DIR="/run/user/$UID"
export XDG_RUNTIME_DIR
DISPLAY=:0.0
export DISPLAY
octave --no-gui octave_script.m > /dev/null 2>octave.errlog
#
# Umwandlung in ein *.png-File für die Webseite:
# Die direkte Umwandlung im *.m-File mittels
# print -dpng rain_temp.png
# funktioniert nicht gut, weil dann punktierte Linien ausgezogen dargestellt werden
# Also:
convert -scale 150% plot.ps plot.png
Im Octave-Script wird das PostScript-File wie folgt generiert:
print -depsc2 plot.ps
Damit funktioniert nun alles einwandfrei!   :-)

Shell-Scripts checken
Die Seite ShellCheck erlaubt den Syntax-Check von Shell-Scripts: Script im oberen Feld mittels Paste einfügen und im unteren Feld die Resultate ablesen - sehr praktisch!

Web-Seiten checken
Mittels der Seite W3C Markup Validation Service können Webseiten z.B. auf ins Leere führende Links etc. getestet werden; sehr praktisch!

Offende Ports auf einem Rechner entdecken
Die Seite CanYouSeeMe.org checkt offene Ports. Alternativ kann natürlich auch ein (aggressiverer) Portscanner verwendet werden.

MAC-Adressen überprüfen
Stellt man im eigenen Netzwerk ein Gerät mit einer MAC-Adresse fest und weiss nicht genau, von welchem Hersteller dieses Gerät ist, kann dies mittels dem Heise-Tool oder auch mit dem Tool auf dein-ip-check.de unter Umständen herausgefunden werden; oft sehr nützlich.

vi-Editor mit farbigem Syntax-Check
Es ist sehr praktisch beim Editieren von Bash-Scripts, wenn bereits beim Editieren ein Syntax-Check gemacht wird und der Text entsprechend farbig erscheint.
Durch das Installieren des Pakets "vim" kann dies erreicht werden, und zwar ebenfalls für den Editor "vi"!

sudo apt-get update
sudo apt-get install vim
Damit mit der Maus Cut&Paste funktioniert, muss man im Home-Directory ein File namens .vimrc erzeugen und dort set mouse=r hineinschreiben.
Sobald dieses File existiert, muss dort auch eine Zeile mit syntax on drinstehen, damit der farbliche Syntax-Check funktioniert!
Absolut königlich ist der Umstand, dass danach auch Octave-Files (*.m) und der Source-Code von Fortran-Programmen (*.f) bereits beim Editieren einen farblich hervorgehobenen Syntax-Check erhalten!   :-)

RAM-Disk auf Raspi einrichten zur Schonung der SD-Karte
RAM hat keine begrenzten Schreibzyklen und ist für häufige Schreib- und Lesevorgänge ausgelegt. RAM hat extrem niedrige Latenzzeiten und hohe Übertragungsraten, was es ideal für schnelle, häufige Schreib- und Lesevorgänge macht.
SD-Karten haben eine begrenzte Anzahl von Schreibzyklen. Das bedeutet, dass häufige Schreibvorgänge die Lebensdauer der SD-Karte erheblich verkürzen können.
Daher kann das Auslagern kurzlebiger Dateien auf eine RAM-Disk die Lebensdauer der SD-Karte - auf der sich auch das Betriebssystem des Raspi befindet - erheblich verlängern.
Lösung: Kreieren einer RAM-Disk mit 100MB - in meinem Fall reicht dieser Platz, da nur sehr kleine Dateien dort abgespeichert werden:
Als Root (sudo) folgende Zeilen unten im File /etc/fstab einfügen:

# RAM-Disk für temporäre Dateien; Grösse 100 MB:
tmpfs   /mnt/ramdisk   tmpfs   defaults,noatime,size=100m   0   0
# 
Danach das Verzeichnis /mnt/ramdisk erstellen und mounten:
sudo mkdir /mnt/ramdisk
Damit das modifizierte /etc/fstab vom System benutzt wird, folgenden Befehl eingeben:
sudo systemctl daemon-reload
und anschliessend die RAM-Disk mounten:
sudo mount -a
Mit dem Befehl df -h erscheint jetzt die RAM-Disk und in den Scripts kann ein Lock-File nun z.B. wie folgt definiert werden:
scriptname="$(basename "$0" .sh)"
lockfile="/mnt/ramdisk/${scriptname}.lock"
Das Lockfile eines Scripts Test.sh heisst nun /mnt/ramdisk/Test.lock .
Achtung: Wenn bisher z.B. getestet wurde, ob das Lockfile jünger als 200 Sekunden ist:
find -name $lockfile -newermt "-200 seconds"
muss dieser Befehl nun modifiziert werden, weil das Lockfile nicht mehr im lokalen Directory vorhanden ist, sondern der Name einen Pfad enthält:
find $lockfile -newermt "-200 seconds"
Files, die nur sehr kurzlebig sind, sollten ebenfalls auf die RAM-Disk ausgelagert werden. Beispiele sind z.B. Outputs von wget oder curl, die unmittelbar nach dem Aufruf ausgewertet werden (im folgenden Beispiel wird mittels "$$" noch der PID des Scrips eingefügt, damit es keine Probleme gibt, falls das Script simultan ein zweites Mal läuft):
OUTFILE="/mnt/ramdisk/${0##*/}.$$.result"
curl --no-sessionid "http:URL-ADRESSE" --output $OUTFILE 2>/dev/null
if test $? -eq 0 ; then
   out=`cat $OUTFILE | ........... `
fi
Um herauszufinden, welche Files gerade kürzlich kreiert wurden, kann folgender Befehl eingegeben werden:
find "$HOME" -type f -mmin -15
# zeigt alle Files im/unter dem Home-Verzeichnis, die in den letzten 15 Min. geändert wurden
find "$HOME" -type f -mmin -3
# Files, die in den letzten 3 Minuten modifiziert wurden
Solche Files sind mögliche Kandidaten, um auf die RAM-Disk ausgelagert zu werden.
Das Verschieben kurzlebiger Dateien auf eine RAM-Disk ist eine sinnvolle Massnahme, um die Lebensdauer der SD-Karte zu verlängern und die Leistung zu verbessern. Insbesondere bei Anwendungen wie dem Raspberry Pi, wo SD-Karten als primärer Speicher verwendet werden, kann dies erheblichen Nutzen bringen.
Zu beachten ist, dass nach einem Reboot Files auf der RAM-Disk verschwunden sind. Bei Lock-Files ist dies jedoch sogar ein angenehmer Nebeneffekt!
Damit die RAM-Disk nicht versehentlich voll wird, habe ich einen cron-job wie folgt definiert:
*/15 * * * * find "/mnt/ramdisk" -name "*.result" -type f -mmin +15 -exec rm {} \; >> $HOME/cron/clean_ramdisk.log 2>> $HOME/cron/clean_ramdisk.errlog
Damit werden Files namens "*.result", die älter als 15 Minuten sind, alle 15 Minuten automatisch gelöscht. Meine Lockfiles sind leer und werden regelmässig überschrieben - sie müssen daher nicht gelöscht werden.

Webseiten auf RAM-Disk einrichten
Um sehr persönliche Webseiten auf einem lokalen Raspi anstatt auf einem externen Web-Server zu speichern, habe ich folgendes Vorgehen gewählt:
cd /mnt/ramdisk
mkdir PRIVAT
cd /var/www/html
sudo ln -s /mnt/ramdisk/PRIVAT PRIVAT

Umlaute in HTML-Seiten einfach verwenden
Meistens ist man gezwungen, Umlaute in HTML-Dokumenten mittels spezieller Befehle einzugeben. Beispiel: Anstatt "ä" muss "&auml;" angegeben werden.
Dies kann man wie folgt umgehen:
1. Auf dem Webserver (z.B. Ubuntu mit Apache2) im File /etc/apache2/apache2.conf als root die folgende Zeile hinzufügen bzw. modifizieren: AddDefaultCharset UTF-8
2. Anschliessend Apache2 neu starten; ich benutzte sicherheitshalber einen Stopp und anschliessend einen START:
/etc/init.d/apache2 stop
/etc/init.d/apache2 start

Alleine in Abschnitt "<head>" die Zeile <meta charset="UTF-8"> anzugeben (wie von ChatGPT empfohlen), hat bei mir nicht funktioniert. Die oben beschriebene Lösung jedoch schon und das HTML-Dokument wurde vom oben erwähnten "W3C Markup Validation Service" bzw. Nu Html Checker für fehlerfrei gecheckt (diese Webseite hier!).

SCP via einen jump host auf Rechner mit gesperrtem SSH
Möchte man ein File via scp auf einen entfernten Rechner kopieren, bei dem der SSH-Zugang z.B. aus Sicherheitsgründen für externen Zugang gesperrt ist, kann dies via einen sogenannten Jump-Server, welcher SSH-Zugang zum Zielrechner hat, realisiert werden. Die zu benutzenden Befehle werden kürzer, wenn sowohl der Zielrechner als auch der JumpHost im File /etc/hosts eingetragen sind.
Voraussetzung: Auf dem Jump Host sind unter $HOME/.ssh die public-keys der Rechner, von welchen aus man scp benutzen will, gespeichert und mittels cat id_rsa.pub_machine >> authorized_keys im File authorized_keys abgespeichert (siehe weiter oben unter Login via SSH ohne Passwort).
Auf Raspis mit Debian Bookworm: scp -J jumphost file_to_copy destinationhost:
Um diesen Befehl einfacher zu gestalten, empfiehlt es sich, ein File $HOME/.ssh/config anzulegen (oder zu ergänzen) mit folgendem Inhalt:

Host destinationhost
   ProxyJump jumphost
Damit wird ein Kopiervorgang mittels scp vereinfacht: scp filename destinationhost: Man sieht, dass dieser Befehl nun identisch ist mit demjenigen, den man ausgeführt hat, bevor der SSH-Zugang zum destinationhost gesperrt wurde.
Auf einem PC mit Debian Jessie und einer älteren Version von OpenSSH funktioniert folgender Befehl (Lösung von ChatGPT erhalten):
scp -o ProxyCommand="ssh -W %h:%p jumphost" file_to_copy destinationhost:
Eine wie oben beschriebene analoge Konfigurationsdatei $HOME/.ssh/config muss dann wie folgt aussehen:
Host destinationhost
   ProxyCommand ssh -W %h:%p jumphost
Nun kann auch von diesem Rechner aus der SCP-Befehl wie bisher ausgeführt werden mittels
scp filename destinationhost:
was insgesamt eine wirklich elegante Lösung darstellt.

Sprungziele in HTML-Seiten anbringen
Manchmal ist es wünschenswert, irgendwo auf einer Webseite auf eine spezielle Stelle auf derselben Seite zu verlinken, so dass man mit einem Klick dorthin geführt wird. Wie dies gemacht wird, kann an diesem Abschnitt gezeigt werden:
Ganz oben auf dieser Seite wurde unter "Inhalt" folgende Zeile eingefügt:
- <a href="#Sprungziele in HTML">Sprungziele in HTML-Seiten anbringen</a>
Am Ziel (diesem Abschnitt hier) wird folgende Zeile eingefügt:
<b id="Sprungziele in HTML">Sprungziele in HTML-Seiten anbringen</a</b>
Nun kann im Inhaltsverzeichnis auf den Link geklickt werden und man wird direkt zum entsprechenden Abschnitt geführt.

Probleme bei einfachen Berechnungen in Bash beheben
Bei einfachen Rechenoperationen kann dies in Bash so gemacht werden: A=8 ; let A2=$A+8; damit wird aus A=8 korrekt A2=10. Wenn nun A aus einem Textstring gelesen wird und A=02 ist, so erhält man bei demselben Befehl die Fehlermeldung -bash: let: A2=08: value too great for base (error token is "08"), weil $A offensichtlich als Oktalzahl angesehen wird. Die Lösung in solchen Fällen sieht wie folgt aus: A=`echo $A | bc` womit A den Wert 8 anstatt 08 erhält und danach funktioniert auch der Befehl let A2=$A+8 korrekt und aus A2 wird 10.

Installation von Debian 12 Bookworm auf einem PC (nicht einem Raspi)
- Vor der Installation von Bookworm gelang es mir nicht, mittels der Taste F2 ins BIOS zu gelangen. Nach längerer Zeit versuchte ich, den USB-Stecker der Tastatur hinten am PC anstatt in eine blaue Buchse unten weiter oben in eine schwarze USB-Buchse zu stecken - damit hat die Sache dann funktioniert!!
- Nach der Installation hat das Netzwerk mittels DHCP eine IP-Adresse erhalten. Soll diese Adresse auf eine fixe IP des lokalen Netzes gesetzt werden, genügt es nicht, im File /etc/network/interfaces eine fixe IP-Adresse zu vergeben, denn das Interface hat nicht mehr den Namen 'eth0' wie früher unter Debian Jessie! Mittels dem Befehl ip a s können die Interfaces gelistet werden. Und mittels ip a s | grep mtu kann im zweiten Feld gesehen werden, dass (bei mir) dort anstatt eth0 neu eno1 steht. Dieser Interfacename ist dann anstatt eth0 im File /etc/network/interfaces zu verwenden.
- Der Befehl sudo hat erst funktioniert, nachdem im File /etc/group mein Benutzername USER im File /etc/group in der Zeile sudo:x:27:USER angefügt wurde.
- Lästigerweise wurde ich bei jedem sudo-Befehl auch immer nach einem Passort gefragt. sudo ohne Passwort kann wie folgt eingerichtet werden: Im Directory /etc/sudoers.d/ ein neues File 010_pi-nopasswd anlegen mit folgendem Inhalt: USER ALL=(ALL) NOPASSWD: ALL, wobei USER der Bwnutzername ist. Anschliessend neu in das System einloggen.
- Automatisches 'Abschalten' verhindern: In meinem Fall ist es unerwünscht, dass sich der PC nach einiger Zeit von Nichtaktivität selbständig abschaltet bzw. in einen Ruhemodus wechselt. Abhilfe: Im File /etc/systemd/logind.conf die Zeile #IdleAction=ignore auskommentieren und die Zeile #IdleActionSec=30mini ersetzen durch IdleActionSec=0 . Danach eingeben: sudo systemctl restart systemd-logind . Den Status ansehen: sudo systemctl status systemd-logind.service Bei mir ist als Desktop KDE-Plasma installiert. Dort "Einstellungen > Energieverwaltung" auswählen und den Tick bei "Sitzung in den Standby-Modus versetzen" entfernen. ChatGPT schlägt ausserdem noch folgendes vor (habe ich bisher nicht gemacht): Im File /etc/default/grub in der Zeile mit "GRUB_CMDLINE_LINUX_DEFAULT" neu noacpi hinzufügen: GRUB_CMDLINE_LINUX_DEFAULT="quiet splash noacpi", anschliessend eingeben: sudo update-grub und PC neu starten.

Konfusion: /dev/sda und /dev/sdb ändern sich nach einem Reboot. Die Installation erfolgte auf /dev/sda mit UUID=d77c88a9-8cbc-46f5-a4e1-2369454a136d, siehe auch in /etc/fstab:

#                
# / was on /dev/sda2 during installation
UUID=d77c88a9-8cbc-46f5-a4e1-2369454a136d /               ext4    errors=remount-ro 0       1
# /2/rootfs was on /dev/sdb2 during installation
UUID=5f9e10fd-1292-4a03-bdda-cdbd5b559724 /2/rootfs       ext4    defaults        0       2
Doch nach einem erneuten Booten erscheint bei Eingabe von df -h
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
udev            7.8G       0  7.8G    0% /dev
tmpfs           1.6G    1.3M  1.6G    1% /run
/dev/sdb2       1.8T    7.6G  1.7T    1% /
tmpfs           7.8G     16M  7.8G    1% /dev/shm
tmpfs           5.0M    8.0K  5.0M    1% /run/lock
/dev/sda2       1.8T    7.5G  1.7T    1% /2/rootfs
tmpfs           1.6G    2.5M  1.6G    1% /run/user/1000
Wieso ist / nun auf /dev/sdb ?? Der Befehl sudo blkid ergibt:
/dev/sdb2: UUID="d77c88a9-8cbc-46f5-a4e1-2369454a136d" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="e030f748-02"
/dev/sdb5: UUID="026e9520-0369-41c8-8853-cb243cc15544" TYPE="swap" PARTUUID="e030f748-05"
/dev/sda2: UUID="5f9e10fd-1292-4a03-bdda-cdbd5b559724" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="75b3ad9e-02"
/dev/sda5: UUID="8c72ec1a-7d39-47ec-83e0-6eb776d305d8" TYPE="swap" PARTUUID="75b3ad9e-05"
--> Wir ersehen daraus, dass - obwohl / auf /dev/sdb2 eingehängt ist - die UUID von /dev/sdb2 immer noch d77c88a9-8cbc-46f5-a4e1-2369454a136d ist. Somit scheint alles seine Ordnung zu haben und uns kann egal sein, ob wir auf sda oder sdb arbeiten, denn wir sind immer noch auf derselben Disk. UND: Wir sehen dies auch mittels Eingabe von readlink -f /dev/disk/by-uuid/d77c88a9-8cbc-46f5-a4e1-2369454a136d, denn dieser ergibt: /dev/sdb2

Bisher wurden die SATA-Disks auf unseren PCs regelmässig mit dem Befehl sudo smartctl -a /dev/sda auf deren Zustand überprüft. Um dies mittels der UUIDs zu tun, verwende ich folgenden Code:

UUIDS=$(grep ^UUID /etc/fstab | grep -v swap | cut -d" " -f 1 | cut -d"=" -f 2)
#
# Für jede UUID das zugehörige Gerät prüfen
for UUID in $UUIDS; do
  DEVICE=$(readlink -f /dev/disk/by-uuid/$UUID)
  if [ -b "$DEVICE" ]; then
    echo "Checking SMART status for $DEVICE..."
    sudo smartctl -a $DEVICE | grep "SMART overall-health self-assessment test result" | grep -q "PASSED"
    if [ $? -eq 0 ]; then
      echo "SMART test PASSED for $DEVICE $UUID"
    else
      echo "SMART test FAILED for $DEVICE $UUID"
    fi
  else
    echo "Device for UUID $UUID not found!"
  fi
done
Damit wird sichergestellt, dass die vorhandenen Disks anhand ihrer UUID geprüft werden. Und übrigens: Es spielt keine Rolle, ob smartctl mit /dev/sdb2 oder /dev/sdb aufgerufen wird; der Output ist derselbe.

Befehle (in einem Script) priorisieren
Um die Priorität eines Befehls bzgl. Rechenleistung zu priorisieren, kann dies mittels dem Befehl nice -n niceness Befehl geschehen, wobei niceness ganzzahlig zwischen -20 (höchste Priorität) und 19 (niedrigste Priorität) liegen kann. Negative Werte können nur durch root vergeben werden. Um zu verhindern, dass auch der Befehl selbst unter root ausgeführt wird, verwende ich jeweils z.B. folgende Befehlsequenz:

benutzer=$USER; sudo nice -n -20 sudo -u $benutzer Befehl

Zeitansage/Sprache mittels cron auf Lautsprecher bringen
- Paket espeak-ng installieren (espeak ist veraltet; 'ng' steht für 'new generation')
- Script zeitansage.sh wie folgt erstellen:

#!/bin/bash
# zeitansage.sh 16Nov2024/uk
#
export XDG_RUNTIME_DIR="/run/user/$UID"
export PULSE_SERVER=/run/user/$UID/pulse/native
#
# Aktuelle Zeit, wobei aus '00' jeweils '0' wird und 'leading zeros' wegfallen:
zeit=$(date +"%H Uhr und %M Minuten." | tr -s /00/ | sed 's/^0//')
# Männerstimme:
#echo "$zeit" | espeak-ng --stdin -v de -a 250 -s 140 
# Frauenstimme:
echo "$zeit" | espeak-ng --stdin -v de+f5 -a 250 -s 180
#
und anschliessend in der Crontabelle folgenden Eintrag machen:
# Zeitansage:
0,15,30,45 * * * * $HOME/SOH/zeitansage.sh >> $HOME/SOH/zeitansage.log 2>>$HOME/SOH/zeitansage.errlog
Damit ertönt jede Viertelstunde die momentane Zeit aus dem Lautsprecher.

Octave: Linien stimmen nicht mit Punkten überein
Etwas gedauert hat es, bis ich herausfand, wieso ein mit Octave erzeugter Plot mit Linien sehr selstsam und irgendwie 'abgehackt' aussah. Schliesslich plottete ich zuerst nur die Messwerte. Die x-Werte wurden vorher mittels days=datenum(yr,mo,dy,hr,mn) berechnet und anschliessend wie folgt gezeichnet: plot(days,snow,'k*',"LineWidth",1), wobei "snow" ein Vektor mit der Schneemenge ist (siehe OpenWeatherMap-Seite). Nach Eingabe von hold und plot(days,snow,'k-',"LineWidth",1) zeigte sich, dass die Linien nicht durch alle Messpunkte verliefen. Der Fehler liegt offensichtlich darin, dass 'gnuplot' nur single-precision verwendet. Abhilfe schaffte (weil meine Daten nur ca. 30 Minuten auseinanderlagen) folgendes Vorgehen:

plot(days-730485,snow,'k*',"LineWidth",1)
hold
plot(days-730485,snow,'k-',"LineWidth",1)
Dabei stimmen in der Folge auch die Ticks auf der x-Achse, wenn der Befehl datetick('x','dd.mm.yy','keeplimits'); ausgeführt wird.

"ksnapshot" ist veraltet, neu wird "kde-spectacle" verwendet
Jahrelang habe ich für Screenshots das Programm ksnapshot verwendet. Dieses ist unter Debian/Bookworm nicht mehr vorhanden. Neu wird daher kde-spectacle verwendet:

sudo apt-get upgrade
sudo apt-get install kde-spectacle
Achtung: Installiert wird zwar kde-spectacle, das Programm muss jedoch mit dem Befehl spectacle aufgerufen werden!

"QlandkarteGT" ist veraltet, neu wird "QMapShack" verwendet
Lange konnte das Programm QLandkarteGT verwendet werden, um diverse Karten anzusehen. Neu wird das Programm QMapShack verwendet:

sudo apt-get upgrade
sudo apt-get install qmapshack
Gestartet wird das Programm mit dem Befehl qmapshack & worauf ein auf den ersten Blick etwas unübersichtlich erscheinendes Fenster mit etlichen Unterfenstern erscheint. Hier wird vorerst nur beschrieben, wie man eine Karte, die für ein Garmin-Gerät im Format gmapsupp.img vorhanden ist, visualisieren kann.
1. Starten des Programmes (im Hintergrund): qmapshack &
2. Datei - Kartenverzeichnisse angeben:
   Klick auf das grosse + und danach das Verzeichnis anwählen -> auf OK klicken
   und nochmals auf OK klicken
Ev. muss das Programm nochmals neu gestartet werden...
3. Datei - Schliessen
4. Programm neu starten: qmapshack &
5. Im Fenster links oben erscheinen die *.img-Files dieses Directories
6. In diesem Fenster die gewünschte Karte anklicken
7. Rechtsklick auf den Kartennamen und Feld 'Aktivieren' anklicken
8. In der Mitte erscheint die Karte und mittels "Mausrad runter drehen" solange
   Herauszoomen, bis die Karte erscheint.
9. Mittels Maus Karte verschieben und mittels "Mausrad hochdrehen" hineinzoomen
Wirklich sehr praktisch ist, dass man direkt Garmin-Karten, die mittels "mkgmap" erstellt wurden, ansehen kann!

Bei den PicoMaps kann man zur Orientierung mit der Maus auf die grünen Linien fahren, um sich die Länder bzw. Provinzen anzeigen zu lassen.

...more to come...


Last Update: 12Mar2025 - Created: 15Jan2024 / uk