From 0aa6a37325683206568e8bc98bc344203199bbaf Mon Sep 17 00:00:00 2001 From: schakal00783 Date: Mon, 3 Aug 2026 01:07:26 +0200 Subject: [PATCH] feat(system): System von der SD-Karte auf die eMMC umgezogen Alles lag auf der SD (System, DB, Aufnahmen, Modelle), die verloetete eMMC lag ungenutzt daneben. SD-Karten sterben im Dauerbetrieb meist ohne Vorwarnung, und Aime schreibt bei jeder Aufnahme WAV + MP3 plus DB und Suchindex. Die eMMC meldet ihren Verschleiss: life_time 0x01, pre_eol 0x01 = unter 10 % verbraucht. Vorher vollstaendige Sicherung der SD gezogen und verifiziert (94.501 Eintraege = find / -xdev, SHA-256-Stichprobe). Drei Erkenntnisse: 1. mkfs.ext4 (e2fsprogs 1.47) setzt orphan_file, was das Incompat-Merkmal orphan_present mitbringt -- U-Boots ext4-Leser verweigert dann das Lesen. Vor dem ersten Start entfernt: tune2fs -O ^orphan_file,^metadata_csum_seed. 2. U-Boot liest boot.scr und armbianEnv.txt von der SD, solange sie steckt -- nachgewiesen, indem die SD-Konfiguration testweise wieder auf die SD-Root zeigte und das Board prompt das alte System hochfuhr. 3. Daher aime-bootsync.service: spiegelt /boot beim Start und beim Herunterfahren auf die SD. Sonst liefe ein Kernel-Update auseinander (neue Module auf der eMMC, alter Kernel von der SD). Faellt die SD aus, greift die vollstaendige eMMC-Bootkette. Ergebnis: / = mmcblk0p1 (aime-emmc), keine fehlgeschlagene Unit, dieselben fuenf Dienste aktiv wie vorher, HTTP 200, NPU v0.9.8, Suchindex 1799/1799. Co-Authored-By: Claude Opus 5 (1M context) --- app/aime-bootsync.sh | 21 +++++++++++++++++ docs/01-hardware.md | 3 ++- docs/07-betrieb.md | 45 +++++++++++++++++++++++++++++++++++- docs/08-changelog.md | 36 +++++++++++++++++++++++++++++ system/aime-bootsync.service | 12 ++++++++++ 5 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 app/aime-bootsync.sh create mode 100644 system/aime-bootsync.service diff --git a/app/aime-bootsync.sh b/app/aime-bootsync.sh new file mode 100644 index 0000000..a672d2f --- /dev/null +++ b/app/aime-bootsync.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# Spiegelt /boot des laufenden (eMMC-)Systems auf die SD-Karte. +# +# Warum: U-Boot liest boot.scr, Kernel und initrd von der SD-Karte, das Root +# liegt aber auf der eMMC. Ein Kernel-Update schreibt nur nach /boot der eMMC — +# ohne diese Spiegelung wuerde der alte Kernel von der SD mit den neuen Modulen +# auf der eMMC starten, und das Ergebnis waere ein halb funktionierendes System. +# +# Laeuft beim Start UND beim Herunterfahren: nach einem Kernel-Update ist die +# SD damit schon vor dem naechsten Start aktuell. +set -u +SD=/dev/mmcblk1p1 +MP=/mnt/sdroot +[ -b $SD ] || exit 0 +mountpoint -q $MP && umount $MP +mkdir -p $MP +mount $SD $MP 2>/dev/null || exit 0 +rsync -a --delete --exclude='*.bak*' /boot/ $MP/boot/ +sync +umount $MP +logger -t aime-bootsync "/boot auf die SD gespiegelt" diff --git a/docs/01-hardware.md b/docs/01-hardware.md index dd5f251..cdf987d 100644 --- a/docs/01-hardware.md +++ b/docs/01-hardware.md @@ -6,7 +6,8 @@ |---|---| | SoC | Rockchip **RK3588S** — 4Ă— Cortex-A76 (max 2,256 GHz) + 4Ă— A55, **NPU 6 TOPS** (3 Kerne) | | RAM | 8 GB | -| OS | Armbian, Kernel 6.1.115, auf SD + eMMC | +| OS | Armbian, Kernel 6.1.115 — **System auf der eMMC** (seit 2026-08-03, siehe [07 – Betrieb](07-betrieb.md)) | +| Speicher | **eMMC 58 GB** (`mmcblk0p1`, Label `aime-emmc`) = `/` · **SD-Karte 119 GB** (`mmcblk1p1`, Label `armbi_root`) = Bootdateien + RĂĽckfallebene, sonst nicht eingehängt | | Netz | WLAN `192.168.1.200` (primär, auto-join) / LAN `192.168.1.50` | | Funk | **Intel AX210 M.2**: BT ĂĽber USB (`hci0`, Name **"Aime"**) + WiFi ĂĽber PCIe (`wlP4p65s0`). Alter RTL8821CU-USB-Dongle entfernt. | | KĂĽhlung | **LĂĽfterlos** (harte Anforderung). LĂĽfter am roten POWER-Port war unregelbar (Konstantspannung) und wurde entfernt; echter PWM-Header (FAN 2-Pin, hwmon7) bleibt ungenutzt. | diff --git a/docs/07-betrieb.md b/docs/07-betrieb.md index 43cabb4..0cbfa64 100644 --- a/docs/07-betrieb.md +++ b/docs/07-betrieb.md @@ -23,10 +23,53 @@ | `aime-micgate.service` | user | LADSPA-Noise-Gate-Filter-Chain | | `aime-volume-headset.service` | user | Windows-Volume → Headset-Sink (UAC2 numid=7) | | `aime-headset-keys.service` | root | H390-Inline-Tasten → Lautstärke | -| `aime-iphone-route.service` | — | HFP-Routing-Watcher fĂĽr iPhone-Anrufe | +| `aime-iphone-route.service` | — | HFP-Routing-Watcher fĂĽr iPhone-Anrufe. **Achtung:** die Unit liegt derzeit nicht unter `/etc/systemd/system/`, nur das Skript `/opt/callrec/aime-iphone-route.sh` ist da (Stand 2026-08-03, war schon vor dem eMMC-Umzug so) | +| `aime-bootsync.service` | system | spiegelt `/boot` der eMMC auf die SD-Karte (Start + Shutdown), siehe Speicher-Abschnitt | | `filter-chain.service` (PipeWire-Standard) | user | **MASKIERT** — wĂĽrde micgate doppeln | | `aime-audio-out` / `aime-volume` | user | ES8323-Ă„ra, **disabled** | +## Speicher: System auf der eMMC, Bootdateien auf der SD (seit 2026-08-03) + +```mermaid +flowchart LR + ROM["BootROM RK3588S"] --> IDB["idbloader + U-Boot
(eMMC, Sektor 64 / 16384)"] + IDB --> SCR{"boot.scr + armbianEnv.txt
zuerst gefunden auf:"} + SCR -->|SD-Karte| KRN["Kernel + initrd
von der SD"] + KRN -->|"rootdev=UUID=3ba18bc1…"| ROOT["/ = eMMC
mmcblk0p1 „aime-emmc“"] + ROOT -.->|"aime-bootsync spiegelt /boot"| KRN +``` + +| Gerät | Größe | Rolle | +|---|---|---| +| `mmcblk0p1` (eMMC, `aime-emmc`) | 58 GB, 28 GB belegt | **`/` — System, Datenbank, Aufnahmen, Modelle** | +| `mmcblk1p1` (SD, `armbi_root`) | 118 GB | `boot.scr`/Kernel/initrd **und** eine vollständige Kopie des alten Systems als Rückfallebene. Nicht eingehängt — die SD wird im Betrieb weder gelesen noch beschrieben. | + +**Warum die eMMC:** sie ist für Dauerbetrieb gebaut (Verschleiß auslesbar: `life_time 0x01`, +`pre_eol_info 0x01` = unter 10 % verbraucht), die SD-Karte ist der übliche Ausfallpunkt und stirbt +meist ohne Vorwarnung. Aime schreibt viel — jede Aufnahme WAV + MP3, dazu Datenbank und Suchindex. + +**Der Haken, den man kennen muss:** U-Boot liest `boot.scr` und `armbianEnv.txt` von der **SD-Karte**, +solange sie steckt — nachgewiesen durch einen Neustart, bei dem eine auf die SD-Root zeigende +`armbianEnv.txt` das alte System hochfuhr. Der Kernel kommt also von der SD, das Root von der eMMC. +Ohne Gegenmaßnahme würde ein Kernel-Update auseinanderlaufen: neue Module auf der eMMC, alter Kernel +von der SD. + +**`aime-bootsync.service`** löst das — spiegelt `/boot` beim Start **und** beim Herunterfahren auf die +SD (`rsync -a --delete --exclude='*.bak*'`), sodass beide Medien denselben Kernel tragen. Stirbt die +SD-Karte, findet U-Boot dort nichts mehr und nimmt die eMMC-Bootkette, die vollständig vorhanden ist. + +Beide `armbianEnv.txt` (eMMC und SD) tragen `rootdev=UUID=3ba18bc1-bb8e-4a34-9c61-18a27f2c7adf`. +Auf der SD liegt daneben `armbianEnv.txt.bak-vor-emmc-umzug` mit der alten SD-UUID +`ab30e77b-…` — wer das alte System wieder booten will, kopiert die Datei zurück. + +**Wichtig bei einem neuen Dateisystem:** `mkfs.ext4` aus e2fsprogs 1.47 setzt `orphan_file` und +`metadata_csum_seed`. `orphan_present` ist ein Incompat-Merkmal — ein Treiber, der es nicht kennt +(U-Boots ext4-Leser), verweigert das Lesen. Vor dem ersten Start entfernen: + +```bash +tune2fs -O ^orphan_file,^metadata_csum_seed /dev/mmcblk0p1 && e2fsck -fy /dev/mmcblk0p1 +``` + ## Wichtige Pfade auf dem Board | Pfad | Inhalt | diff --git a/docs/08-changelog.md b/docs/08-changelog.md index 13290f3..375b325 100644 --- a/docs/08-changelog.md +++ b/docs/08-changelog.md @@ -3,6 +3,42 @@ Chronik der Entwicklungsschritte. **Regel: jede zukünftige Änderung bekommt hier einen Eintrag** (Datum, Was, Warum, betroffene Dateien/Backups). +## 2026-08-03 — System von der SD-Karte auf die eMMC umgezogen + +**Warum:** alles lag auf der SD-Karte (System, Datenbank, Aufnahmen, Modelle), die verlötete eMMC lag +ungenutzt daneben. SD-Karten sind der übliche Ausfallpunkt im Dauerbetrieb und sterben meist ohne +Vorwarnung; Aime schreibt bei jeder Aufnahme WAV + MP3 plus Datenbank und Suchindex. Die eMMC meldet +ihren Verschleiß sogar: `life_time 0x01`, `pre_eol_info 0x01` — unter 10 % verbraucht. + +**Vorher gesichert:** vollständige Sicherung der SD (22,4 GB tar + Bootbereich + SQL-Dump), verifiziert +über Eintragszahl (94.501 = `find / -xdev`) und SHA-256-Stichprobe. + +**Ablauf:** eMMC formatiert (die alte Armbian-Karteileiche dort mit einer veralteten `callrec`-Version +ist damit weg), `rsync -aHAX --one-file-system` in zwei Runden — erste im laufenden Betrieb (28,5 GB in +7:25 min, 61 MB/s), zweite mit gestoppten Diensten als Delta (4 s). Danach `fstab` und `armbianEnv.txt` +auf die neue UUID, `e2fsck`, Stichproben, Dateilistenvergleich (Differenz: exakt die zwei Dateien, die +ich selbst nach dem Sync angelegt hatte). + +Drei Dinge, die dabei zu lernen waren: + +1. **`orphan_file` blockiert U-Boot.** `mkfs.ext4` (e2fsprogs 1.47) setzt `orphan_file` und + `metadata_csum_seed`; ersteres bringt das Incompat-Merkmal `orphan_present` mit, und ein Treiber, + der es nicht kennt, *muss* das Lesen verweigern. Die funktionierende SD-Partition hatte beides + nicht. Vor dem ersten Start entfernt: `tune2fs -O ^orphan_file,^metadata_csum_seed`. +2. **U-Boot liest die Bootdateien von der SD-Karte**, solange sie steckt — nachgewiesen, indem die + SD-`armbianEnv.txt` testweise wieder auf die SD-Root zeigte: das Board fuhr prompt das alte System + hoch. Kernel kommt also von der SD, Root von der eMMC. +3. Deshalb **`aime-bootsync.service`** (neu): spiegelt `/boot` beim Start und beim Herunterfahren auf + die SD. Ohne das würde ein Kernel-Update auseinanderlaufen — neue Module auf der eMMC, alter Kernel + von der SD. Fällt die SD aus, findet U-Boot dort nichts und nimmt die vollständige eMMC-Bootkette. + +**Ergebnis:** `/` = `mmcblk0p1` (`aime-emmc`), 28 GB von 58 GB belegt. Die SD ist im Betrieb nicht +eingehängt. Keine fehlgeschlagene Unit, dieselben fünf Dienste aktiv wie vor dem Umzug, Aime antwortet +mit HTTP 200, NPU-Treiber v0.9.8, Suchindex 1799/1799 Passagen, 50,8 °C. + +Dateien: `app/aime-bootsync.sh` (neu), `system/aime-bootsync.service` (neu), Kapitel +[01 – Hardware](01-hardware.md) und [07 – Betrieb](07-betrieb.md). + ## 2026-08-02 (spät) — Knöpfe rutschten aus der Zeile, 242 MB Dateileichen geräumt **1. Zeilenumbruch in der Aufnahmenliste.** Bei schmaler Liste schob ein langer Titel die Knöpfe aus der diff --git a/system/aime-bootsync.service b/system/aime-bootsync.service new file mode 100644 index 0000000..09eabfc --- /dev/null +++ b/system/aime-bootsync.service @@ -0,0 +1,12 @@ +[Unit] +Description=Aime: /boot der eMMC auf die SD-Karte spiegeln (Bootkette konsistent halten) +After=local-fs.target + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/opt/callrec/aime-bootsync.sh +ExecStop=/opt/callrec/aime-bootsync.sh + +[Install] +WantedBy=multi-user.target