Schlagwort: Homelab

  • Der unkaputtbare Spotify-Pi: HiFiBerry, Raspotify und ein Dateisystem, das nie wieder stirbt

    Es begann mit Zeichensalat auf der Konsole und endete mit einem Kernel Panic: VFS: unable to mount root fs on unknown-block(179,2). Übersetzt: Die SD-Karte meines Spotify-Raspberrys hatte sich nach Jahren Dauerbetrieb verabschiedet. Der Pi hängt bei uns an der Stereoanlage im Esszimmer und macht daraus per Spotify Connect ein Streaming-Ziel für die ganze Familie. Und natürlich wusste ich nicht mehr, was ich damals wie konfiguriert hatte.

    Also Neuaufbau. Diesmal aber richtig: dokumentiert, reproduzierbar, und mit einer Betriebsart, die den nächsten SD-Karten-Tod technisch ausschließt. Hier ist das komplette Rezept.

    Die Hardware: Pi, DAC und die SD-Karten-Frage

    Das Setup ist bewusst simpel: ein Raspberry Pi, darauf gesteckt ein HiFiBerry DAC+. Der DAC ist der entscheidende Baustein, denn der analoge Audioausgang des Pi ist klanglich eine Zumutung. Der HiFiBerry sitzt direkt auf den GPIO-Pins, holt sich das Signal digital per I2S ab und liefert sauberes Cinch-Stereo an den Verstärker. Kostenpunkt um die 30 Euro, klanglicher Unterschied: Welten.

    Spannender ist die SD-Karten-Frage, denn die war ja gerade meine Todesursache. Zwei Erkenntnisse aus der Recherche:

    Erstens: Die Preise für Endurance-Karten (die Dauerbetriebs-Klasse für Dashcams) haben sich durch die explodierte NAND-Nachfrage fast verdreifacht. Eine SanDisk Max Endurance 32 GB kostet aktuell um die 33 Euro, vor gut einem Jahr war sie für 12 zu haben.

    Zweitens, und das ist die eigentliche Pointe: Man braucht sie streng genommen gar nicht. Denn der wirksamste Schutz gegen SD-Verschleiß ist nicht bessere Hardware, sondern eine Betriebsart, bei der die Karte im laufenden Betrieb überhaupt nicht mehr beschrieben wird. Dazu unten mehr. Ich habe mich trotzdem für die Max Endurance entschieden, nach dem Motto: Wir machen das jetzt einmal ordentlich. Gürtel plus Hosenträger. Wer sparen will, nimmt eine normale Markenkarte und verlässt sich auf den Read-only-Trick.

    Ein Einkaufshinweis noch, der bei SD-Karten wichtiger ist als bei fast jedem anderen Produkt: nur direkt beim Händler oder bei „Versand durch Amazon“ kaufen, nicht bei Marketplace-Drittanbietern. Gefälschte Markenkarten sind ein Massenphänomen, und eine Fälschung stirbt genau so, wie meine alte Karte gestorben ist.

    Installation: 10 Minuten mit dem Imager

    Betriebssystem ist Raspberry Pi OS Lite (64-bit) auf Trixie-Basis (Debian 13). Lite deshalb, weil eine headless Audio-Appliance keinen Desktop braucht: weniger Platz, weniger RAM, weniger Angriffsfläche.

    Der Raspberry Pi Imager nimmt einem dabei fast alles ab. Vor dem Schreiben unbedingt „Einstellungen bearbeiten“ öffnen und dort Hostname, SSH mit Public Key und die WLAN-Zugangsdaten hinterlegen. Dann bootet der Pi direkt ins Netz und ist per SSH erreichbar, ohne dass je ein Monitor angeschlossen war.

    Nach dem ersten Boot das übliche Ritual:

    sudo apt update && sudo apt full-upgrade -y
    sudo reboot

    Den DAC aktivieren: drei Zeilen config.txt

    Der HiFiBerry wird nicht per Software installiert, sondern per Device-Tree-Overlay aktiviert. Die Datei liegt inzwischen unter /boot/firmware/config.txt (nicht mehr /boot/config.txt, viele ältere Anleitungen zeigen den veralteten Pfad). Drei Änderungen:

    #dtparam=audio=on
    dtoverlay=vc4-kms-v3d,noaudio
    dtoverlay=hifiberry-dacplus

    Zeile 1 schaltet den Onboard-Sound ab, Zeile 2 verhindert, dass HDMI-Audio dazwischenfunkt, Zeile 3 aktiviert den DAC+. Nach einem Reboot muss aplay -l eine Karte namens sndrpihifiberry zeigen. Falls nicht: Bei neueren Kerneln heißt das Overlay für die Standard-Variante hifiberry-dacplus-std, das war bei mir der Stolperstein-Kandidat Nummer eins.

    Und wenn der Sound läuft, aber verdächtig leise ist: In alsamixer heißt der relevante Regler beim DAC+ „Digital“, und der steht nach frischer Installation gern nicht auf Maximum.

    Raspotify: ein Einzeiler und vier Parameter

    Raspotify macht aus dem Pi ein Spotify-Connect-Gerät (Premium-Account vorausgesetzt). Installation:

    curl -sL https://dtcooper.github.io/raspotify/install.sh | sh

    Die Konfiguration lebt in /etc/raspotify/conf. Meine Werte:

    LIBRESPOT_NAME="HIFIberry"
    LIBRESPOT_BITRATE="320"
    LIBRESPOT_INITIAL_VOLUME="100"
    LIBRESPOT_MIXER="alsa"

    Der Name ist das, was in der Spotify-App als Wiedergabegerät auftaucht. Die Bitrate darf bei Premium auf 320 kbit/s. Die Initial-Lautstärke gilt für jede neue Connect-Session. Und MIXER="alsa" übergibt die Lautstärkeregelung an den Hardware-Regler des DAC-Chips statt sie in Software zu rechnen, das ist die klanglich sauberere Variante.

    Zwei Fallstricke aus der Praxis: Der Parameter LIBRESPOT_AUTOPLAY kennt nur "on", "off" oder gar nicht gesetzt (dann gilt die Konto-Einstellung). Ihn leer zu setzen ("") verursacht Startprobleme. Und wer die feste Ausgabe an einen Vollverstärker bevorzugt, setzt LIBRESPOT_VOLUME_CTRL="fixed", regelt dann aber ausschließlich am Verstärker.

    Nach sudo systemctl restart raspotify taucht das Gerät in der Spotify-App auf. Probetitel, Gänsehaut, weiter.

    Der WLAN-Kniff: den Pi am richtigen Access Point festnageln

    In einem Mesh-Netz mit mehreren Repeatern gibt es ein Phänomen namens Sticky Client: Der WLAN-Chip des Pi versteht die Steering-Standards (802.11k/v) nicht, klemmt sich beim Boot an das erstbeste Signal und bleibt kleben. Bei mir hing der Pi dadurch an der weit entfernten FRITZ!Box statt am Repeater drei Meter daneben.

    Die Lösung: die BSSID (also die Funk-MAC des gewünschten Access Points) fest eintragen. Unter Trixie mit NetworkManager sind das drei Befehle:

    nmcli -f SSID,BSSID,CHAN,SIGNAL dev wifi list
    nmcli connection modify "MeinWLAN" 802-11-wireless.bssid XX:XX:XX:XX:XX:XX
    nmcli connection up "MeinWLAN"

    Der erste zeigt alle Funkzellen mit Signalstärke. Die richtige ist die mit der eigenen SSID und dem stärksten Signal am Standort (bei 5 GHz: Kanal 36 aufwärts). Wichtig: nur eine BSSID pinnen, die der Pi im Scan auch wirklich sieht. Ich habe das auf die harte Tour gelernt und mich mit einer vom Pi aus unsichtbaren Zelle selbst ausgesperrt.

    Der bewusste Trade-off: Fällt genau dieser Access Point aus, weicht der Pi nicht mehr auf andere aus. Für ein stationäres Gerät neben einem stationären Repeater ist das verschmerzbar.

    Das Finale: Read-only-Betrieb, die Lebensversicherung der SD-Karte

    Jetzt kommt der Baustein, der den nächsten Kernel Panic technisch ausschließt: das Overlay File System. Dabei wird das Root-Dateisystem read-only gemountet und alle Schreibzugriffe landen in einem RAM-Overlay, das beim Neustart verfällt. Die SD-Karte wird im Betrieb schlicht nie wieder beschrieben. Für eine Appliance, die nichts speichern muss, die perfekte Betriebsart.

    Aktiviert wird es in sudo raspi-config unter Advanced Options → Overlay File System. Zwei Fragen, zweimal Ja: Overlay aktivieren und die Boot-Partition schreibschützen. Reboot, Kontrolle mit mount | grep overlay, fertig.

    Der einzige Preis dafür ist ein Wartungsritual: Für jede künftige Änderung (Config anpassen, Updates einspielen) muss das Overlay kurz deaktiviert werden, Reboot, ändern, wieder aktivieren, Reboot. Klingt umständlich, sind aber fünf Minuten. Deshalb der wichtigste Tipp zum Schluss: Erst alle Einstellungen final machen, dann versiegeln. Wer bei aktivem Overlay konfiguriert, wundert sich nach dem nächsten Neustart, wo die Änderungen geblieben sind. Ohne Fehlermeldung.

    Die Learnings in Kurzform

    1. SD-Karten sind Verschleißteile. Wer einen Pi im Dauerbetrieb hat, sollte den Kartentod einplanen, oder ihn per Read-only-Betrieb abschaffen.
    2. Overlay File System schlägt Endurance-Karte. Die teure Karte lindert das Symptom, das Read-only-Dateisystem beseitigt die Ursache. Beides zusammen ist Gürtel plus Hosenträger.
    3. Dokumentieren, bevor es brennt. Der halbe Schmerz beim Neuaufbau war das Rekonstruieren der alten Konfiguration. Dieser Beitrag ist mein Runbook in Blogform.
    4. Sticky Clients per BSSID festnageln. Aber nur auf Zellen, die das Gerät auch sehen kann. Vorher scannen, dann pinnen.
    5. Config-Reihenfolge beachten: erst DAC, dann Raspotify, dann WLAN, ganz zum Schluss versiegeln.

    Der Pi spielt inzwischen wieder, hängt am richtigen Access Point und übersteht den nächsten Stromausfall, Kartenfehler oder Bastelunfall mit einem Schulterzucken. Und falls doch mal etwas stirbt: Neuaufbau nach diesem Rezept, 30 Minuten.