Linux: Fehlende Firmware nachinstallieren

Manchmal moniert Linux fehlende Firmware. Das sieht bei einem apt Lauf zum Beispiel so aus:

Setting up linux-modules-extra-4.18.0-16-generic (4.18.0-16.17) ...
Setting up linux-image-generic (4.18.0.16.17) ...
Setting up linux-headers-generic (4.18.0.16.17) ...
Setting up linux-generic (4.18.0.16.17) ...
Processing triggers for linux-image-4.18.0-16-generic (4.18.0-16.17) ...
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-4.18.0-16-generic
W: Possible missing firmware /lib/firmware/amdgpu/vega12_gpu_info.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_asd.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_sos.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_asd.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_sos.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_rlc.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_mec2.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_mec.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_me.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_pfp.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_ce.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_rlc.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_mec2.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_mec.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_me.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_pfp.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_ce.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_sdma1.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_sdma.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_sdma1.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_sdma.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_uvd.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_uvd.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_vce.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_vce.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_smc.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_smc.bin for module amdgpu
I: The initramfs will attempt to resume from /dev/dm-2
I: (/dev/mapper/ubuntu--vg-swap_1)
I: Set the RESUME variable to override this.
/etc/kernel/postinst.d/zz-update-grub:
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.18.0-16-generic
Found initrd image: /boot/initrd.img-4.18.0-16-generic
Found linux image: /boot/vmlinuz-4.18.0-15-generic
Found initrd image: /boot/initrd.img-4.18.0-15-generic
Found linux image: /boot/vmlinuz-4.18.0-10-generic
Found initrd image: /boot/initrd.img-4.18.0-10-generic
Adding boot menu entry for EFI firmware configuration

Die Lösung:

Um es kurz zu machen und User, die nicht über Erfahrungen mit der Konsole verfügen: Die folgenden Befehle können einfach per Copy&Paste  ausgeführt werden. Voraussetzung: git sollte installiert sein. Falls nicht: Ein Terminal öffnen mit (ctrl + alt + t in den meisten Fällen) und das folgende Kommando eingeben:

sudo apt install git -y

Falls apt behauptet, es sei nicht up to date:

sudo apt update && sudo apt upgrade -y

danach sollte sich git problemlos installieren lassen.

Die Firmware Dateien finden sich hier. Wenn git installiert ist, können sie im Terminal einfach durch den folgenden Befehl installiert werden:

cd ~/Dokumente && git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/firmware/linux-firmware.git

Nachdem das git Verzeichnis so importiert wurde, ist es notwendig, die Dateien in das richtige Verzeichnis zu kopieren, damit das Programm "update-initramfs" sie finden und verwenden kann. Dazu einfach das folgende Kommando eingeben:

