Skip to content

Instantly share code, notes, and snippets.

@patarok
Last active April 11, 2026 12:44
Show Gist options
  • Select an option

  • Save patarok/0eec18f714011e4c5d842436e0bb21b6 to your computer and use it in GitHub Desktop.

Select an option

Save patarok/0eec18f714011e4c5d842436e0bb21b6 to your computer and use it in GitHub Desktop.
OpenWRT -- Fallback to preconfigured emmc if SSD fails
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
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