Last active
April 11, 2026 12:44
-
-
Save patarok/0eec18f714011e4c5d842436e0bb21b6 to your computer and use it in GitHub Desktop.
OpenWRT -- Fallback to preconfigured emmc if SSD fails
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Pi startet | |
| ↓ | |
| U-Boot → lädt Production Image von eMMC | |
| ↓ | |
| Kernel startet | |
| ↓ | |
| preinit → mount_extroot → SSD wird gemountet aber RO | |
| ↓ | |
| init/procd startet | |
| ↓ | |
| START=05: ssd_watchdog läuft als erstes | |
| ↓ | |
| grep findet 'ro' in /proc/mounts für /overlay | |
| ↓ | |
| switch_to_emmc_overlay.sh: | |
| → fitrw auf /mnt/fallback_overlay mounten | |
| → neues overlay aus /rom + fitrw/upper bauen auf /mnt/newroot | |
| → bind mounts für proc/sys/dev/tmp | |
| → pivot_root | |
| → SSD unmounten | |
| → exec /sbin/init | |
| ↓ | |
| System läuft vollständig auf eMMC-overlay (fitrw) | |
| SSD ist komplett abgehängt | |
| btrfs-tools verfügbar um SSD zu reparieren |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| EMMC FALLBACK OVERLAY - PREPARATION GUIDE | |
| ========================================= | |
| 1st - set up eMMC so it is (except heavyweight package installations which for the SSD | |
| is there) fully equivalent to what later runs from SSD: | |
| *) install btrfs-tools etc. and everything needed to make snapshots and clones | |
| of the SSD we mount later on, | |
| **) this gives the ability to either restore btrfs snapshots if the system goes | |
| 'wicked' after package installs or: | |
| ***) the ability to pull in dd-clones of the SSD to the repaired or replaced drive | |
| if things go 100% awry. | |
| 2nd - mount SSD and set it up as overlay mount so the default boot automatically boots | |
| the "extroot"(we presume alle the dirs like <proc, sys, dev, tmp> exist then on the SSD) | |
| 3rd - create the mountpoints | |
| (run whilst system is running from SSD-overlay so both SSD and fitrw are accessible) | |
| # on SSD (system is running from here - these dirs live in SSD upper): | |
| mkdir -p /mnt/newroot | |
| mkdir -p /mnt/newroot/mnt/oldroot | |
| mkdir -p /mnt/newroot/proc | |
| mkdir -p /mnt/newroot/sys | |
| mkdir -p /mnt/newroot/dev | |
| mkdir -p /mnt/newroot/tmp | |
| # mount fitrw to /mnt/fallback_overlay: | |
| mkdir -p /mnt/fallback_overlay | |
| mount -t f2fs /dev/fitrw /mnt/fallback_overlay | |
| # on fitrw/upper (these dirs live in eMMC overlay - available after pivot_root): | |
| mkdir -p /mnt/fallback_overlay/upper/mnt/oldroot | |
| mkdir -p /mnt/fallback_overlay/upper/mnt/newroot | |
| 4th - create switch script: | |
| cat > /usr/sbin/switch_to_emmc_overlay.sh << 'EOF' | |
| #!/bin/sh | |
| logger -t emmc_fallback "SSD /overlay ist RO - schwenke auf fitrw" | |
| # guard: nicht doppelt ausfuehren | |
| [ -f /tmp/emmc_fallback_active ] && exit 0 | |
| touch /tmp/emmc_fallback_active | |
| # fitrw mounten falls noch nicht gemountet | |
| if ! mount | grep -q '/dev/fitrw.*fallback_overlay'; then | |
| mount -t f2fs /dev/fitrw /mnt/fallback_overlay || { | |
| logger -t emmc_fallback "FEHLER: fitrw mount fehlgeschlagen" | |
| exit 1 | |
| } | |
| fi | |
| # neues overlayfs bauen: fit0/rom als lower, fitrw als upper | |
| mount -t overlay overlay \ | |
| -o lowerdir=/rom,upperdir=/mnt/fallback_overlay/upper,workdir=/mnt/fallback_overlay/work \ | |
| /mnt/newroot || { | |
| logger -t emmc_fallback "FEHLER: overlay mount fehlgeschlagen" | |
| exit 1 | |
| } | |
| # bind mounts | |
| mount --bind /proc /mnt/newroot/proc | |
| mount --bind /sys /mnt/newroot/sys | |
| mount --bind /dev /mnt/newroot/dev | |
| mount --bind /tmp /mnt/newroot/tmp | |
| logger -t emmc_fallback "pivot_root auf fitrw-overlay" | |
| cd /mnt/newroot | |
| pivot_root . mnt/oldroot | |
| # SSD unmounten (lazy - laufende Prozesse blockieren nicht) | |
| umount -l /mnt/oldroot/overlay | |
| umount -l /mnt/oldroot/mnt/sda1 2>/dev/null | |
| logger -t emmc_fallback "starte init neu auf eMMC-overlay" | |
| exec /sbin/init | |
| EOF | |
| 5th - make it executable: | |
| chmod +x /usr/sbin/switch_to_emmc_overlay.sh | |
| 6th - create watchdog init script: | |
| cat > /etc/init.d/ssd_watchdog << 'EOF' | |
| #!/bin/sh /etc/rc.common | |
| START=15 | |
| STOP=99 | |
| USE_PROCD=0 | |
| boot() { | |
| # guard: nicht doppelt ausfuehren | |
| [ -f /tmp/emmc_fallback_active ] && return 0 | |
| # warten bis mounts stabil | |
| sleep 5 | |
| # pruefe ob SSD ueberhaupt als overlay gemountet ist | |
| if ! grep -q '^/dev/sda1 /overlay' /proc/mounts; then | |
| logger -t ssd_watchdog "SSD nicht als overlay gemountet - kein Eingriff" | |
| return 0 | |
| fi | |
| # pruefe ob SSD RO ist | |
| if grep '^/dev/sda1 /overlay' /proc/mounts | grep -q '\bro\b'; then | |
| logger -t ssd_watchdog "SSD /overlay ist RO - starte Umschaltung auf fitrw" | |
| /usr/sbin/switch_to_emmc_overlay.sh | |
| else | |
| logger -t ssd_watchdog "SSD /overlay ist RW - alles normal" | |
| fi | |
| } | |
| EOF | |
| 7th - make it executable and enable it: | |
| chmod +x /etc/init.d/ssd_watchdog | |
| /etc/init.d/ssd_watchdog enable | |
| BOOT FLOW NACH IMPLEMENTATION | |
| ============================== | |
| NORMALFALL (SSD OK): | |
| U-Boot | |
| -> lädt Production FIT-Image von mmcblk0p3 | |
| -> fit0 (3.5M squashfs) wird als /rom gemountet | |
| -> fitrw (438.7M f2fs) wird als rootfs_data erkannt | |
| Kernel startet | |
| preinit -> mount_extroot -> SSD (sda1) wird als /overlay gemountet (RW) | |
| procd/init startet | |
| START=15: ssd_watchdog prueft -> SSD ist RW -> kein Eingriff | |
| System laeuft normal von SSD-overlay | |
| FEHLERFALL (SSD RO): | |
| U-Boot | |
| -> wie oben | |
| Kernel startet | |
| preinit -> mount_extroot -> SSD wird als /overlay gemountet aber RO | |
| procd/init startet | |
| START=15: ssd_watchdog prueft -> findet 'ro' in /proc/mounts fuer /overlay | |
| -> ruft switch_to_emmc_overlay.sh auf: | |
| -> /dev/fitrw wird auf /mnt/fallback_overlay gemountet | |
| -> neues overlayfs: lowerdir=/rom + upperdir=fitrw/upper -> /mnt/newroot | |
| -> bind mounts: proc, sys, dev, tmp | |
| -> pivot_root: /mnt/newroot wird neues / | |
| -> SSD wird lazy unmounted | |
| -> exec /sbin/init | |
| System laeuft vollstaendig von eMMC-overlay (fitrw) | |
| SSD ist abgehaengt | |
| btrfs-tools verfuegbar um SSD zu reparieren/klonen/reformatieren | |
| LAYOUT REFERENZ | |
| =============== | |
| fit0 (259:0, 3.5M, RO) -> /rom squashfs rootfs (lower layer) | |
| fitrw (259:1, 438.7M, RW) -> /mnt/fallback_overlay f2fs eMMC overlay (upper layer) | |
| sda1 (8:1, 119.2G, RW) -> /overlay btrfs SSD extroot overlay (normal operation) | |
| mmcblk0p3 (448M) = FIT-Image Container | |
| |- fit0 (3.5M) virtuelles RO block-device -> squashfs | |
| \- fitrw (438.7M) virtuelles RW block-device -> f2fs (LABEL=rootfs_data) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment