2008-11-13 13 views
9

Embedded Linux-basierte Geräte erfordern oft einen Mechanismus zum Aktualisieren von Anwendungen und Systemdateien. Zum Beispiel kann ein (nicht vernetztes) Laborgerät mit einem USB-Anschluss Softwareupdates von einem USB-Stick erhalten.Empfohlene Techniken für die sichere Aktualisierung von Embedded Linux im Feld

Es wäre eine einfache Angelegenheit, ein Skript auszuführen, um Dateien in den internen Flash-Speicher des Geräts zu kopieren. Es besteht jedoch die Gefahr, dass das Gerät mitten im Update Strom verliert und ein Baustein wird.

Die Situation für Anwendungsdateien ist ein wenig einfacher, da es Platz gibt, das Anwendungsverzeichnis zu duplizieren, eine Kopie zu aktualisieren und schnell alte und neue Verzeichnisse auszutauschen, wodurch das Fehlerfenster minimiert wird.

Dinge sind für Kernel und Systemdateien dikier, da sie über das Dateisystem verteilt sind.

Wir haben Hard- und Softlinks im Dateisystem verwendet, um kritische Dateien zu identifizieren. Wir verwenden Hashes für Dateien und Archive, um die Dateiintegrität zu überprüfen. Wir haben überlegt, einen Notfall-Ramf im Kernel zu verwenden, um einen Fallback bereitzustellen, wenn das Starten des aktualisierten Dateisystems fehlschlägt.

Was sind Ihre Ansätze für diese Anforderung?

+0

Bitte beachten Sie meine Antwort für diese Frage: http://StackOverflow.com/Questions/5167226/linux-based-firmware-how-to-implement-a-good-way- to-update? lq = 1 – Patrick

Antwort

1

Ich würde mit dem gleichen Ansatz wie mit den Anwendungsdateien gehen: Machen Sie für die kritischen Dateien und vervollständigen eigene Partition, Link zu ihnen, und duplizieren Sie die Partition. In allen Ihrer Init sollten Sie zuerst prüfen, ob die Links alle auf die gleiche Partition zeigen, wenn nicht, setzen Sie sie zurück (auf die Partition mit den Dateien mit dem neuesten Datum einer bestimmten Datei). Wenn Sie aktualisieren möchten, kopieren Sie einfach alles auf die neue Partition, und wenn alles in Ordnung ist (crcs ok), führen Sie eine Schleife über die Dateien aus und stellen Sie für jeden die Verbindung von einem Dateisystem zum anderen ein.

Auf diese Weise sollten Ihre kritischen Dateien immer in gutem Zustand sein.

Szenarien:

  1. aktualisieren, während nicht-Dateien auf neue Partition zu kopieren

    kein Problem, weil die Links noch zeigen die alten Arbeits diejenigen.

  2. -Update fehlschlägt, während die Verknüpfung

    Kein Problem, da alle neuen Dateien gültig sind und bereits kopiert (sonst die relink Schritt haben Anfang würde nicht), Setup überprüfen ist richtig diese

2

Wenn Sie die Zuverlässigkeit sicherstellen müssen, können Sie zwei Flash-Partitionen (oder sogar Chips) haben, eine mit der aktuellen Arbeitskonfiguration und eine mit der neuen Konfiguration. Verwenden Sie dann einen Hardware-Watchdog, der das Gerät zurücksetzt und die aktive Boot-Flash-Partition in die Konfiguration "letzte bekannte Konfiguration" schaltet.

+0

Das ist ein toller Vorschlag, aber nehmen wir an ;-) um der Diskussion willen, dass die Hardware mit einem Flash-Gerät und ohne Watchdog eingefroren ist. –

2

mindestens zwei Partitionen .Ich würde 4

  • Boot

  • alternatives Boot

  • Programmdatensicherung vorschlagen

  • Programm flüchtige Daten

Verwenden gräbt Ausweich Boote Alternative zu booten wenn der Start fehlschlägt.

Wenn die Aktualisierung fehlschlägt, funktioniert die Alternative.

Aktualisieren Sie NIEMALS den Bootloader.

Wenn die Datenpartition getoastet wird, formatieren Sie sie neu und kopieren Sie sie über die Sicherungsdatenpartition.

Jetzt können Sie nicht fehlschlagen, es sei denn die Flash-Disk stirbt. Wenn Sie COTS-Hardware verwenden, und Hauptplatte war sagen, Compact Flash, könnten Sie ein physisch isoliertes Backup auf sagen, ein wenig USB-Stick.

0

IMHO jede Aktualisierung, die nicht atomar ist, kann das System brechen oder die Prüfung auf Konsistenz ziemlich schwierig machen. Ich stimme zu, dass das Aktualisieren des Bootloaders vermieden werden muss, da er nicht sicher ist. Im Allgemeinen möchte ein Hersteller ein Update von Firmware x.x.x auf Version y.y.y, ohne sich darum zu kümmern, ob der Kernel und/oder eine einzelne Datei aktualisiert wurde. Das Aktualisieren einzelner Dateien kann für den Dienst zu einem Albtraum werden, da es sehr schwierig ist zu verstehen, was auf der Hardware des Kunden läuft. Vielleicht mischen Sie einen Doppelkopie-Ansatz (Anwendung ist redundant) mit einem Einzelkopie-Ansatz. Ich denke, dass das nicht viel hilft, weil die Integrität des Systems durch die schwache Komponente in der Kette erfolgt. Wenn eine Aktualisierung des Root-Dateisystems fehlschlägt, ist es nicht wichtig, dass die Anwendung dupliziert wird.

Ein Dual-Copy-Ansatz kann ein Update ohne Außerbetriebnahme garantieren, wenn Sie dies benötigen. Aber es erfordert eine Menge Ressourcen, weil alle Komponenten dupliziert werden müssen. Persönlich verwende ich einen Fallback-Ansatz, bei dem ein kleines rootfs im RAM gestartet wird, wenn die Hauptanwendung fehlschlägt oder wenn die letzte Aktualisierung nicht erfolgreich war. Dieses Fallback-System, das automatisch vom Bootloader gestartet wird, wenn etwas schief geht, aktualisiert das System von einem USB-Stift (wenn ein lokales Update erforderlich ist).

Ich habe noch nie ein OSS-Projekt über diese Probleme gefunden und ich habe vor kurzem ein neues angefangen, basierend auf meinen früheren Erfahrungen. Ich habe mehrere Produkte und mein Kunde ist damit zufrieden.

Vielleicht können Sie einen Blick darauf werfen. Sie können Quellen für "swupdate" (den Namen des Projekts) unter github.com/sbabic/swupdate finden.

Stefano

0

Ich denke, was Sie versuchen, hier zu erreichen, wird die Unteilbarkeit des Update-Prozesses. Atomarität ist kritisch für eingebettete Geräte, einer der Gründe, die hervorgehoben werden, ist der Leistungsverlust; aber es könnte andere wie Hardware-/Netzwerkprobleme geben.Eine Definition, die ich für die Unteilbarkeit im Rahmen des Updates verwenden ist:

  • Ein Update immer entweder vollständig abgeschlossen ist, oder gar nicht
  • Keine Software-Komponente neben dem Updater jemals sieht ein halbe Update
installiert

Für Embedded Linux gibt es mehrere Softwarekomponenten, die Sie aktualisieren und verschiedene Designs auswählen können; Es gibt ein Papier dazu hier: https://mender.io/user/pages/04.resources/_white-papers/Software%20Updates.pdf