Ich habe gerade ne Menge zu dem UniFi-AC sysupgrade Bug quergelesen und meine ein bisschen was verstanden zu haben. Vielleicht hilft es dem ein oder anderen:
Die UniFi-AC Geräte setzen auf einen Flip-Flop-Flash. Daher kommen auch kernel0 und kernel1.
Bei jeden Stock-Upgrade wird das Update in den inaktiven Flash geschrieben und beim Reboot der Flash gewechselt. Bei Fehlern wird der Flash einfach wieder zurück geflipt. Auf diese Weise wird immer eine funktionierende Firmware vorhanden. Die Auswahl wird über die bs-Partition getroffen.
OpenWrt's sysupgrade macht (noch) keinen Gebrauch von dieser Methode, die ja auch stark geräteabhängig ist.
Letztlich beschreibt das sysupgrade immer nur den kernel0 Part und liest von dort.
Nun kann es den Fall geben (bspw): Neues Gerät wird mit neuer Firmware ohne mtd ausgeliefert [bs=0]. Es wird ein Downgrade auf eine Version mit mtd ausgeführt [Stock-(Up)grade -> bs=1]. Wir flashen auf kernel0 und kernel1 ein OpenWrt Image [bs=1]. Wir booten von kernel1. Alles läuft. Die Kernel-Module in beiden Partitionen sind kompatibel. sysupgrade! kernel0 wird beschrieben, kernel1 bleibt. Wir booten von kernel1. Kaputt. Kernel Module in kernel0 und kernel1 sind inkompatibel.
Das Fallbeispiel basiert auf Vermutungen.
Punkt ist, dass wohl alles gut ist, wenn unmittelbar vor dem flashen von OpenWrt [bs=0] ist. Es wird dann immer kernel0 beschrieben beim sysupgrade und auch von da gebootet. kernel1 gammelt einfach herum.
Setzen kann man das mit folgendem Befehl:
dd if=/dev/zero bs=1 count=1 of=/dev/mtdN
Wobei N die Partitionsnummer von bs ist. Die findet ihr mit folgendem Befehl:
cat /proc/mtd
Vielleicht mag unser Herr und Meister der Shellscripte, Dr. lrnzo :-P, mal schauen, ob man das in einen Einzeiler verwursteln kann, der sowohl in der Stock-Firmware, als auch bei uns ausführbar ist?
Wichtig ist allerdings beim ersten flashen trotzdem beide (kernel0 und kernel1) zu beschreiben, da der Bootloader(?) immer eine von Ubiquiti signierte Firmware bevorzugt startet. Dementsprechend müssen beide Flash-Speicher mit unsignierten Firmwares beschrieben werden.
In OpenWrt wurde die bs-Parition beschreibbar gemacht [1], sodass man diesen Fix auch nachträglich anwenden kann. Ich weiß nicht, ob diese Änderung bei uns schon enthalten ist.
Ansonsten hänge ich nochmal den Link zum OpenWrt Bugreport [2] und zum Bugreport in Gluon [3] an.
[1] https://github.com/lede-project/source/commit/f17173f5a36999f070a2ccbde2953d...
[2] https://bugs.openwrt.org/index.php?do=details&task_id=662
[3] https://github.com/freifunk-gluon/gluon/issues/1301