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_keysDa 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 Bund 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_keysDamit 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 fiNach 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 closedMittels '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.retry -d 1 -t 2 scp -p -o ConnectTimeout=5 file.to_send webserver:/path
lsof -n | grep ssh | grep DEL
sudo shutdown -r 0
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 upgradeSollte 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 Paketname2Gelegentlich 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.pngIm Octave-Script wird das PostScript-File wie folgt generiert:
print -depsc2 plot.psDamit 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 vimDamit mit der Maus Cut&Paste funktioniert, muss man im Home-Directory ein File namens
.vimrc
erzeugen und dort set mouse=r
hineinschreiben.syntax on
drinstehen, damit der farbliche Syntax-Check funktioniert!
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
sudo systemctl daemon-reload
sudo mount -a
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 .find -name $lockfile -newermt "-200 seconds"
find $lockfile -newermt "-200 seconds"
OUTFILE="/mnt/ramdisk/${0##*/}.$$.result" curl --no-sessionid "http:URL-ADRESSE" --output $OUTFILE 2>/dev/null if test $? -eq 0 ; then out=`cat $OUTFILE | ........... ` fiUm 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 wurdenSolche Files sind mögliche Kandidaten, um auf die RAM-Disk ausgelagert zu werden.
*/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 "ä" 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 jumphostDamit 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.scp -o ProxyCommand="ssh -W %h:%p jumphost" file_to_copy destinationhost:
Host destinationhost ProxyCommand ssh -W %h:%p jumphostNun kann auch von diesem Rechner aus der SCP-Befehl wie bisher ausgeführt werden mittels
scp filename destinationhost:
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=30min
i
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:
#Doch nach einem erneuten Booten erscheint bei Eingabe von df -h# / 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
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/1000Wieso 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 doneDamit 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.errlogDamit 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-spectacleAchtung: 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 qmapshackGestartet 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" hineinzoomenWirklich 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...