sudo cp ~/Dokumente/linux-firmware/amdgpu/* /lib/firmware/amdgpu && sudo update-initramfs -k all -u -v

Nach ein paar Programmzeilen sollten die Firmware Dateien korrekt im initramfs-Image verarbeitet worden sein und apt fehlerfrei durchlaufen.

Quelle / eigene Anpassungen.

Postfix Mails aus der Queue von bestimmten Absendern / Domains löschen

Manchmal klemmt eine Mail in der Mailqueue, die man dann auch noch löschen möchte. Für eine komplette Domain:

postqueue -p | tail -n +2 | awk 'BEGIN { RS = "" } /@example\.com/ { print $1 }' | tr -d '*!' | postsuper -d -

Für einen einzelnen Absender:

postqueue -p | tail -n +2 | awk 'BEGIN { RS = "" } /mail@example\.com/ { print $1 }' | tr -d '*!' | postsuper -d -

Postfix Mails aus der Queue von bestimmten Absendern / Domains löschen

Manchaml klemmt eine Mail in der Mailqueue, die man dann auch noch löschen möchte. Für eine komplette Domain:

postqueue -p | tail -n +2 | awk 'BEGIN { RS = "" } /@example\.com/ { print $1 }' | tr -d '*!' | postsuper -d -

Für einen einzelnen Absender:

postqueue -p | tail -n +2 | awk 'BEGIN { RS = "" } /mail@example\.com/ { print $1 }' | tr -d '*!' | postsuper -d -

batocera: Daddeln bis die Konsole raucht. Aber sicher.

Batocera ist die Linux Distribution für Spiele mit diversen Emulatoren, die momentan so ziemlich am besten läuft.  Das System läuft als root, daher ist es eine gute Idee, als erstes das Passwort zu ändern und gleich anschließend den SecureSHell Zugriff ermöglichen, natürlich ohne Passworteingabe, nur mit vorherigem Schlüsselaustausch.

Fehlschlag bei pg_config is required to build psycopg2

Dem Wunsch, eine PostgeSQL Datenbankunterstützung für eine Filamentdatenbank bei einer frischen OctoPrint Installation nachzurüsten wurde abgelehnt.  oprint/bin/pip install psycopg2 ergibt:

Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple

Collecting psycopg2

  Using cached psycopg2-2.8.6.tar.gz (383 kB)

    ERROR: Command errored out with exit status 1:

     command: /home/pi/oprint/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-eaezo9u5/psycopg2_570f9f228a2746e5b69eb4577ade54b4/setup.py'"'"'; __file__='"'"'/tmp/pip-install-eaezo9u5/psycopg2_570f9f228a2746e5b69eb4577ade54b4/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-42q59a0p

         cwd: /tmp/pip-install-eaezo9u5/psycopg2_570f9f228a2746e5b69eb4577ade54b4/

    Complete output (23 lines):

    running egg_info

    creating /tmp/pip-pip-egg-info-42q59a0p/psycopg2.egg-info

    writing /tmp/pip-pip-egg-info-42q59a0p/psycopg2.egg-info/PKG-INFO

    writing dependency_links to /tmp/pip-pip-egg-info-42q59a0p/psycopg2.egg-info/dependency_links.txt

    writing top-level names to /tmp/pip-pip-egg-info-42q59a0p/psycopg2.egg-info/top_level.txt

    writing manifest file '/tmp/pip-pip-egg-info-42q59a0p/psycopg2.egg-info/SOURCES.txt'



    Error: pg_config executable not found.



    pg_config is required to build psycopg2 from source.  Please add the directory

    containing pg_config to the $PATH or specify the full executable path with the

    option:



        python setup.py build_ext --pg-config /path/to/pg_config build ...



    or with the pg_config option in 'setup.cfg'.



    If you prefer to avoid building psycopg2 from source, please install the PyPI

    'psycopg2-binary' package instead.



    For further information please check the 'doc/src/install.rst' file (also at

    <https://www.psycopg.org/docs/install.html>).



    ----------------------------------------

ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

Was sich nicht sofort daraus erschließt: Es fehlten ein paar Bibliotheken: sudo apt-get install libpq-dev python-dev. Danach lässt sich die Datenbankunterstützung problemlos nachrüsten.

Mini-HowTo: Green Cell® UPS USV mit Nagios überwachen

Der Status einer günstigen unterbrechungsfreien Stromversorgung (USV), in dem Fall eine (Green Cell® UPS USV Unterbrechungsfreie Stromversorgung 600VA (360W)soll mittels Nagios abgefragt werden. Das UPS Modell ist mit dem Network UPS Tools (NUT) Treiber blazer_usb kompatibel. Die USV versorgt einen Clientrechner client.lan, Nagios ist auf einem Server server.lan installiert. Unter debian bzw. seinen Ablegern lässt sich die nötige Software auf dem Clientrechner wie gehabt installieren:
sudo apt install nut

Irgendwelche Abhängigkeiten sollten natürlich aufgelöst werden. Danach editieren wir die Datei /etc/nut/ups.conf und fügen am Ende folgende Definition für die GreenCell UPS ein:
[GreenCell]
        driver = "blazer_usb"
        port = "auto"
        desc = "GreenCell USV 600VA"
Die Datei /etc/nut/nut.conf editiert man dann entsprechend dem Verwendungszweck (Standalone/Netzserver/-client)
# Network UPS Tools: example nut.conf
#
##############################################################################
# General section
##############################################################################
# The MODE determines which part of the NUT is to be started, and which
# configuration files must be modified.
#
# This file try to standardize the various files being found in the field, like
# /etc/default/nut on Debian based systems, /etc/sysconfig/ups on RedHat based
# systems, ... Distribution's init script should source this file to see which
# component(s) has to be started.
#
# The values of MODE can be:
# - none: NUT is not configured, or use the Integrated Power Management, or use
#   some external system to startup NUT components. So nothing is to be started.
# - standalone: This mode address a local only configuration, with 1 UPS 
#   protecting the local system. This implies to start the 3 NUT layers (driver,
#   upsd and upsmon) and the matching configuration files. This mode can also
#   address UPS redundancy.
# - netserver: same as for the standalone configuration, but also need
#   some more network access controls (firewall, tcp-wrappers) and possibly a
#   specific LISTEN directive in upsd.conf.
#   Since this MODE is opened to the network, a special care should be applied
#   to security concerns.
# - netclient: this mode only requires upsmon.
#
# IMPORTANT NOTE:
#  This file is intended to be sourced by shell scripts.
#  You MUST NOT use spaces around the equal sign!

MODE=standalone

Auf dem Server wird Nagios am besten aus den Quellen installiert, viele Plugins und auch das Programmpaket selber liegt meistens in recht hm... veralteten Versionen vor. Ich verweise hier mal auf ein recht aktuelles HowTo. ^^

Sobald Nagios läuft, stricken wir uns einen Befehl zum Ansprechen der UPS zusammen und editieren dazu die Datei /usr/local/nagios/etc/objects/commands.cfg
# UPS Check
#
#
define command {

    command_name check_ups
    command_line    $USER1$/check_ups -H $HOSTADDRESS$ -u GreenCell
}

Wie man unschwer erkennen kann, bezieht sich der Befehl in der vorletzten Zeile auf das in der Datei /etc/nut/ups.conf definierte Gerät. Dieser Befehl kann nun in beliebigen Serverkonfigurationen, die Nagios überwacht, angewendet werden. Wir richten nun aber erst einmal die Nagios Konfiguration des Clients ein, der durch die USV versorgt wird und editieren dazu eine neue Datei, in dem Fall nennen wir sie einfach /usr/local/nagios/etc/servers/client.lan.cfg
(...)
define service {
use                     local-service
host_name               client.lan
service_description     GreenCell UPS
check_command           check_ups!-H client.lan -u GreenCell

Ab diesem Zeitpunkt sollte der Status der UPS abgefragt werden können. Welche Werte genau abgefragt werden können ist natürlich von der jeweiligen UPS abhängig und welche Werte von Belang sind. Wie bei den meisten anderen Nagios Plugins können auch bei check_ups die möglichen Parameter durch einen Aufruf auf den Kommandozeile abgefragt werden. Hier man ein wenig Copy & Paste:
nagiosuser@server.lan:/usr/local/nagios/libexec# ./check_ups -h
check_ups v2.3.3 (nagios-plugins 2.3.3)
Copyright (c) 2000 Tom Shields
Copyright (c) 2004 Alain Richard <alain.richard@equation.fr>
Copyright (c) 2004 Arnaud Quette <arnaud.quette@mgeups.com>
Copyright (c) 2000-2014 Nagios Plugin Development Team
    <devel@nagios-plugins.org>

This plugin tests the UPS service on the specified host. Network UPS Tools
from www.networkupstools.org must be running for this plugin to work.

Usage:
check_ups -H host -u ups [-p port] [-v variable] [-w warn_value] [-c crit_value] [-e] [-to to_sec] [-T]

Options:
 -h, --help
    Print detailed help screen
 -V, --version
    Print version information
 --extra-opts=[section][@file]
    Read options from an ini file. See
    https://www.nagios-plugins.org/doc/extra-opts.html
    for usage and examples.
 -H, --hostname=ADDRESS
    Host name, IP Address, or unix socket (must be an absolute path)
 -p, --port=INTEGER
    Port number (default: 3493)
 -u, --ups=STRING
    Name of UPS
 -T, --temperature
    Output of temperatures in Celsius
 -e, --extended-units
    Allow nonstandard units in performance data (used for voltage and temperatures)
 -v, --variable=STRING
    Valid values for STRING are LINE, TEMP, BATTLEFT, BATTPCT or LOADPCT
 -w, --warning=DOUBLE
    Response time to result in warning status (seconds)
 -c, --critical=DOUBLE
    Response time to result in critical status (seconds)
 -t, --timeout=INTEGER:
    Seconds before connection times out (default: 10)
    Optional ":" can be a state integer (0,1,2,3) or a state STRING

This plugin attempts to determine the status of a UPS (Uninterruptible Power
Supply) on a local or remote host. If the UPS is online or calibrating, the
plugin will return an OK state. If the battery is on it will return a WARNING
state. If the UPS is off or has a low battery the plugin will return a CRITICAL
state.

Notes:
 You may also specify a variable to check (such as temperature, utility voltage,
 battery load, etc.) as well as warning and critical thresholds for the value
 of that variable.  If the remote host has multiple UPS that are being monitored
 you will have to use the --ups option to specify which UPS to check.

 This plugin requires that the UPSD daemon distributed with Russell Kroll's
 Network UPS Tools be installed on the remote host. If you do not have the
 package installed on your system, you can download it from
 http://www.networkupstools.org

Send email to help@nagios-plugins.org if you have questions regarding use
of this software. To submit patches or suggest improvements, send email to
devel@nagios-plugins.org

Eine am Server abgesetzte Anfrage ergibt in unserem Fall:
nagiosuser@server.lan:/usr/local/nagios/libexec# ./check_ups -H prusapi.lan -u GreenCell
UPS OK - Status=Online Utility=230,0V Batt=100,0% Load=4,0% |voltage=230,000000;;;0,000000 battery=100,000000%;;;0,000000;100,000000 load=4,000000%;;;0,000000;100,000000

Nagios verwertet diesen Schnipsel so:



Einige Links in diesem Beitrag sind Vorschläge / Einkaufsquellen und sog. Affiliatelinks. Wenn Du etwas über diesen Link kaufst, erhalten wir eine kleine Provision. Der Preis für Dich bleibt derselbe. Vielen Dank für Deine Unterstützung.

Some of the links are suggestions for parts to replicate the thing and affiliate. If you buy something, I get a small commission. The price you pay is the same. Thank you very much.

Mini HowTo: OpenDKIM für Postfix installieren

Foto: Lourdes Cardenal
Campo de Criptana Molinos de Viento / La Mancha.
Foto: Lourdes Cardenal, CC BY-SA 3.0, via Wikimedia Commons
Bekanntlich bin ich der Ansicht, daß alle Spammer an ihren Eiern aufgehängt gehören. Da dieser Wunsch für mich momentan etwas schwierig umzusetzen ist, ich aber trotzdem Interesse an einer weitestgehend Spam bzw. Phishing freien Mailverkehr habe, muss ich wie einst Sisyphos (oder war es Don Quixote?) gegen unerwünschte Mails kämpfen. Da ich nicht der einzige bin, der diesen Wunsch hegt, gibt es eine breite Palette an Tools, die einen dabei unterstützen. Als Domaindiktator setze ich dabei am Mailserver an: "DomainKeys ist ein Identifikationsprotokoll zur Sicherstellung der Authentizität von E-Mail-Absendern, das von Yahoo entwickelt wurde und seit Ende 2013 ein Internet-Standard ist. Es wurde konzipiert, um bei der Eindämmung von unerwünschter E-Mail wie Spam oder Phishing zu helfen."  DKIM-Signaturen machen also Veränderungen an Header und Body einer Mail erkennbar.
Da es einige Stolperfallen bei der Einrichtung gibt, die das korrekte Funktionieren verhindern können, habe ich mir ein kurzes und rudimentäres HowTo verfasst:

Das Szenario: Alle Mails der Doman domainname.de sollen signiert werden. Alle eingehenden Mails sollen verifiziert werden. Wir haben Zugriff auf Nameservereinträge der Domain und ein Postfix Server sowie Amavis und Spamassassin verrichten ihren Dienst auf einem debian System. Den DKIM Dienst soll openDKIM übernehmen, das wir gleich mal in einem Terminal zusammen mit ein paar Tools installieren:
sudo apt install opendkim opendkim-tools

Dann legen wir ein Schlüsselverzeichnis an und generieren den Schlüssel. Wichtig ist die korrekte Rechtevergabe in den Schlüsselverzeichnissen! Zudem sollte der Dienst nicht als root laufen sondern unter dem User opendkim. Dieser darf in keiner anderen Gruppe Mitglied sein, ansonsten quittiert der Dienst den selbigen mit einer Fehlermeldung.
mkdir /etc/opendkim/keys/domainname.de
/usr/bin/opendkim-genkey -D /etc/opendkim/keys/domainname.de/ -d domainname.de -s 2020
chown -R root:opendkim /etc/opendkim/keys/domainname.de
chmod 640 /etc/opendkim/keys/domainname.de/2020.private
chmod 644 /etc/opendkim/keys/domainname.de/2020.txt

Im Anschluss bearbeiten wir die /etc/opendkim.conf:
Domain   domainname.de
Selector 2020                             # Das ist der im vorigen Schritt angegebene Selector. Interessant für diejenigen, die den DKIM Key regelmäßig aktualisieren.
KeyFile  /etc/opendkim/domainname.de/2020.private
Socket   inet:8891@localhost
Canonicalization        relaxed/simple    # Auf Headermodifikationen nicht gleich allergisch reagieren
Mode                    sv                # Mails [s]ignieren und [v]erifizieren

Wir starten den Dienst:  sudo systemctl restart opendkim und regeln, daß der Dienst beim Systemstart gleich gestartet wird:  systemctl enable opendkim. Dann befassen wir uns mit der Integration von openDKIM in Postfix. Dazu editieren wir die /etc/postfix/main.cf:
smtpd_milters = inet:localhost:8891
non_smtpd_milters = $smtpd_milters

Danach muss  Postfix diese Änderung bekannt gegeben werden: sudo systemctl reload postfix.

Das war es im Grunde dann auch schon. Bis auf eine Kleinigkeit: Die Integration des Schlüssels als TXT Record im Nameservereintrag von domainname.de. Diese Einstellung unterscheidet sich von Provider zu Provider, daher an der Stelle auch nur der allgemeine Hinweis:


Record NameRecord TypeText
mail._domainkeyTXTv=DKIM1; k=rsa; p=MI.. (Hier Inhalt von /etc/opendkim/keys/domainname.de/2020.txt einfügen, dabei alle >"< entfernen und alle Zeilen nach p= in einen Schlüssel ohne Leerzeichen verbinden.)

Das korrekte Eintragen des Schlüssels kann kompliziert sein, vor allem der Teil nach "p=" darf weder um- noch unterbrochen sein. Ansonsten wird der Schlüssel nicht erkannt!

Testen des Keys:
# opendkim-testkey -d domainname.de -s mail -vvv

opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key 'mail._domainkey.domainname.de'
opendkim-testkey: key not secure
opendkim-testkey: key OK

Sofern keine Fehlermeldungen auftreten, kann man sich nun darum kümmern, eingehenden Spam weiter zu filtern. In Amavis ist der DKIM Filter in einigen Debian Derivaten deaktiviert, lässt sich aber einfach aktivieren. Dazu muss in der Konfigurationsdatei /etc/amavis/conf.d/20-debian-defaults folgender Parameter gesetzt werden:
$enable_dkim_verification = 1;

In der Datei /etc/amavis/conf.d/50-user muss für eine erweitere Anzeige der Überprüfungsergebnisse dann als letztes noch folgender Parameter gesetzt werden:
$allowed_added_header_fields{lc('Authentication-Results')} = 1;

Im täglichen Mailverkehr empfiehlt sich darüber hinaus ein Addon für den freien Mailclient Thunderbird zur Kontrolle der empfangenen Mails: Den DKIM Verifier. Dieses Addon überprüft beim Öffnen einer Mail die Gültigkeit der Signatur. Somit kann man sich (halbwegs) sicher sein, daß die Mail vom signierenden Mailserver stammt. Natürlich nutzen auch einzelne Spammer DKIM. "Es ist wichtig zu beachten, dass eine E-Mail durch eine beliebige Domain signiert seinen kann. Eine gültige Signatur alleine ist daher kein Hinweis auf eine vertrauenswürdige E-Mail. Um zu entscheiden ob eine E-Mail vertrauenswürdig ist sollte immer überprüft werden wer der Signierende ist! In einigen Fällen kann die Abwesenheit einer DKIM Signatur nützlich sein um betrügerische E-Mails zu erkennen. Falls bekannt ist, dass eine Domain alle ihre E-Mails mittels DKIM signiert, ist das Nichtvorhandensein einer DKIM Signatur ein starker Hinweis auf eine gefälschte E-Mail." (Aus der Addon Beschreibung)

Quellen:
debianwiki, Steven Jenkins, Michael Kofler, WikiPediaPhilippe Lieser, Patrick Koetter

Raspberry PI mit SSD und S.M.A.R.T.

Für verschiedene Zwecke haben wir diverse Raspberry PIs im Einsatz. Zum Beispiel als 3D Druckserver mit OctoPrint. Normalerweise wird ein Raspberry mit microSDHC Speicherkarten betrieben. Diese kommen jedoch früher oder später meist an Grenzen, die einem nicht so in die Lebensplanung passen. Höchste Zeit also, auf eine SSD zu setzen, entweder gleich von Anfang an, oder eben wenn es klemmt:

Seit einiger Zeit kann der Raspberry ja auch direkt von der SSD booten, so daß die microSDHC Karten eigentlich nur dafür benötigt werden, das dafür notwendige Bit mittels program_usb_boot_mode=1 in der /boot/config.txt zu setzten.

Danach kann man gleich die z.B. durch etcher mit dem Betriebssystem der Wahl geflashten SSD anschließen und den Rechenzwerg starten. Oder man migriert sein existierendes System via dd von der microSDHC Karte auf die neue SSD. Ich habe beim ersten Versuch mit einer Kombination aus beidem gearbeitet, d.h. zuerst die SSD geflasht, dann die einzelnen dadurch entstandenen Partitionen mittels sudo dd if/dev/sdX of=/dev/sdX status=progress von der SDHC auf die SSD kopiert. Bei der Gelegenheit habe ich, um jeglichen Kalamitäten beim Bootvorgang aus dem Weg zu gehen, die /etc/fstab auf die Verwendung von UUIDs umgestellt, was nicht nur eine einfache Übung sondern wegen der Änderung der Laufwerksbezeichnungen durch den Austausch in jedem Fall notwendig ist.

Gute Erfahrungen habe ich mit den SSDs von SanDisk gemacht, die mit günstigen SATA2USB Adaptern an den Raspberry angeschlossen werden können. Sicherlich gibt es auch schnellere SSDs, das Geld ist jedoch angesichts diverser Beschränkungen des Raspberrys besser anderswo angelegt. Wichtig ist für mich hier vor allem, daß die Platte ohne aktiven USB Hub, d.h. nur mit der vom Raspberry zur Verfügung gestellten maximalen Spannung von 1,2A läuft.

Der SATA2USB Adapter meldet sich nach der Eingabe von sudo smartctl /dev/sdX mit der Id "Unknown USB bridge [0x152d:0x0578 (0x3202)]" und ist dementsprechend ein JMicron JMS567, der auf alle weiteren Aufrufe mittels sudo smartctl -a -d sat /dev/sdX korrekt angesprochen werden kann.

smartctl 6.6 2016-05-31 r4324 [armv7l-linux-4.19.60-v7+] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model:     SanDisk SSD PLUS 240GB
Serial Number:    19172C804389
LU WWN Device Id: 5 001b44 8b814e836
Firmware Version: UF5000RL
User Capacity:    240.065.183.744 bytes [240 GB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    Solid State Device
Form Factor:      2.5 inches
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   ACS-2 T13/2015-D revision 3
SATA Version is:  SATA 3.2, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Mon Jul 29 11:26:28 2019 CEST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART Status not supported: Incomplete response, ATA output registers missing
SMART overall-health self-assessment test result: PASSED
Warning: This result is based on an Attribute check.

General SMART Values:
Offline data collection status:  (0x00)    Offline data collection activity
                    was never started.
                    Auto Offline Data Collection: Disabled.
Self-test execution status:      (  32)    The self-test routine was interrupted
                    by the host with a hard or soft reset.
Total time to complete Offline 
data collection:         (  120) seconds.
Offline data collection
capabilities:              (0x15) SMART execute Offline immediate.
                    No Auto Offline data collection support.
                    Abort Offline collection upon new
                    command.
                    No Offline surface scan supported.
                    Self-test supported.
                    No Conveyance Self-test supported.
                    No Selective Self-test supported.
SMART capabilities:            (0x0003)    Saves SMART data before entering
                    power-saving mode.
                    Supports SMART auto save timer.
Error logging capability:        (0x01)    Error logging supported.
                    General Purpose Logging supported.
Short self-test routine 
recommended polling time:      (   2) minutes.
Extended self-test routine
recommended polling time:      (  42) minutes.

SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0032   100   100   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       47
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       52
165 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       107
166 Unknown_Attribute       0x0032   100   100   ---    Old_age   Always       -       2
167 Unknown_Attribute       0x0032   100   100   ---    Old_age   Always       -       0
168 Unknown_Attribute       0x0032   100   100   ---    Old_age   Always       -       4
169 Unknown_Attribute       0x0032   100   100   ---    Old_age   Always       -       296
170 Unknown_Attribute       0x0032   100   100   ---    Old_age   Always       -       0
171 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
172 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
173 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       2
174 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       47
184 End-to-End_Error        0x0032   100   100   ---    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   100   ---    Old_age   Always       -       0
194 Temperature_Celsius     0x0022   057   047   000    Old_age   Always       -       43 (Min/Max 18/47)
199 UDMA_CRC_Error_Count    0x0032   100   100   ---    Old_age   Always       -       0
230 Unknown_SSD_Attribute   0x0032   100   100   000    Old_age   Always       -       128851640350
232 Available_Reservd_Space 0x0033   100   100   005    Pre-fail  Always       -       100
233 Media_Wearout_Indicator 0x0032   100   100   ---    Old_age   Always       -       391
234 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       817
241 Total_LBAs_Written      0x0030   100   100   000    Old_age   Offline      -       383
242 Total_LBAs_Read         0x0030   100   100   000    Old_age   Offline      -       418
244 Unknown_Attribute       0x0032   000   100   ---    Old_age   Always       -       0

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

Selective Self-tests/Logging not supported
Auch wenn nicht alle S.M.A.R.T. Tests durchgeführt werden können, ist es doch möglich, die wichtigsten Test durchzuführen, die einem Auskunft über ein eventuell baldiges Ableben des Datenträgers geben können, hier mal ein 2 minütiger Kurztest mittels sudo smartctl -t short -d sat /dev/sdX nach 47 Stunden Laufzeit der Platte, den man sich mittels sudo smartctl -a -d sat /dev/sdX ansehen kann:
(...)
SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%        47         -

Selective Self-tests/Logging not supported
Weitere Tests werden dann entsprechend in der Ausgabe ergänzt, die aktuellen Ergebnisse stehen dann immer an erster Stelle der Ausgabe.

HINWEIS:
Alle gemachten Angaben sind ohne Gewähr auf Funktion und Richtigkeit. Für eventuell entstehende Schäden übernehmen wir keinerlei Haftung. Sämtliche Veränderungen geschehen auf Eure Verantwortung und Gefahr.

Irgendwie muss ich das alles finanzieren, daher sind die allermeisten Links Affiliate. D.h.: Solltet Ihr über diese Links zu einem Onlinehändler geraten und dort etwas bestellen, bekomme ich eine kleine Provision, für Euch ändert das am Preis natürlich nichts.