Mise à jour de systèmes embarqués pour BSP Linux

Table des matières

Comment mettre à jour un système embarqué sous Linux

Lorsque vous mettez à jour un système embarqué, vous devez pouvoir confirmer l’origine de la mise à jour, garantir son intégrité et être prêt à faire face à des coupures de courant, des pertes de réseau, etc.

Voici quelques pistes pour vous guider dans la conception de votre solution de mise à jour.

Pourquoi mettre à jour vos systèmes embarqués ?

Que ce soit pour le faire évoluer, par l’ajout de nouvelles fonctionnalités ou la correction de bugs mais également pour en assurer la sécurité la mise à jour d’un systèmes embarqué est incontournable et doit faire partie de votre Board Support Package (BSP) dès l’origine.

En effet, pas une semaine ne passe sans que des failles ne soient découvertes dans les logiciels que nous utilisons. Ces failles peuvent être utilisées pour détourner des objets connectés, elles peuvent être ensuite exploitées pour lancer des attaques de dénis de service (ddos), perturber le fonctionnement d’une organisation ou voler des informations personnelles.

 

Prévoir un dispositif de mise à jour du logiciel embarqué dès sa conception

Pour toutes ces raisons, il est indispensable de prévoir un dispositif de mise à jour du logiciel embarqué, le « firmware » des objets connectés.

Lorsqu’un ordinateur effectue des mises à jour, il demande à l’utilisateur de ne pas éteindre le système. C’est nécessaire car de nombreux fichiers sont copiés pendant le processus. En cas d’extinction impromptue, des fichiers et programmes peuvent êtres corrompus et les dépendances de logiciels dans un état incohérent. Pour un PC les conséquences sont limitées : l’utilisateur doit effectuer des opérations (pénibles) de maintenance manuelle.

Le même cas de figure sur un objet connecté peut l’empêcher définitivement de fonctionner. Sachant qu’il n’est pas acceptable de demander à un utilisateur d’effectuer des opérations de maintenance manuelle, l’objet doit retourner en maintenance chez le fabricant ou être mis au rebus. Il existe plusieurs approches pour éviter cette situation.

Comment mettre à jour votre système embarqué sous Linux ?

La mise à jour des systèmes embarqués peut être complexe. Vous devez être sûr que le système peut gérer les problèmes potentiels, tels que les coupures de courant et les défaillances du réseau. Il doit également être possible de revenir sur les modifications si quelque chose ne se déroule pas comme prévu pendant une mise à jour.

Mises à jour A/B : une option fiable

Une solution couramment utilisée consiste à appliquer des mises à jour dites « A/B »: la mise à jour est appliquée dans un environnement séparé, habituellement sur une autre partition puis, lorsque tout est prêt, le système redémarre dans son nouvel environnement.

En cas de mise à jour incomplète, on continue d’utiliser le système stable et la mise à jour peut être effectuée plus tard. De plus, il devient possible de réutiliser l’ancien système dans le cas où le nouveau présente des instabilités.

Prenons l’exemple d’un objet connecté fonctionnant sous Linux. Il comprend les éléments suivants :

  • Un bootloader (souvent u-boot) 
  • Le noyau Linux (kernel)
  • Les applications systèmes (rootfs)
  • Les données utilisateurs

Le noyau et le rootfs sont contenus sur des partitions qui sont doublées.

Mises à jour A/B : description pas à pas

Une banque est un ensemble de partitions et de fichiers qui fonctionnent ensemble.

Au commencement, le système utilise la banque A, le fichier de mise à jour est présent sur la partition de data. Généralement, il est téléchargé depuis un serveur sécurisé, vérifié, puis décompressé.

Kernel A et Rootfs A sont actifs
Le bootloader se sert de la banque A pour démarrer le système.
MAJ-SE-LINUX-2

Le logiciel en charge de la mise à jour applique la nouvelle version sur la banque B : il copie le nouveau kernel sur la partition Kernel B, puis flashe l’image de la partition roots (le système) sur rootfs B.

En cas d’extinction impromptue du système, la banque A reste utilisable à tout instant.

Ensuite, la partition est vérifiée. Si elle n’est pas corrompue, la configuration du bootloader est changée afin qu’il pointe sur la banque B. Dans le cas contraire, la mise à jour sera retentée plus tard.

Enfin, le système redémarre et le bootloader utilise la banque B. Si le système est fonctionnel, la banque B est « validée », sinon il est toujours possible de revenir sur la banque A.

Cette mise à jour est effectuée depuis la banque A vers la B. La prochaine se fera depuis la B vers la A.

Le bootloader sélectionne le kernel et le rootfs B.
État final de la table des partitions après la mise à jour.

Mise à jour A/B : outils

Swupdate est un excellent outil de mise à jour pour les systèmes embarqués utilisant Linux. Il permet de décrire une archive contenant des fichiers, des images et des scripts. Cette description est utilisée lors de la mise à jour pour appliquer les changements nécessaires. Swupdate est disponible sous licence libre et dispose d’une documentation complète.

Mise à jour de système embarqués Linux : approches alternatives

Pour finir, si cette méthode de mise à jour A/B a fait ses preuves, elle présente l’inconvénient d’obliger la mise à jour de partitions complètes. Ainsi, des solutions comme les packages snap ou bien OSTree peuvent présenter un complément intéressant.

Vous avez aimé l'article ? Partagez-le !

Articles connexes

Besoin d'aide pour votre projet Linux embarqué?

Tux_Linux_développement